C# 如何根据文件夹分割文件路径

C# 如何根据文件夹分割文件路径,c#,C#,例如,我有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.xm

例如,我有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

我认为正确地做这件事相当复杂

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.writeAllines重载来接受IEnumerable

,因此您可以以非常简单的方式进行如下枚举:

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;
        }

    }
}
要从原始文件中获取单独的行,可以使用


实例:

到目前为止,您尝试了什么?至少有一个错误:test1\abc\.n.cs不在第二个文件中可能重复的ToList是无用的。Split返回一个数组。删除它您必须更改。计数->长度。非常好的使用方法。注意:-@xanatos谢谢。在上一次迭代之后,我忘记了整理。