Найдите самые низкие подпапки и застегните их - PullRequest
2 голосов
/ 13 апреля 2011

Шаблоны Visual Studio имеют следующую структуру папок:

/ProjectTemplatesCache
    /CSharp
        /Windows
            /1033
                /ClassLibrary.zip -- the lowest subfolder
                    /Properties
                /WindowsService.zip -- the lowest subfolder
            /1042
    /VisualBasic

Я хочу начать с корневой папки, перейти к нижним подпапкам и сжать каждую из них в отдельный архив.

Использование Windows Batch или C #.

Как застегнуть - не важно. Просто будьте в состоянии выбрать каждого отдельно / выполнить команду против каждого.

Есть идеи?

Ответы [ 4 ]

4 голосов
/ 13 апреля 2011

C # 4.0:

var leafsDirs = Directory
    .EnumerateDirectories(Directory.GetCurrentDirectory(), "*", SearchOption.AllDirectories)
    .Where(sub => !Directory.EnumerateDirectories(sub).Any());

leafsDirs.ToList().ForEach(Console.WriteLine);

Посмотрите на ICSharpZip , чтобы выполнить фактическое архивирование

Обновление

После предложения @ khachik мои критерии должны быть di.Name.EndsWith (". Zip", StringComparison.OrdinalIgnoreCase)

Хорошо, просто смешивая условие с Where()

, поскольку папка шаблона может содержать некоторые подпапки, например, Веб-приложение ASP.NET MVC

вы всегда можете предоставить Func<DirectoryInfo, bool>, чтобы решить, какие каталоги должны быть BeZipped

1 голос
/ 13 апреля 2011

Итак, вы хотите найти все подкаталоги, которые в свою очередь не имеют подкаталогов?

var root = new DirectoryInfo(startPath);
var lowestSubFolders =
    root.EnumerateDirectories("*", SearchOption.AllDirectories)
        .Where(di => di.EnumerateDirectories().Count() == 0);

Конечно, будут проблемы, если есть подкаталоги, к которым у текущего пользователя нет доступа, и тому подобное, но у меня возникает ощущение, что этот код предназначен для некоторого вспомогательного инструмента, который будет работать в контролируемой среде.

1 голос
/ 13 апреля 2011

Этот код ниже рекурсивно проходит через дерево каталогов.Вы должны иметь возможность использовать его в качестве основы для своего кода:

void WalkDirectoryTree(System.IO.DirectoryInfo root)
{
    System.IO.FileInfo[] files = null;
    System.IO.DirectoryInfo[] subDirs = null;


    // First, process all the files directly under this folder
    try
    {
        files = root.GetFiles("*.*");
    }
    // This is thrown if even one of the files requires permissions greater
    // than the application provides.
    catch (UnauthorizedAccessException e)
    {
    }
    catch (System.IO.DirectoryNotFoundException e)
    {
    }

    if (files != null)
    {
      foreach (System.IO.FileInfo fi in files)
      {

      }

      // Now find all the subdirectories under this directory.
      subDirs = root.GetDirectories();


      foreach (System.IO.DirectoryInfo dirInfo in subDirs)
      {
        // Resursive call for each subdirectory.
        WalkDirectoryTree(dirInfo);
      }
    }
}

Вы можете просто вернуть bool, если больше нет каталогов, которые нужно закрыть, а затем сжать все файлы.

1 голос
/ 13 апреля 2011

Если вы используете C #, то:

... и если вы действительно хотите un zip, топопробуйте Распаковать файлы программно в .net

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