我需要创建zip存档,其中应该只包含具有特定扩展名的文件,但我需要保存原始目录的结构。
例如,我有一个具有以下结构的目录:
dir\
sub_dir1\
1.exe
sub_dir_2\
1.txt
1.exe
1.txt
1.bat
我需要获得具有以下结构的存档(仅限.exe和.bat文件):
dir\
sub_dir1\
1.exe
sub_dir_2\
1.exe
1.bat
我知道如何通过Directory.GetFiles方法找到这些文件:
var ext = new List<string> {".exe", ".bat"};
var myFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
.Where(s => ext.Any(e => s.EndsWith(e));
但我不知道如何保存档案馆的结构。
我如何实现这种行为?
答案 0 :(得分:2)
您可以从所有子目录中获取扩展名为.exe和.bat的所有文件,如:
IList<FileInfo> info = null;
DirectoryInfo dirInfo = new DirectoryInfo(path);
info = dirInfo
.GetFiles("*.*", SearchOption.AllDirectories)
.Where( f => f.Extension
.Equals(".exe", StringComparison.CurrentCultureIgnoreCase)
|| f.Extension
.Equals(".bat", StringComparison.CurrentCultureIgnoreCase)
)
.ToList()
;
然后根据此FileInfo列表,您可以创建zip和文件夹结构。您可以找到fileinfo详细信息Here
答案 1 :(得分:1)
System.IO.Directory.GetFiles("C:\\temp", "*.exe", SearchOption.AllDirectories);
将返回一个包含完整文件路径的数组,如:
[C:\temp\dir1\app1.exe]
[C:\temp\dir2\subdir1\app2.exe]
[C:\temp\dir3\subdir2\subdir3\app3.exe]
因此,您不会将这些文件放在带有ZipArchive.CreateEntry的zip容器中,因为此方法将在zip中创建相同的目录结构。但是,您应该在开头删除C:\
。
答案 2 :(得分:1)
我相信这个非常好tutorial会帮助你做到这一点。
如果要在目标zip中保留空文件夹,可能必须使用ZipArchive.CreateEntry
方法。在本演示中,作者仅使用ZipArchive. CreateEntryFromFile
方法从文件路径归档文件。
答案 3 :(得分:0)
@Didgeridoo说:DotNetZip。但DotNetZip让你更具表现力。例如:
string cwd = Environment.CurrentDirectory ;
try
{
Environment.CurrentDirectory = @"c:\root\of\directory\tree\to\be\zipped" ;
using ( ZipFile zipfile = new ZipFile() )
{
zipfile.AddSelectedFiles( "name = *.bat OR name = *.exe" , true ) ;
zipfile.Save( @"c:\foo\bar\my-archive.zip") ;
}
}
finally
{
Environment.CurrentDirectory = cwd ;
}
编辑注: DotNetZip曾经住在Codeplex。 Codeplex已关闭。旧档案仍为available at Codeplex。看起来代码已迁移到Github: