C# 正在检查文件是否正在使用而未使用try-catch?

C# 正在检查文件是否正在使用而未使用try-catch?,c#,.net,file,exception,file-access,C#,.net,File,Exception,File Access,是否有一种方法可以检查一个文件是否正在使用或未被其他进程打开,而不只是尝试打开它并捕获异常?没有服务方法来测试这样的事情吗?即使有,也不会对您有多大好处,因为您仍然需要捕获异常,以便处理在初始检查和实际尝试打开/访问文件之间文件变得不可用的争用情况 我想不出对初步防守检查有什么明显的优势。这只会导致不必要的代码重复 如果有这样一个IsFileAccessible函数,它可能会被实现为一个巨大的try/catch块,试图打开文件,捕获失败并返回结果 我是否可以测试文件是否可以在不尝试打开的情况下打

是否有一种方法可以检查一个文件是否正在使用或未被其他进程打开,而不只是尝试打开它并捕获异常?没有服务方法来测试这样的事情吗?

即使有,也不会对您有多大好处,因为您仍然需要捕获异常,以便处理在初始检查和实际尝试打开/访问文件之间文件变得不可用的争用情况

我想不出对初步防守检查有什么明显的优势。这只会导致不必要的代码重复

如果有这样一个
IsFileAccessible
函数,它可能会被实现为一个巨大的try/catch块,试图打开文件,捕获失败并返回结果

我是否可以测试文件是否可以在不尝试打开的情况下打开 打开它


net framework与下面的Windows API一样,不提供此类功能。如果您想知道文件是否可以打开,您需要尝试打开它并检查失败。

避免尝试捕获(但意味着尝试打开)的有趣方法是or函数:

处理WINAPI创建文件(…)

如果函数成功,则返回值是指定文件、设备、命名管道或邮件槽的打开句柄

如果函数失败,则返回值无效。要获取扩展错误信息,请调用


BOOL WINAPI锁文件(…)

如果函数成功,则返回值为非零 (对)

如果函数失败,则返回值为零(FALSE)。得到 扩展错误信息,请致电

这将锁定指定的文件以供调用进程独占访问,并在失败时将错误信息写入线程的最后一个错误,该错误可以使用函数检索


在unlockFile和OpenFile之间,仍然可以想象另一个进程可以锁定文件,但是可以通过将文件锁定到需要打开的时刻来最小化这段时间。

您可以在.net 4.5中实现这一点,但它包含大量开销

那么,你为什么想知道?以后还要打开文件吗?然后,您可以跳过检查并直接尝试,因为您无论如何都可能获得一场比赛。@οο掼掼掼掼掼掼掼掼掼掼掼掼掼掼掼,无论如何,我希望有这样一种方法,而不是将catch语句作为计划的艺术来实施。可能的重复不是重复,这里的重点是尝试通过try-catch,而不是一般的尝试,如果可能或不可能。如果Hal的C答案(不是标记为答案的答案)与David的链接中您需要的答案相对应,这里有一个.NET P/Invoke IsFileInUse等价物:@CodyGray Thnx用于应答,但这是否与检查文件的访问控制相同,在我访问之前,可以在这两个文件之间进行更改?但我有这个选择,可以在不需要遇到catch语句的情况下请求这些访问控制,它仍然可以发生,但这不会成为我计划的一部分。你是对的。但是,尽管您最终无法避免检查异常,但有一个函数可以在不必打开文件的情况下检查异常,这可能还是很有趣的。一些有用的工具确实提供了这些信息,并且它们不是基于try/catch代码的。@SimonMourier不使用try/catch就很容易做到这一点。只要调用
CreateFile
@DavidHeffernan-好的,那么你为什么不给出一个答案呢?不管你是否捕捉到一个异常。关键是,要真正知道是否可以打开一个文件,唯一的方法就是尝试打开它。在发明异常之前(仍然使用不支持异常的语言),
OpenFile
函数(或等效函数)只返回一个错误代码,指示成功或特定的错误条件:
FileNotFound
FileInUse
未经授权的数据访问
,等等@Two问问自己hFile来自哪里?你的权利!我以CreateFile结束,虽然它不会引发异常并启用readbale返回值,但它仍然试图打开文件,这正是我和其他人一直告诉你的。碰巧的是,打开文件的.net机制发出异常失败的信号。Win32机制通过返回值发出错误信号。从根本上说,它最终也是一样的。@davidheffernanya有些人需要走很长的路才能理解它,谢谢。但是,nt.net能不能让所有正在运行的进程检查是否有进程锁定了文件,并提供这样的文件功能呢??我遗漏了什么吗?@TwoMore也许操作系统可以做到这一点(尽管像David说的那样,它没有),但正如我在回答中所解释的,如果它做到了,它将不会起到有用的作用。类似这样的代码:if(FileExists(file)){OpenFile(file);}基本上被破坏了,因为它不能处理调用FileExists()OpenFile()之间文件丢失的情况。因此,您不妨尝试打开该文件并处理由此产生的任何错误(无论是异常还是返回代码)。我的回答讨论了例外情况,因为您对问题应用了标记。