代码之家  ›  专栏  ›  技术社区  ›  Dhaust

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

c#
  •  21
  • Dhaust  · 技术社区  · 14 年前

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

    system.io.file.exists存在 似乎只接受一个没有重载的参数来搜索子目录。

    我可以用Linq和 system.io.directory.getfiles文件 使用 搜索选项.alldirectories 超载,但这似乎有点重。

    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 回复  |  直到 7 年前
        1
  •  38
  •   Community Jaime Torres    7 年前

    如果要查找单个特定文件名,请使用 *.* 的确是个笨手笨脚的人。试试这个:

    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 . 我不知道这是不是有意的。

    如果你想知道多场比赛,你不应该使用 FirstOrDefault() 当然。你到底想做什么还不清楚,这使得你很难给出更具体的建议。

    注意在.NET 4中还有 Directory.EnumerateFiles 这对你来说可能更好,也可能不更好。我非常怀疑当你搜索一个特定的文件(而不是 全部的 目录和子目录中的文件),但至少值得了解。编辑:如注释所述, can make a difference if you don't have permission to see all the files in a directory .

        2
  •  6
  •   Andrew Hanlon    8 年前

    另一种选择是自己编写搜索函数,其中一个应该有效:

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

    第一个方法仍然提取所有的目录名,当有许多子目录但文件接近顶部时,速度会变慢。

    第二个是递归的,在“最坏情况”的情况下,它会变慢,但当有许多嵌套的子目录,但文件在顶级目录中时,它会变快。

        3
  •  1
  •   Kavit Trivedi    11 年前

    要检查任何特定目录中是否存在文件,请执行以下操作 注意:“uploadedfiles”是文件夹的名称。

    文件.exists(server.mappath(“uploadedfiles/”)

    享受编码

        4
  •  0
  •   caligari    14 年前

    它是一个 递归搜索 在文件系统上。在codeproject中有一些函数示例:

        5
  •  0
  •   Ash    11 年前

    这是一个递归搜索函数,一旦找到指定的文件,该函数就会立即中断。请注意,参数应指定为文件名(例如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;
        }