检查文件/目录是否存在:有更好的方法吗?
我发现自己经常这样做只是为了确保文件名不被使用。有更好的办法吗?
Directory.Exists(name) || File.Exists(name)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我发现自己经常这样做只是为了确保文件名不被使用。有更好的办法吗?
Directory.Exists(name) || File.Exists(name)
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(11)
当然 :)
Sure :)
请注意,您使用 Exists() 来检查正在使用的文件或目录名称这一事实会受到竞争条件的影响。
例如,在您的 Exists() 测试通过后的任何时候,在您的代码到达您创建文件的位置之前,某些东西可能已经创建了具有该名称的文件。
(我假设这是文件已经存在的特殊情况)。
更可靠的方法是简单地打开文件并指定适当的 FileShare 参数。
示例:
因此,简单地处理失败时的 IOException 可能会导致更简单的代码,不易出现竞争条件,因为现在:
FileMode.CreateNew
将导致抛出IOException
FileShare.None
,在您关闭该文件之前,没有其他进程可以访问该文件。不幸的是,在没有一些丑陋的 P/Invoke 的情况下,不可能检查文件当前是否正在使用,并且不抛出异常:
而且这种快速检查也容易出现竞争条件,除非您返回从中获取文件句柄,并将其传递给相关的 FileStream 构造函数。
Note that the fact that you are using Exists() to check for file or directory name in use is subject to race conditions.
At any point after your Exists() test has passed, something could have created a file with that name before your code reaches the point where you create a file, for example.
(I'm assuming it is an exceptional condition for the file to already exist).
It is more reliable to simply to open the file, specifying an appropriate FileShare parameter.
Example:
So simply handling the IOException on failure may result in simpler code less prone to race conditions, because now:
FileMode.CreateNew
will cause anIOException
to be thrownFileShare.None
, no other process can access the file until you close it.Unfortunately, it is not possible to check whether a file is currently in use, and not throw an exception, without some ugly P/Invoke:
And this fast check is also prone to race conditions, unless you return the file handle from it, and pass that to the relevant
FileStream
constructor.我认为这是唯一的方法。我通常有一个“FileManager”类,它具有封装 I/O 方法的静态方法,包括您指定的方法,然后在所有应用程序中使用该“FileManager”作为库。
I think that's the only way. I generally have a "FileManager" class which have static methods encapsulating I/O methods including the ones you indicated and then use that "FileManager" across all the applications as a library.
您可以使用以下功能:
You can use following function:
我检查这一点的方法是使用 FileSystemInfo,这是我的代码:
My way of checking this is using the FileSystemInfo, here is my code:
以下行有效(.NET8),但接受的解决方案可能具有更好的性能(如果这在这里很重要)
The following line works (.NET8), but the accepted solution might have better performance (if that matters here)
从 .NET 7 开始,可以使用 Path.Exsist
https://learn.microsoft.com/en-us/dotnet/api/system.io.path.exists?view=net-8.0
Since .NET 7 it's possible to use Path.Exsist
https://learn.microsoft.com/en-us/dotnet/api/system.io.path.exists?view=net-8.0
检查文件是否存在的另一种方法。
Another way to check if file exist.
检查 FileAttributes 是否 == -1 怎么样?
How about checking whether FileAttributes == -1?
检查目录是否存在
在C#中使用File.exists方法检查文件是否存在。
首先检查当前目录中是否存在该文件。
然后检查目录中是否存在该文件
Check if a directory Exists
Use the File.exists method in C# to check if a file exits in C# or not.
Firstly, check whether the file is present in the current directory.
After that check whether the file exist in a directory or not