在C#中,有没有一种通过文件名查找文件的方法?

4

目前我们在C#应用程序中使用绝对路径或相对路径来查找文件。如果文件位于当前工作目录或其中一个“路径”下,是否有一种方法可以仅通过文件名找到该文件?

使用绝对路径不好,使用相对路径也不够好,因为我们可能会通过重命名或移动项目文件夹来更改项目结构。如果我们的代码可以自动搜索当前工作目录、其子文件夹和系统路径,那将更加灵活。

谢谢!


2
如果在当前目录下有多个匹配的文件会发生什么?在搜索系统路径时(如果在当前目录下未找到),您会只使用第一个匹配吗? - Steve Townsend
是的,先搜索当前目录,然后搜索系统路径,总是返回第一个找到的。.Net没有现成可用的代码吗? - 5YrsLaterDBA
不是单一的方法 - 但您应该能够结合下面的答案来实现此操作,即1)在当前目录下查找匹配项,2)如果在1)中没有找到匹配项,则扫描系统路径。对于1),我认为您不需要自己进行递归 - .Net已经有了EnumerateFiles来扫描子树以查找匹配的文件。虽然在2)中您可能需要破解系统路径并迭代其成员。 - Steve Townsend
我已经尝试在下面为您提供我认为您正在尝试做的事情的答案。 - Steve Townsend
5个回答

3
您可以轻松地构建一个递归函数来为您完成此操作。查看System.IO下的Directory.GetDirectories和Directory.GetFiles两个方法。

8
MSDN上有一个示例可以帮助你准确地完成这个操作:http://msdn.microsoft.com/en-us/library/bb513869.aspx。 - Richard Cook

1

您可以针对每个要搜索文件的根目录调用Directory.GetFiles。参数searchOption允许您指定搜索操作是在所有子目录中查找还是仅在指定的目录中查找。例如:

public string GetFileName(string[] folders,string fileName) {
    string[] filePaths;
    foreach(var folder in folders) {
        filePaths=Directory.GetFiles(folder,fileName,SearchOption.AllDirectories)
        if (filePaths.Lenght>0)
            return filePaths[0];
    }  
}

1

试试这个:

Directory.EnumerateFiles(pathInWhichToSearch, fileNameToFind, SearchOption.AllDirectories);

而且,你需要使用:

using System.IO;

在你的班级之上。

这将搜索pathInWhichToSearch的所有子目录,查找名称为fileNameToFind的文件(它也可以是模式,如*.txt),并将结果作为IEnumerable<string>返回,其中包含找到的文件的完整路径。


你正在使用.NET 4吗?我的.NET 3.5中没有EnumerateFiles。 - 5YrsLaterDBA

1

试试这个:

string target = "yourFilenameToMatch";
string current = Directory.GetCurrentDirectory();

// 1. check subtree from current directory
matches=Directory.GetFiles(current, target, SearchOption.AllDirectories);
if (matches.Length>0)
    return matches[0];

// 2. check system path
string systemPath = Environment.GetEnvironmentVariable("PATH");
char[] split = new char[] {";"};
foreach (string nextDir in systemPath.Split(split))
{
    if (File.Exists(nextDir + '\\' + target)
    {
        return nextDir;
    }
}

return String.Empty;

对我来说,“SYSTEMROOT”解析为C:\ Windows。看起来你是想获取“PATH”环境变量,是吗? - Chris Nielsen

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接