@@ -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