Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitdbdef88

Browse files
Fix switching transacted streams
1 parentfb281a4 commitdbdef88

File tree

3 files changed

+44
-14
lines changed

3 files changed

+44
-14
lines changed

‎OpenMcdf.Tests/RootStorageTests.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,4 +174,37 @@ public void SwitchFile(Version version, int subStorageCount)
174174
try{File.Delete(fileName);}catch{}
175175
}
176176
}
177+
178+
[TestMethod]
179+
[DataRow(Version.V3,0)]
180+
[DataRow(Version.V3,1)]
181+
[DataRow(Version.V3,2)]
182+
[DataRow(Version.V3,4)]// Required 2 sectors including root
183+
[DataRow(Version.V4,0)]
184+
[DataRow(Version.V4,1)]
185+
[DataRow(Version.V4,2)]
186+
[DataRow(Version.V4,32)]// Required 2 sectors including root
187+
publicvoidSwitchTransactedStream(Versionversion,intsubStorageCount)
188+
{
189+
usingMemoryStreamoriginalMemoryStream=new();
190+
usingMemoryStreamswitchedMemoryStream=new();
191+
192+
using(varrootStorage=RootStorage.Create(originalMemoryStream,version,StorageModeFlags.Transacted|StorageModeFlags.LeaveOpen))
193+
{
194+
for(inti=0;i<subStorageCount;i++)
195+
rootStorage.CreateStorage($"Test{i}");
196+
197+
rootStorage.SwitchTo(switchedMemoryStream);
198+
rootStorage.Commit();
199+
}
200+
201+
using(varrootStorage=RootStorage.Open(switchedMemoryStream))
202+
{
203+
IEnumerable<EntryInfo>entries=rootStorage.EnumerateEntries();
204+
Assert.AreEqual(subStorageCount,entries.Count());
205+
206+
for(inti=0;i<subStorageCount;i++)
207+
rootStorage.OpenStorage($"Test{i}");
208+
}
209+
}
177210
}

‎OpenMcdf/RootContext.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ internal sealed class RootContext : ContextBase, IDisposable
2626

2727
publicStreamBaseStream{get;}
2828

29+
publicStreamStream{get;}
30+
2931
publicCfbBinaryReaderReader{get;}
3032

3133
publicCfbBinaryWriterWriter
@@ -104,17 +106,20 @@ public RootContext(RootContextSite rootContextSite, Stream stream, Version versi
104106
DirectoryEntriesPerSector=SectorSize/DirectoryEntry.Length;
105107
Length=stream.Length;
106108

107-
StreamactualStream=stream;
108109
if(contextFlags.HasFlag(IOContextFlags.Transacted))
109110
{
110111
StreamoverlayStream=streamisMemoryStream?newMemoryStream():File.Create(Path.GetTempFileName());
111112
transactedStream=newTransactedStream(ContextSite,stream,overlayStream);
112-
actualStream=newBufferedStream(transactedStream,SectorSize);
113+
Stream=newBufferedStream(transactedStream,SectorSize);
114+
}
115+
else
116+
{
117+
Stream=stream;
113118
}
114119

115-
Reader=new(actualStream);
120+
Reader=new(Stream);
116121
if(stream.CanWrite)
117-
writer=new(actualStream);
122+
writer=new(Stream);
118123

119124
Fat=new(ContextSite);
120125
DirectoryEntries=new(ContextSite);

‎OpenMcdf/RootStorage.cs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public static RootStorage Create(Stream stream, Version version = Version.V3, St
7878
returnnewRootStorage(rootContextSite,flags);
7979
}
8080

81-
publicstaticRootStorageCreateInMemory(Versionversion=Version.V3)=>Create(newMemoryStream(),version);
81+
publicstaticRootStorageCreateInMemory(Versionversion=Version.V3,StorageModeFlagsflags=StorageModeFlags.None)=>Create(newMemoryStream(),version,flags);
8282

8383
publicstaticRootStorageOpen(stringfileName,FileModemode,StorageModeFlagsflags=StorageModeFlags.None)
8484
{
@@ -205,15 +205,7 @@ public void Revert()
205205
privatevoidSwitchToCore(Streamstream,boolallowLeaveOpen)
206206
{
207207
Flush();
208-
209-
stream.SetLength(Context.BaseStream.Length);
210-
211-
stream.Position=0;
212-
Context.BaseStream.Position=0;
213-
214-
Context.BaseStream.CopyTo(stream);
215-
stream.Position=0;
216-
208+
Context.Stream.CopyAllTo(stream);
217209
Context.Dispose();
218210

219211
IOContextFlagscontextFlags=ToIOContextFlags(storageModeFlags);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp