Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法在C#中仅通过文件名来查找文件?_C#_.net_.net 3.5 - Fatal编程技术网

有没有办法在C#中仅通过文件名来查找文件?

有没有办法在C#中仅通过文件名来查找文件?,c#,.net,.net-3.5,C#,.net,.net 3.5,我们现在使用absolut路径或relatvie路径在C#应用程序中查找文件。如果文件位于currect工作目录下或某个“路径”下,是否有方法仅通过其名称查找该文件 使用绝对路径不够好,使用相对路径不够好,因为我们可能会通过重命名或移动项目文件夹来更改项目结构。如果我们的代码能够自动搜索当前的工作目录、其子文件夹和搜索系统路径,那将更加灵活 谢谢,您可以轻松构建一个递归函数来完成这项工作。查看Directory.GetDirectories和Directory.GetFiles,在System.

我们现在使用absolut路径或relatvie路径在C#应用程序中查找文件。如果文件位于currect工作目录下或某个“路径”下,是否有方法仅通过其名称查找该文件

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


谢谢,

您可以轻松构建一个递归函数来完成这项工作。查看Directory.GetDirectories和Directory.GetFiles,在System.IO下都可以使用

Path.GetDirectoryName(Application.ExecutablePath)

示例代码:

然后,您可以使用递归从那里搜索文件夹。这是一篇关于递归搜索文件的好文章:

您可以调用要在其中搜索文件的每个根文件夹。参数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];
    }  
}
试试这个:

Directory.EnumerateFiles(pathInWhichToSearch, fileNameToFind, SearchOption.AllDirectories);
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;
而且,您需要使用:

using System.IO;
在你的班上

这将在搜索路径的所有子目录中搜索名为
fileNameToFind
(它也可以是一种模式,类似于
*.txt
)的文件,并将结果返回为
IEnumerable
,其中包含找到的文件的完整路径。

尝试以下操作:

Directory.EnumerateFiles(pathInWhichToSearch, fileNameToFind, SearchOption.AllDirectories);
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;

MSDN上有一个示例向您展示了如何做到这一点:如果当前目录下有多个匹配文件,会发生什么情况?在搜索系统路径(如果在当前目录下未找到)时,是否只使用第一个匹配项?是的,首先搜索当前目录,然后搜索系统路径,始终返回找到的第一个。Net没有可用的现有代码?没有单一的方法-但您应该能够将下面的答案结合起来实现这一点,即1)在当前下查找匹配项,2)在1)中没有匹配项时扫描系统路径。对于1),我看不出您需要自己进行递归-.Net已经有枚举文件来扫描子树以查找匹配的文件。不过,您可能需要破解系统路径并在2)中迭代其成员。我已尝试为下面我认为您正在尝试的操作提供答案。您使用的是.net 4吗?我的.net 3.5中没有枚举文件。对我来说,“SYSTEMROOT”解析为C:\Windows。看起来您的意思是获取“PATH”环境变量,而不是?