目前我们在C#应用程序中使用绝对路径或相对路径来查找文件。如果文件位于当前工作目录或其中一个“路径”下,是否有一种方法可以仅通过文件名找到该文件?
使用绝对路径不好,使用相对路径也不够好,因为我们可能会通过重命名或移动项目文件夹来更改项目结构。如果我们的代码可以自动搜索当前工作目录、其子文件夹和系统路径,那将更加灵活。
谢谢!
目前我们在C#应用程序中使用绝对路径或相对路径来查找文件。如果文件位于当前工作目录或其中一个“路径”下,是否有一种方法可以仅通过文件名找到该文件?
使用绝对路径不好,使用相对路径也不够好,因为我们可能会通过重命名或移动项目文件夹来更改项目结构。如果我们的代码可以自动搜索当前工作目录、其子文件夹和系统路径,那将更加灵活。
谢谢!
您可以针对每个要搜索文件的根目录调用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];
}
}
试试这个:
Directory.EnumerateFiles(pathInWhichToSearch, fileNameToFind, SearchOption.AllDirectories);
而且,你需要使用:
using System.IO;
在你的班级之上。
这将搜索pathInWhichToSearch
的所有子目录,查找名称为fileNameToFind
的文件(它也可以是模式,如*.txt
),并将结果作为IEnumerable<string>
返回,其中包含找到的文件的完整路径。
试试这个:
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;
你可以使用以下代码获取exe文件所在的目录
Path.GetDirectoryName(Application.ExecutablePath);
示例代码:http://www.csharp-examples.net/get-application-directory/
然后,您可以使用递归从那里搜索文件夹。这是一篇关于递归搜索文件的好文章: http://support.microsoft.com/kb/303974