Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将目录结构导出到csv/xl文件_C#_.net_File Io_Directory - Fatal编程技术网

C# 将目录结构导出到csv/xl文件

C# 将目录结构导出到csv/xl文件,c#,.net,file-io,directory,C#,.net,File Io,Directory,我的要求是枚举所有目录和特定的.tif文件(位于结构的末尾)。样本是 A (path selected from UI) <has> B<has> and C<has> D <has> E F G H I

我的要求是枚举所有目录和特定的.tif文件(位于结构的末尾)。样本是

                         A (path selected from UI) <has>
                   B<has>             and              C<has>
       D <has>         E           F              G             H      I        J
K         L<has>
       1.tif   2.tif

类似于c和其他目录。

我不确定我是否理解您想要什么,但这里有一些东西可以帮助您开始

    private static void ProcessFolder(string folder, string level, string separator, StreamWriter output)
    {
        var dirs = Directory.GetDirectories(folder);
        foreach ( var d in dirs )
        {
            output.Write(level);
            output.WriteLine(d);
            ProcessFolder(d, level + separator, separator, output);
        }
        Console.WriteLine();
        var files = Directory.GetFiles(folder);
        foreach ( var f in files )
        {
            output.Write(level);
            output.WriteLine(f);
        }
    }
您必须自定义它以过滤TIFF或任何您想要的内容。您可以像这样调用此函数,它将生成文件

        using ( var output = new StreamWriter(@"C:\test.csv") )
        {
            ProcessFolder(@"c:\Program files", "", ";", output);
        }

双击生成的文件,Excel可能会打开:)

也许这会奏效(或者至少有一个好的起点):

如果您需要将它作为.csv文件用于Excel,则应改用此递归函数

private string GetStructureRecursiveForCsv(DirectoryInfo directoryInfo, string searchPattern, int level)
{
    var sb = new StringBuilder();

    var indentation = level;

    sb.Append(new String(';', indentation));
    sb.AppendLine(directoryInfo.Name);

    foreach (var directory in directoryInfo.GetDirectories())
    {
        sb.Append(GetStructureRecursiveForCsv(directory, searchPattern, level+1));
    }

    var groupedByExtension = directoryInfo.GetFiles(searchPattern)
                                          .GroupBy(file => file.Extension)
                                          .Select(group => new { Group = group.Key, Count = group.Count() });

    foreach (var entry in groupedByExtension)
    {
        sb.Append(new String(';', indentation));
        sb.AppendLine(String.Format(";{0};{1}", entry.Group, entry.Count));
    }

    return sb.ToString();
}

对不起,你的样品写得没有意义。您是否可以编辑它或更详细地描述您试图实现的目标?您是否尝试将某些目录结构导出为一棵树(作为列),其中包含叶上的.tif文件计数?递归函数或解析函数将非常适合这样做。灵感:在上面的xl码中,我们拥有你。啊作为根目录。它有一个目录20100714。20100714有多个目录,名称为abc.fof、def.fof、ghi.fof等。然后每个.fof目录都有xyz.bat和其他多个.bat目录。。每个.bat目录都有名为images的目录,其中包含图像。所以我想要的是如上所述导出指定的目录结构。
public void OutputStructureToFile(string outputFileName, string folder, string searchPattern)
{
    using (var file = new StreamWriter(outputFileName))
    {
        file.Write(GetStructure(new DirectoryInfo(folder), searchPattern));
    }
}

public string GetStructure(DirectoryInfo directoryInfo, string searchPattern)
{
    return GetStructureRecursive(directoryInfo, searchPattern, 0);
}

private string GetStructureRecursive(DirectoryInfo directoryInfo, string searchPattern, int level)
{
    var sb = new StringBuilder();

    var indentation = level * 5;

    sb.Append(new String(' ', indentation));
    sb.AppendLine(directoryInfo.Name);

    foreach (var directory in directoryInfo.GetDirectories())
    {
        sb.Append(GetStructureRecursive(directory, searchPattern, level+1));
    }

    var groupedByExtension = directoryInfo.GetFiles(searchPattern)
                                          .GroupBy(file => file.Extension)
                                          .Select(group => new { Group = group.Key, Count = group.Count() });

    foreach (var entry in groupedByExtension)
    {
        sb.Append(new String(' ', indentation));
        sb.AppendLine(String.Format("   {0,10} {1,3}", entry.Group, entry.Count));
    }

    return sb.ToString();
}
private string GetStructureRecursiveForCsv(DirectoryInfo directoryInfo, string searchPattern, int level)
{
    var sb = new StringBuilder();

    var indentation = level;

    sb.Append(new String(';', indentation));
    sb.AppendLine(directoryInfo.Name);

    foreach (var directory in directoryInfo.GetDirectories())
    {
        sb.Append(GetStructureRecursiveForCsv(directory, searchPattern, level+1));
    }

    var groupedByExtension = directoryInfo.GetFiles(searchPattern)
                                          .GroupBy(file => file.Extension)
                                          .Select(group => new { Group = group.Key, Count = group.Count() });

    foreach (var entry in groupedByExtension)
    {
        sb.Append(new String(';', indentation));
        sb.AppendLine(String.Format(";{0};{1}", entry.Group, entry.Count));
    }

    return sb.ToString();
}