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