2

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

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

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

使用 Windows 批处理或 C#。

如何压缩 - 没关系。只能分别选择每个/对每个执行命令。

有任何想法吗?

4

4 回答 4

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 app

您始终可以提供一个Func<DirectoryInfo, bool>来决定要压缩哪些目录

于 2011-04-13T09:54:08.583 回答
1

如果您使用的是 C#,那么:

...如果您真的想压缩,请尝试在 .net 中以编程方式解压缩文件

于 2011-04-13T09:43:46.937 回答
1

那么,您本质上是想找到所有没有子目录的子目录?

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

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

于 2011-04-13T09:46:47.440 回答
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);
      }
    }
}

如果没有更多目录可以关闭,您可以只返回一个布尔值,然后压缩所有文件。

于 2011-04-13T09:46:58.133 回答