C# 如何根据文件夹分割文件路径
例如,我有file1.txt,下面是该文件的内容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
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谢谢。在上一次迭代之后,我忘记了整理。