2015-09-07 49 views
2

我有一个文本文件,路径为不同的文本文件路径等。就像这样:迭代遍历目录并处理相对路径

C:\folder1\dirs1.txt: 
      folder2\dirs1.txt 
      folder2\dirs2.txt 
      folder3\dirs1.txt 

C:\folder1\folder2\dirs1.txt: 
      folder4\dirs1.txt 
      folder4\dirs2.txt  

我需要通过的所有文件进行迭代,并打印出来,很容易:

IEnumerable<string> ExtractAllPathsFromFile(string path) { ... } 

void PrintAllPaths(string root) 
{ 
     var paths = ExtractAllPathsFromFile(root); 

     foreach (path in paths) 
     { 
     Console.WriteLine(path); 
     if (File.Exists(path)) 
      PrintAllPaths(path); 
     } 
} 



PrintAllPaths(root:C:\folder1\dirs1.txt); 

但你可以看到的例子所有路径都是相对的(不是绝对的),和我需要想出如何在我的算法中处理它的想法。

+1

您可能需要指定与_relative_路径相关的初始目录。之后,使用你的解决方案,如'PrintAllPaths(Path.Combine(initialDirectory,path));'假设'initialDirectory'是你的根,'path'是你的相对路径。 – bashis

回答

3

使用Path.Combine()方法安全地连接多个路径。您可以使用Path.GetDirectoryName()方法获得C:\folder1\dirs1.txt的目录路径。会不会有这样的工作?

using System.IO; 

public static string[] ExtractPathsFromFile(string originalPath) 
{ 
    string[] newPaths = File.ReadAllLines(originalPath); 
    string[] modified = new string[newPaths.Length]; 
    for (int i = 0; i < newPaths.Length; i++) 
     modified[i] = Path.Combine(Path.GetDirectoryName(originalPath), newPaths[i].Trim()); 
    return modified; 
} 
+0

如果问题中的例子是正确的,我认为这不会起作用。在第二个示例中,读取的条目与文件的目录不相关,但与父目录('C:\ folder1 \ folder4 \ dirs1.txt'而不是'C:\ folder1 \ folder2 \ folder4 \ dirs1.txt')。 – Albireo

+0

从我的角度来看,如果文件'C:\ folder1 \ dirs1.txt'包含字符串'folder2 \ dirs1.txt',那么路径'C:\ folder1 \ folder2 \ dirs1.txt'应该从它派生。 OP在他的问题中声明这个文件存在,所以在这里发生了一个明确的路径隐藏。所以,在这条路上,你会发现一个新的文本文件,例如包含'folder4 \ dirs1.txt',所以应该从它派生一个新路径'C:\ folder1 \ folder2 \ folder4 \ dirs1.txt'(但可惜OP没有声明这是正确的文件名)。如果这是错误的,OP可以自由纠正我。 –

0

也许你的意思是这样的:

IEnumerable<string> ExtractAllPathsFromFile(string path) 
{ 
    var basePath = Path.GetDirectoryName(path); 
    return File.ReadAllLines(path).Select (f => Path.Combine(basePath, f.Trim())); 
} 
1

嗯,这样的事情?

String path = null; 

    var files = File 
    .ReadLines(@"C:\MyFiles.txt") 
    .Select(line => { 
     if (Path.IsPathRooted(line)) { 
     path = Path.GetDirectoryName(line); 

     return line; 
     } 
     else 
     return Path.Combine(path, line.Trim()); 
    }); 
... 

Console.WriteLine(String.Join(Environment.NewLine, files));