C# 如何以编程方式检测捕获我的文件的程序

C# 如何以编程方式检测捕获我的文件的程序,c#,winapi,.net-3.5,io,C#,Winapi,.net 3.5,Io,我的程序试图将一些数据写入文本文件。但是有时候这个文件可以被其他程序独占地打开 如何以编程方式检测哪个程序捕获了我的文件?我必须知道用户友好的程序名(这是我的第二个问题:)。当你试图打开文件时,你通过IOException检测到它。这在多任务操作系统上是一个必要的缺点,没有可靠的方法来实现File.IsLocked()方法。Windows没有用于它的API函数。因为如果这样一个函数返回false,另一个进程可能会中断程序并锁定文件。当你拿回cpu时,你会发现文件还是被锁定了。这叫做穿线比赛 因此

我的程序试图将一些数据写入文本文件。但是有时候这个文件可以被其他程序独占地打开


如何以编程方式检测哪个程序捕获了我的文件?我必须知道用户友好的程序名(这是我的第二个问题:)。

当你试图打开文件时,你通过IOException检测到它。这在多任务操作系统上是一个必要的缺点,没有可靠的方法来实现File.IsLocked()方法。Windows没有用于它的API函数。因为如果这样一个函数返回false,另一个进程可能会中断程序并锁定文件。当你拿回cpu时,你会发现文件还是被锁定了。这叫做穿线比赛

因此,使用FileStream构造函数打开该文件。如果要读取另一进程正在写入的文件,请传递FileShare.ReadWrite。您必须允许读写共享,另一个进程已经获得了写访问权。捕获可能出现的IOException,您必须“稍后”重试。告诉用户,她可能知道如何帮助您。就像关闭另一个程序


顺便说一句,Windows没有提供任何方法来找出锁定文件的其他进程。有这样的实用程序,比如SysInterals的Handle实用程序。它通过动态安装的设备驱动程序,在未记录的内部内核结构中爬行。您不想自己解决任何问题。

相关问题:这可能有助于了解openfiles()和/或此代码库()。我建议您运行其中一个命令行实用程序并分析输出以找出所需的信息。老实说,您应该说出您试图实现的目标-使用不同的解决方案可能比尝试解决此问题要好得多。@VinayC命令实用程序不是一个选项。:(文件是由同一用户在本地打开的。但多亏了伟大的信息。我也这么做了。我正在检测IOException…我希望有一种自然的方法来检测这一点。我知道这个工具:Mark Russinovich()的Windows Sysinternals。)