我们现在使用绝对路径或相关路径在我们的C#应用程序中查找文件。如果文件位于currect工作目录下或其中一个“路径”下,是否有方法通过文件名来查找文件?有没有办法在C#中通过它的名字找到文件?
使用绝对路径不好,使用相对路径不够好,因为我们可能通过重命名或移动项目文件夹来更改项目结构。如果我们的代码可以自动搜索当前工作目录,它的子文件夹和搜索系统路径,那将更加灵活。
谢谢,
我们现在使用绝对路径或相关路径在我们的C#应用程序中查找文件。如果文件位于currect工作目录下或其中一个“路径”下,是否有方法通过文件名来查找文件?有没有办法在C#中通过它的名字找到文件?
使用绝对路径不好,使用相对路径不够好,因为我们可能通过重命名或移动项目文件夹来更改项目结构。如果我们的代码可以自动搜索当前工作目录,它的子文件夹和搜索系统路径,那将更加灵活。
谢谢,
试试这个:
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”环境变量,而不是...? – 2012-08-14 21:09:52
是的,那看起来不错。 – 2012-08-16 12:31:35
您可以轻松地建立一个递归函数为您做到这一点。看看Directory.GetDirectories和Directory.GetFiles,都在System.IO
MSDN上有一个示例显示如何执行此操作:http://msdn.microsoft.com/en-us/library/bb513869.aspx – 2010-09-20 19:59:49
可以使用
Path.GetDirectoryName(Application.ExecutablePath);
示例代码得到exe文件的目录:http://www.csharp-examples.net/get-application-directory/
然后,你可以搜索从那里使用递归的文件夹。这是递归搜索文件的好文章: http://support.microsoft.com/kb/303974
对于要在其中搜索文件的每个根文件夹,您可以调用Directory.GetFiles。参数searchOption允许您指定搜索操作是查看所有子目录还是仅查找指定的目录。 E.g:对你的类的顶部
using System.IO;
:
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);
而且,你需要使用。
这个搜索的pathInWhichToSearch
所有子目录与名称fileNameToFind
文件(也可以是一个模式太 - 像*.txt
),并返回结果为IEnumerable<string>
与找到的文件的完整路径。
您使用的是.net 4吗?在.net 3.5中没有EnumerateFiles。 – 5YrsLaterDBA 2010-09-20 20:23:24
是的,它在.NET Framework 4.0中。 – 2010-09-20 20:25:55
如果当前目录下的一个以上的匹配文件,会发生什么?在搜索系统路径(如果在当前目录下没有找到),你会使用第一个匹配吗? – 2010-09-20 20:04:48
是的,搜索当前目录先是系统路径,总是返回第一个找到的。 .Net没有可用的现有代码? – 5YrsLaterDBA 2010-09-20 20:09:32
没有一种方法 - 但你应该能够结合下面的答案来实现这一点,因为1)在当前和2)扫描系统路径下找到匹配,如果1)中不匹配的话)。对于1),我没有看到你需要做自己的递归 - .Net已经有EnumerateFiles扫描匹配文件的子树。不过,您可能需要破解系统路径并在2)中重复其成员。 – 2010-09-20 20:14:03