【问题标题】:C# accessing locked filesC# 访问锁定的文件
【发布时间】:2011-07-13 11:50:47
【问题描述】:

我想通过 c# 访问一个文件,该文件是通过不同的程序创建和处理的。
目前我正在通过 Windows 资源管理器将文件复制到不同的位置,然后使用该副本。由于副本很大,我更愿意直接使用原始文件。有什么办法吗?
普通的 FileStream 不允许任何共享访问模式。我可以控制这两个程序,所以如果需要我也可以更改作者。

【问题讨论】:

  • FileStream 不允许任何共享访问模式是什么意思?有构造函数重载允许您指定:msdn.microsoft.com/en-us/library/5h0z48dh.aspx
  • 如果创建和处理文件的应用程序没有以共享访问权限打开它,您也无法打开它。

标签: c# file filelock


【解决方案1】:

您需要确保执行写入和读取的程序设置了正确的 FileShare,因此您需要将 FileShare.Read 传递给 FileStream 构造函数以进行程序写入:

new FileStream("C:/Users/phil/tmp.txt",FileMode.Create,FileAccess.Write,FileShare.Read)

您还需要确保为正在读取它的程序启用了 FileShare.ReadWrite:

new FileStream("C:/Users/phil/tmp.txt",FileMode.Open,FileAccess.Read,FileShare.ReadWrite)

这将导致 FileStream 构造函数在文件本身上放置正确的锁。

您可以在 msdn 上找到有关构造函数的更多信息:http://msdn.microsoft.com/en-us/library/5h0z48dh.aspx(还有其他也采用 FileShare 参数的重载)

【讨论】:

    【解决方案2】:

    您可以使用我的库从多个应用程序访问文件。

    您可以从 nuget 安装它:Install-Package Xabe.FileLock

    如果您想了解更多信息,请查看 https://github.com/tomaszzmuda/Xabe.FileLock

    ILock fileLock = new FileLock(file);
    if(fileLock.Acquire(TimeSpan.FromSeconds(15), true))
    {
        using(fileLock)
        {
            // file operations here
        }
    }
    

    fileLock.Acquire 方法只有在可以为该对象锁定文件独占时才会返回 true。 但是上传文件的应用程序也必须在文件锁定中进行。 如果对象不可访问,方法返回 false。

    所以如果你想使用它,你必须先安装这个应用程序和锁文件的包,然后再更改其中的数据,然后立即释放锁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      相关资源
      最近更新 更多