我使用文件流来访问文件(制作md5 ComputeHash)。如果我在此期间尝试重命名文件(在访问文件时失败)。到目前为止一切都那么好,但是当我在原始文件流关闭后尝试重新打开文件时,我得到了另一个进程中文件打开的信息。
代码:
using (Stream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
MD5 md5 = MD5.Create();
byte[] mymd5computed = md5.ComputeHash(fileStream);
......
}
Thread.Sleep(50);
Thread a = new Thread (()=>{(FileStream sourceStream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)){....} });
就像我说的那样,如果在计算MD5期间我尝试重命名文件,我会得到文件仍然被锁定的信息。
答案 0 :(得分:0)
当您关闭流时,文件上的锁定有时不会立即释放,因此您可以使用其他一些解决方案,等待再次访问该文件。其中一个解释如下:http://www.codeproject.com/Tips/164428/C-FileStream-Lock-How-to-wait-for-a-file-to-get-re。
回顾:
public static void Lock(string path, Action<FileStream> action) {
var autoResetEvent = new AutoResetEvent(false);
while(true)
{
try
{
using (var file = File.Open(path,
FileMode.OpenOrCreate,
FileAccess.ReadWrite,
FileShare.Write))
{
action(file);
break;
}
}
catch (IOException)
{
var fileSystemWatcher =
new FileSystemWatcher(Path.GetDirectoryName(path))
{
EnableRaisingEvents = true
};
fileSystemWatcher.Changed +=
(o, e) =>
{
if(Path.GetFullPath(e.FullPath) == Path.GetFullPath(path))
{
autoResetEvent.Set();
}
};
autoResetEvent.WaitOne();
}
}
}
样品使用:
Lock(@"c:\file",
(f) =>
{
try
{
f.Write(buf, 0, buf.Length);
}
catch(IOException ioe)
{
// handle IOException
}
});
希望它有所帮助! :)