【问题标题】:How to let Windows know that a file is "being used" by my application?如何让 Windows 知道我的应用程序正在“使用”文件?
【发布时间】:2013-03-06 08:14:37
【问题描述】:

我正在制作一个简单的 VB.net 应用程序,它基本上要求用户提供多个文件,稍后它将需要访问选定的文件并修改它们。

现在,我正在保存所选文件的完整路径,将来,应用程序将遍历每个路径,从该路径打开文件,并对其进行修改。

问题在于用户可以选择一个文件(因此保存完整路径),然后他们在我的应用程序修改它之前删除或移动该文件。

通常情况下,我会抛出“找不到文件”的错误,但我的印象是 Windows 有一个功能会禁止您删除/移动/重命名文件,因为“程序正在使用它” - 这是一个更适合我的应用程序的功能。

我对 VB.NET 不是很先进,但我想如果我使用我的应用程序“打开”一个文件(带有一些 IO 的东西),我之前提到的功能确实会触发并且用户将无法修改文件,因为它是由我的应用程序“打开”的。

但是,由于我唯一的愿望是“保留”文件,因此在我真的不需要(还)时实际打开它们似乎很浪费。有没有办法告诉 Windows 我需要一个完整的文件?

【问题讨论】:

    标签: windows vb.net winforms


    【解决方案1】:

    打开文件(指定所需的共享模式)是这样做的方法。

    我不认为打开多个文件真的有什么问题(而且对于移除可移动驱动器等情况,您仍然无法执行任何操作)。在过去,每个进程打开文件的数量有限制,但我不再有实际限制 - Pushing the Limits of Windows: Handles

    【讨论】:

      【解决方案2】:

      有一个简单的解决方案:以独占模式打开每个文件。 它应该是这样的:

      Sub test()
          Dim FS = System.IO.File.Open("path", IO.FileMode.Open, IO.FileAccess.ReadWrite, IO.FileShare.None)
      End Sub
      

      但请注意:您已经打开了一个文件句柄,如果您负责关闭文件的代码在没有终止应用程序的情况下失败,则应用程序文件仍将被锁定很长时间(直到应用程序关闭)。 您可以使用 using 子句或 try/catch/finally 子句 - 我对您的程序了解不多,无法推荐任何人。

      【讨论】:

      • +0:不确定您的后半部分 - 如果应用程序无论出于何种原因而终止,所有句柄都已关闭...不确定您要描述什么问题。
      • 我可能是错的:但手柄可能会在很长一段时间后关闭 - 这对用户来说看起来很奇怪。所以最好明确地关闭它们。另外:如果用户在没有关闭程序的情况下启动了多个操作,他也可能会遇到这个问题
      • 据我所知,一旦进程终止,句柄就会关闭。另一方面(这可能是你想说的)如果应用程序没有终止,但负责关闭文件的代码不能正常工作,文件将被锁定很长时间,直到应用程序终止。
      • 内联 cmets - 看看你是否接受更改。 (+1 没有看起来像句柄的语句可以在应用程序终止后保持打开状态)。
      猜你喜欢
      • 1970-01-01
      • 2013-01-04
      • 2021-05-31
      • 2015-01-07
      • 2020-05-15
      • 1970-01-01
      • 2021-04-22
      • 2012-08-14
      • 1970-01-01
      相关资源
      最近更新 更多