【问题标题】:Exporting diectory structure to csv/xl file将目录结构导出到 csv/excel 文件
【发布时间】:2011-03-17 15:42:37
【问题描述】:

我的要求是枚举所有目录和特定的 .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

在上面的目录中,A 有 B 和 C。命名为客户端。 B 有 D、E、F(如日期),D 有 K 和 L(家庭)。 因此,在检索 txt 或 excel 文件中的目录结构时需要您的帮助

B                  D  
                       K    0
                       L    2 (since there are two tif files)


                   E
                   F

与 c 和其他目录类似。

【问题讨论】:

  • 抱歉,您的示例在编写时没有任何意义。您能否对其进行编辑或更详细地描述您想要实现的目标?
  • 您是否尝试将某些目录结构导出为树(作为列),并在叶子上包含 .tif 文件的数量?递归或解析函数将非常适合。灵感:msdn.microsoft.com/en-us/library/wz42302f.aspx
  • 在上面的xl中,你我们有。 AH 作为根目录。它有一个目录 20100714。20100714 有多个目录,名称分别为 abc.fof、def.fof、ghi.fof 等。然后每个 .fof 目录都有 xyz.bat 和其他多个 .bat 目录。每个 .bat 目录都有名为 images 的目录,其中包含图像。所以我想要的是导出上述目录结构。

标签: c# .net file-io directory


【解决方案1】:

也许这样可以解决问题(或至少提供一个好的起点):

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

如果你需要它作为 .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();
}

【讨论】:

    【解决方案2】:

    我不确定我是否了解您想要什么,但这里有一些可以帮助您入门的东西

        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 可能会打开 :)

    【讨论】:

      猜你喜欢
      • 2019-04-12
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 2016-03-29
      相关资源
      最近更新 更多