我花了很多时间搞清楚如何做到这一点,但没有找到任何有用的解决方案。
这是我想要做的。我在我的应用程序中生成一个巨大的二进制文件。棘手的是,这个过程需要我偶尔关闭FileStream。 现在的问题是,偶尔其他应用程序(即我的病毒扫描程序)正在使用此文件未被锁定的短暂时刻,以锁定文件本身。或其他应用程序,如Dropbox等......
结果是,下次我需要打开文件流时,它会说它被另一个进程锁定。所有这些只是很少发生,但它发生时仍然很烦人。 即使我仍然获得文件访问权限,我仍然不希望dropbox上传此文件直到完成(可能需要几分钟)。
我需要的是手动锁定文件的可能性,以便我的应用程序仍可以在此文件上打开文件流,但在我再次手动解锁之前,其他任何应用程序都无法使用。
我用伪代码画出这样的东西:
File.Lock(filepath);
//... do something that opens and closes filestreams on this file
File.Unlock(filepath);
有办法做到这一点吗? “保持文件流打开”的解决方案无效。我明确地试图避免这种情况,所以请记住这一点。
答案 0 :(得分:7)
正如您自己注意到的,锁定文件的最佳方法是使用FileStream
打开句柄。您说,您的主FileStream会关闭,但您可以使用一个来模拟锁定。这是一个示例类,使用IDisposable,以便FileLock
对象本身就是锁,并且处理它会释放它:
public class FileLock : IDisposable
{
private FileStream _lock;
public FileLock(string path)
{
if (File.Exists(path))
{
_lock = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None);
IsLocked = true;
}
}
public bool IsLocked { get; set; }
public void Dispose()
{
if (_lock != null)
{
_lock.Dispose();
}
}
}
用法:
using (FileLock lock = new FileLock(filePath))
{
// Safe in the knowledge that the file is out of harm's way.
}