.net 如何检查文件是否存在,而不同时检查我是否获得了读取它的权限?

.net 如何检查文件是否存在,而不同时检查我是否获得了读取它的权限?,.net,.net,File.Exists和FileInfo.Exists不能在这种情况下使用,因为它们会检查文件是否存在以及权限级别是否足够 是否有一种简单的方法可以检查文件是否存在,而不考虑权限 问题的背景是一个常见的问题:询问用户是否真的要覆盖现有文件。您很少希望覆盖您不拥有的文件,对file.Exists的调用将忽略该情况,并将其与不存在的文件混淆。使用DirectoryInfo是否可以执行此操作 DirectoryInfo root = new DirectoryInfo("your_directory_

File.Exists和FileInfo.Exists不能在这种情况下使用,因为它们会检查文件是否存在以及权限级别是否足够

是否有一种简单的方法可以检查文件是否存在,而不考虑权限


问题的背景是一个常见的问题:询问用户是否真的要覆盖现有文件。您很少希望覆盖您不拥有的文件,对file.Exists的调用将忽略该情况,并将其与不存在的文件混淆。

使用DirectoryInfo是否可以执行此操作

DirectoryInfo root = new DirectoryInfo("your_directory_path");
FileInfo[] listfiles = root.GetFiles("*");
if (listfiles.Length > 0)
{
  //File exists
  foreach (FileInfo file in listfiles)
  {
      //
  }
}
else
{
 //
}

如果您没有特定目录的访问权限,则无法查看如何检查文件是否存在。但您可能可以检查是否有Magnus:对,但我考虑过这样一种情况,即您有目录的权限,但没有目录中的文件的权限。似乎file.Exists的MSDN文档是错误的。表示“如果调用方没有足够的权限读取指定的文件,则不会引发异常,并且无论路径是否存在,该方法都返回false。”。我刚刚在Windows 7 pro和File上进行了测试。对于我已拒绝自己读取权限的文件,Exists返回true。一些可能的改进:检查目录是否存在,否则代码可能引发
DirectoryNotFoundException
。出于性能原因,请使用
EnumerateFiles()
而不是
GetFiles()
。也许使用文件名作为
GetFiles
/
EnumerateFiles
中的模式可以提供更好的性能。我认为您不需要
if(length>0)
foreach
如果目录为空就什么也做不了。很好,但是不能使用
path
作为
EnumerateFiles()
的参数,而不是使用
Any()
?让操作系统进行搜索可能比在.Net进程中进行搜索更快,尤其是对于包含大量文件的目录。也许还应该捕获
SecurityException
,如果我理解正确,当进程没有列出目录内容的权限时,就会抛出该异常。最后,MSDN说,如果对文件的任何信息不感兴趣,而对文件名不感兴趣,静态
目录
类的速度会更快。@Joh捕获异常应该在调用堆栈的更高层进行,而不是使用此方法。
static bool FileExists(string path)
{
    var dirInfo = new DirectoryInfo(Path.GetDirectoryName(path));
    string file = Path.GetFileName(path);
    bool exists = (dirInfo.Exists && dirInfo.EnumerateFiles().Any(f => f.Name == file));
    return exists;
}