重命名文件和文件共享(文件流)

本文关键字:文件 文件共享 重命名 | 更新日期: 2023-09-27 18:18:00

我使用一个文件流来访问一个文件(创建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期间,我试图重命名文件,我得到的信息是文件仍然被锁定

重命名文件和文件共享(文件流)

当您关闭流时,文件上的锁有时不会立即释放,因此您可以使用其他一些解决方案来等待,直到您可以再次访问该文件。其中一个解释如下: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
                }
            });

希望有帮助!:)