在C#中,如何检查目录或其任何子目录中是否存在特定文件?
System.IO.File.Exists 似乎只接受一个没有重载的单个参数来搜索子目录。
我可以使用 SearchOption.AllDirectories 重载LINQ和 System.IO.Directory.GetFiles ,但这看起来有点沉重。
var MyList = from f in Directory.GetFiles(tempScanStorage, "foo.txt", SearchOption.AllDirectories)
where System.IO.Path.GetFileName(f).ToUpper().Contains(foo)
select f;
foreach (var x in MyList)
{
returnVal = x.ToString();
}
答案 0 :(得分:38)
如果您正在寻找一个特定的文件名,那么使用*.*
确实很重要。试试这个:
var file = Directory.GetFiles(tempScanStorage, foo, SearchOption.AllDirectories)
.FirstOrDefault();
if (file == null)
{
// Handle the file not being found
}
else
{
// The file variable has the *first* occurrence of that filename
}
请注意,这不是您当前查询所做的 - 因为如果您的foo只是bar
,您当前的查询会找到“xbary.txt”。我不知道这是否是故意的。
如果您想了解多个匹配项,当然不应该使用FirstOrDefault()
。目前尚不清楚你究竟要做什么,这使得很难给出更具体的建议。
请注意,在.NET 4中还有Directory.EnumerateFiles
,它可能会或可能不会对您有更好的效果。我非常怀疑当你搜索特定文件(而不是目录和子目录中的所有文件)时它会有所不同,但至少值得了解它。编辑:如评论中所述,can make a difference if you don't have permission to see all the files in a directory。
答案 1 :(得分:6)
另一种方法是自己编写搜索功能,其中一个应该可以工作:
private bool FileExists(string rootpath, string filename)
{
if(File.Exists(Path.Combine(rootpath, filename)))
return true;
foreach(string subDir in Directory.GetDirectories(rootpath, "*", SearchOption.AllDirectories))
{
if(File.Exists(Path.Combine(subDir, filename)))
return true;
}
return false;
}
private bool FileExistsRecursive(string rootPath, string filename)
{
if(File.Exists(Path.Combine(rootPath, filename)))
return true;
foreach (string subDir in Directory.GetDirectories(rootPath))
{
return FileExistsRecursive(subDir, filename);
}
return false;
}
第一种方法仍然会提取所有目录名称,并且当有多个子目录但文件接近顶部时会慢一些。
第二个是递归的,在“最坏情况”场景中会更慢,但是当有许多嵌套子目录但文件位于顶级目录时会更快。
答案 2 :(得分:1)
要检查任何特定目录中存在的文件,请执行以下操作 注意:“UploadedFiles”是文件夹的名称。
File.Exists(使用Server.Mappath( “UPLOADEDFILES /”))
享受编码
答案 3 :(得分:0)
这是文件系统上的递归搜索。您在CodeProject中有一些功能示例:
答案 4 :(得分:0)
这是一个递归搜索功能,一旦找到您指定的文件就会中断。请注意,参数应指定为fileName(例如testdb.bak)和目录(例如c:\ test)。
请注意,如果在具有大量子目录和文件的目录中执行此操作,这可能会非常慢。
private static bool CheckIfFileExists(string fileName, string directory) {
var exists = false;
var fileNameToCheck = Path.Combine(directory, fileName);
if (Directory.Exists(directory)) {
//check directory for file
exists = Directory.GetFiles(directory).Any(x => x.Equals(fileNameToCheck, StringComparison.OrdinalIgnoreCase));
//check subdirectories for file
if (!exists) {
foreach (var dir in Directory.GetDirectories(directory)) {
exists = CheckIfFileExists(fileName, dir);
if (exists) break;
}
}
}
return exists;
}