Visual Studio模板具有如下文件夹结构:
/ProjectTemplatesCache
/CSharp
/Windows
/1033
/ClassLibrary.zip -- the lowest subfolder
/Properties
/WindowsService.zip -- the lowest subfolder
/1042
/VisualBasic
我想从根文件夹开始,深入查看最低的子文件夹,并将每个子文件夹压缩到一个单独的存档。
使用Windows Batch或C#。
如何拉链 - 没关系。只需能够分别选择/执行每个命令。
有什么想法吗?
答案 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。