2017-02-16 78 views
-5

例如如何分割的文件路徑我已經通過閱讀上面一行文件中的行想創造另一個文件FILE1.TXT以下是文件基於文件夾

test1\abc\a.xml 
test1\abc\n.cs 
test1\HB\proc1\candidate1\rel1\spy\can.xml 
test1\HB\proc1\candidate1\rel1\spy\globals.xml 
test1\HB\proc1\candidate1\rel1\spy\mike.cs 

現在的內容..說文件2以下內容

test1\abc 
test1\abc\a.xml 
test1\abc\n.xml 
test1\HB 
test1\HB\proc1 
test1\HB\proc1\candidate1 
test1\HB\proc1\candidate1\rel1 
test1\HB\proc1\candidate1\rel1\spy 
test1\HB\proc1\candidate1\rel1\spy\can.xml 
test1\HB\proc1\candidate1\rel1\spy\globals.xml 
test1\HB\proc1\candidate1\rel1\spy\mike.cs 
+2

您到目前爲止嘗試了些什麼? –

+0

至少有一個錯誤:* test1 \ abc \ .n.cs *不在第二個文件中 – xanatos

+0

[文本文件:逐行讀取C#]的可能重複(http://stackoverflow.com/questions/ 21861505/text-file-line-by-line-c-sharp) –

回答

0

這是很複雜,這樣做是正確的,我想....

var filenames = File.ReadLines("source.txt"); 
var result = ExpandFilenames(filenames); 
File.WriteAllLines("dest.txt", result); 

,然後:

static IEnumerable<string> ExpandFilenames(IEnumerable<string> filenames) { 
    var alreadyDone = new HashSet<string>(); 

    foreach (string fileName in filenames) { 
     string directoryName = Path.GetDirectoryName(fileName); 

     // "Expand" the parent directories 
     var expandedDirectories = ExpandDirectories(directoryName, alreadyDone); 

     foreach (string dir in expandedDirectories) { 
      yield return dir; 
     } 

     yield return fileName; 
    } 
} 

// Recursive yield :-) I do know it is slow, but it is easy to write :-) 
static IEnumerable<string> ExpandDirectories(string directoryName, HashSet<string> alreadyDone) { 
    if (directoryName == string.Empty || alreadyDone.Contains(directoryName)) { 
     yield break; 
    } 

    // We "cheat": we use Path.GetDirectoryName to get the name of 
    // the "parent" directory 
    string directoryName2 = Path.GetDirectoryName(directoryName); 

    if (directoryName2 != null) { 
     var expandedDirectories = ExpandDirectories(directoryName2, alreadyDone); 

     foreach (string dir in expandedDirectories) { 
      yield return dir; 
     } 
    } 

    alreadyDone.Add(directoryName); 
    yield return directoryName; 
} 

注意,我會通過既作爲源和目的地的IEnumerable<>,我用的是File.ReadLines/File.WriteAllLines重載接受IEnumerable<>

1

所以,你可以在一個相當簡單的列舉這樣的方法:

public static IEnumerable<string> EnumerateAllPaths(string[] input) 
{ 
    var hs = new HashSet<string>(); 

    foreach(var s in input) 
    { 
     var parts = s.Split(new[]{@"\"},StringSplitOptions.None); 

     for(var i = 0;i<parts.Length;i++) 
     { 
      var section = String.Join(@"\", parts.Take(i+1)); 
      if(hs.Add(section)) 
       yield return section; 
     } 

    } 
} 

爲了讓您的原始文件中的各條線就可以使用ReadAllLines

現場示例:http://rextester.com/YBOGIH60970

+0

「ToList()」沒用。 'Split'返回一個數組。刪除它你必須改變'.Count' - >'.Length'。使用'.Take()'非常好主意:-) – xanatos

+0

@xanatos謝謝。在之前的迭代之後,我忘記了整理。 – Jamiec

相關問題