Skip to content

Commit fd3062a

Browse files
feat: added proper checking of access and share on file stream construction
1 parent cd2a151 commit fd3062a

File tree

1 file changed

+30
-1
lines changed

1 file changed

+30
-1
lines changed

src/TestableIO.System.IO.Abstractions.TestingHelpers/MockFileStream.cs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,41 @@ public MockFileStream(
102102
mockFileDataAccessor.AddFile(path, fileData);
103103
}
104104

105-
var fileHandlesEntry = mockFileDataAccessor.FileHandles.GetOrAdd(path, _ => new ConcurrentDictionary<Guid, (FileAccess access, FileShare share)>());
105+
var fileHandlesEntry = mockFileDataAccessor.FileHandles.GetOrAdd(
106+
path,
107+
_ => new ConcurrentDictionary<Guid, (FileAccess access, FileShare share)>());
108+
109+
var requiredShare = AccessToShare(access);
110+
foreach (var (existingAccess, existingShare) in fileHandlesEntry.Values)
111+
{
112+
var existingRequiredShare = AccessToShare(existingAccess);
113+
var existingBlocksNew = (existingShare & requiredShare) != requiredShare;
114+
var newBlocksExisting = (share & existingRequiredShare) != existingRequiredShare;
115+
if (existingBlocksNew || newBlocksExisting)
116+
{
117+
throw CommonExceptions.ProcessCannotAccessFileInUse(path);
118+
}
119+
}
120+
106121
fileHandlesEntry[guid] = (access, share);
107122
this.access = access;
108123
this.share = share;
109124
}
110125

126+
private static FileShare AccessToShare(FileAccess access)
127+
{
128+
var share = FileShare.None;
129+
if (access.HasFlag(FileAccess.Read))
130+
{
131+
share |= FileShare.Read;
132+
}
133+
if (access.HasFlag(FileAccess.Write))
134+
{
135+
share |= FileShare.Write;
136+
}
137+
return share;
138+
}
139+
111140
private static void ThrowIfInvalidModeAccess(FileMode mode, FileAccess access)
112141
{
113142
if (mode == FileMode.Append)

0 commit comments

Comments
 (0)