如何检查目录或其任何子目录中是否存在特定文件

时间:2010-10-22 06:32:33

标签: c#

在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();
}  

5 个答案:

答案 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;
    }