2010-09-20 62 views
4

我们现在使用绝对路径或相关路径在我们的C#应用​​程序中查找文件。如果文件位于currect工作目录下或其中一个“路径”下,是否有方法通过文件名来查找文件?有没有办法在C#中通过它的名字找到文件?

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

谢谢,

+2

如果当前目录下的一个以上的匹配文件,会发生什么?在搜索系统路径(如果在当前目录下没有找到),你会使用第一个匹配吗? – 2010-09-20 20:04:48

+0

是的,搜索当前目录先是系统路径,总是返回第一个找到的。 .Net没有可用的现有代码? – 5YrsLaterDBA 2010-09-20 20:09:32

+0

没有一种方法 - 但你应该能够结合下面的答案来实现这一点,因为1)在当前和2)扫描系统路径下找到匹配,如果1)中不匹配的话)。对于1),我没有看到你需要做自己的递归 - .Net已经有EnumerateFiles扫描匹配文件的子树。不过,您可能需要破解系统路径并在2)中重复其成员。 – 2010-09-20 20:14:03

回答

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; 
+0

对我来说,“SYSTEMROOT”解析为C:\ Windows。它看起来像你的意思是获得“PATH”环境变量,而不是...? – 2012-08-14 21:09:52

+0

是的,那看起来不错。 – 2012-08-16 12:31:35

3

您可以轻松地建立一个递归函数为您做到这一点。看看Directory.GetDirectories和Directory.GetFiles,都在System.IO

+8

MSDN上有一个示例显示如何执行此操作:http://msdn.microsoft.com/en-us/library/bb513869.aspx – 2010-09-20 19:59:49

1

对于要在其中搜索文件的每个根文件夹,您可以调用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]; 
    } 
} 
1

试试这个:

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

而且,你需要使用。

这个搜索的pathInWhichToSearch所有子目录与名称fileNameToFind文件(也可以是一个模式太 - 像*.txt),并返回结果为IEnumerable<string>与找到的文件的完整路径。

+0

您使用的是.net 4吗?在.net 3.5中没有EnumerateFiles。 – 5YrsLaterDBA 2010-09-20 20:23:24

+0

是的,它在.NET Framework 4.0中。 – 2010-09-20 20:25:55

相关问题