如何创建zip存档仅包含具有特定扩展名的文件

时间:2015-08-25 14:16:58

标签: c# .net zip

我需要创建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));

但我不知道如何保存档案馆的结构。

我如何实现这种行为?

4 个答案:

答案 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: