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