【问题标题】:How to manually Lock a file for other applications如何为其他应用程序手动锁定文件
【发布时间】:2012-11-05 12:02:55
【问题描述】:

我花了很长时间弄清楚如何做到这一点,但没有找到任何有用的解决方案。

这就是我想要做的。我正在我的应用程序中生成一个巨大的二进制文件。棘手的是,这个过程需要我偶尔关闭 FileStream。 现在的问题是,有时其他应用程序(即我的病毒扫描程序)会使用文件不再锁定的这一短暂时刻来锁定文件本身。或其他应用程序,如保管箱等...

结果是,下次我需要打开文件流时,它说它被另一个进程锁定了。所有这些都很少发生,但当它发生时仍然很烦人。 即使我仍然可以访问文件,我仍然不希望即保管箱在完成之前上传此文件(这可能需要几分钟)。

我需要的是手动锁定文件的可能性,以便我的应用程序仍然可以打开该文件上的文件流,但在我再次手动解锁之前,其他应用程序无法打开它。

我用伪代码描绘了这样的东西:

 File.Lock(filepath);

 //... do something that opens and closes filestreams on this file

 File.Unlock(filepath);

有没有办法做到这一点? “保持文件流打开”的解决方案无效。我明确地试图避免这种情况,所以请记住这一点。

【问题讨论】:

  • 我编辑了您的代码,以便更清楚您的期望。
  • 一句话:IsolatedStorageFile
  • 你能不能把它改成RO文件然后改回RW来编辑?
  • @avip:有趣但不是我想要的。由于当前的代码设计,保持流打开会更容易。我对 File.Lock(filepath); 之间的部分几乎没有影响
  • 请解释为什么您必须不时关闭流。你明确地试图避免它很好,只是让我们知道为什么。

标签: c# .net file io file-locking


【解决方案1】:

正如您自己所注意到的,锁定文件的最佳方法是使用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. 
}

【讨论】:

    猜你喜欢
    • 2016-05-18
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    相关资源
    最近更新 更多