Экспорт структуры диектории в файл csv / xl - PullRequest
0 голосов
/ 18 июля 2010

Мое требование - перечислить все каталоги и конкретные файлы .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

Similary для c и других каталогов.

Ответы [ 2 ]

0 голосов
/ 19 июля 2010

Может быть, это поможет (или даст хотя бы хорошую начальную точку):

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

И если вам это нужно для Excel в виде файла .csv, вместо этого следует использовать эту рекурсивную функцию

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();
}
0 голосов
/ 19 июля 2010

Я не уверен, что понимаю, чего вы хотите, но вот кое-что, с чего можно начать

    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, вероятно, откроется:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...