找到最低的子文件夹并压缩它们

时间:2011-04-13 09:39:48

标签: c# recursion batch-file visual-studio-templates

Visual Studio模板具有如下文件夹结构:

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

我想从根文件夹开始,深入查看最低的子文件夹,并将每个子文件夹压缩到一个单独的存档。

使用Windows Batch或C#。

如何拉链 - 没关系。只需能够分别选择/执行每个命令。

有什么想法吗?

4 个答案:

答案 0 :(得分:4)

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 Web应用程序

你总是可以提供一个Func<DirectoryInfo, bool>来决定哪些目录是BeZip

答案 1 :(得分:1)

如果您正在使用C#,那么:

...如果您确实想取消拉链,请尝试Unzip files programmatically in .net

答案 2 :(得分:1)

那么,您基本上想要查找所有子目录,而这些子目录又没有子目录?

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

当然,如果有当前用户无法访问的子目录等会出现问题,但我觉得这段代码是为了一些方便的工具,可以在受控环境中运行。

答案 3 :(得分:1)

以下代码以递归方式通过目录树。您应该能够将其用作代码的基础:

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。