将目录添加到现有的 .zip 文件
Adding a directory to an existing .zip file
首先,我想说的是,我已经尝试寻找解决此问题的方法,但还没有找到无需解压缩、添加我的文件夹然后再次压缩的方法。我没有使用任何第三方库。如果可能的话,我想使用 system.io.compression 来做到这一点......如果没有,我会使用 dotnetzip 作为我最后的选择。
长话短说;博士。
我希望能够将其中包含文件的目录添加到已创建的 zip 文件中。这可能使用 System.Io.Compression
库吗?
编辑:
using (FileStream zipToOpen = new FileStream(zipfile, FileMode.Open))
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
{
ZipArchiveEntry readmeEntry = archive.CreateEntry("testFolder/");
}
}
因此,使用此代码我可以在其中创建一个文件夹,但其中没有任何文件。我现在的问题是,我是否必须再次 运行 这段代码才能将我的源文件夹中的每个文件都放到 zip 内的这个文件夹中,或者是否有更好的方法?
感谢@stuartd,我设法找到了一种方法来做到这一点。他向我指出了这个答案,我找到了一种将其实现到我的代码中的方法,该代码从所述目录的源位置创建目录,其中包含文件。
代码如下:
using (FileStream zipToOpen = new FileStream("c:\MyDestination\test.zip", FileMode.Open))
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
{
ZipArchiveEntry readmeEntry;
DirectoryInfo d = new DirectoryInfo(c:\MySourceFolder);
FileInfo[] Files = d.GetFiles("*");
foreach (FileInfo file in Files)
{
readmeEntry = archive.CreateEntryFromFile("c:\MySourceFolder"+ "\" + file.Name, "MySourceFolder" + "/" + file.Name);
}
}
}
所以我所做的是转到我的源目录并遍历那里的所有文件,并使用 foreach 循环将它们添加到 zip 文件中的目标文件夹。
您还可以通过以下代码获取源目录名称:
string sourcepath = "C:\MySourceFolder";
int ind = sourcepath.LastIndexOf("\") + 1;
string folderName = sourcepath.Substring(ind, folder.Length - ind);
可以这样执行:
var targetDir = @"D:\test";
var zipFile = @"D:\test.zip";
using (ZipArchive zipArchive = ZipFile.Open(zipFile, ZipArchiveMode.Read))
zipArchive.AddDirectory(targetDir, "test");
public static class ExtensionMethods;
{
public static void AddDirectory(this ZipArchive zip, string targetDir, string subDir = null, CompressionLevel compressionLevel = CompressionLevel.Optimal)
{
var ogrDir = targetDir.Replace("/", "\");
if (!ogrDir.EndsWith("\"))
ogrDir = ogrDir + "\";
if (subDir == null)
subDir = "";
else
{
subDir = subDir.Replace("/", "\");
if (subDir.StartsWith("\"))
subDir = subDir.Remove(0, 1);
if (!subDir.EndsWith("\"))
subDir = subDir + "\";
}
Action<string> AddDirectoryAndSubs = null;
AddDirectoryAndSubs = delegate (string _targetDir)
{
string[] files = Directory.GetFiles(_targetDir);
foreach (string file in files)
{
var fileInfo = new FileInfo(file);
zip.CreateEntryFromFile(fileInfo.FullName, subDir + (fileInfo.Directory.ToString() + "\").Replace(ogrDir, "") + fileInfo.Name, compressionLevel);
}
string[] dirs = Directory.GetDirectories(_targetDir);
foreach (string dir in dirs)
AddDirectoryAndSubs(dir);
};
AddDirectoryAndSubs(targetDir);
}
}
此代码已准备好在 C# 4.5 + 中使用 System.IO.Compression
引用(并在 using
子句中),这是对先前答案的轻微改进,因为它将工作封装在一个函数。
public static void AddDirToZip(string source, string targetzip)
{
using (FileStream zipToOpen = new FileStream(targetzip, FileMode.Open))
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
{
ZipArchiveEntry readmeEntry;
DirectoryInfo d = new DirectoryInfo(source);
FileInfo[] Files = d.GetFiles("*");
foreach (FileInfo file in Files)
{
readmeEntry = archive.CreateEntryFromFile(file.FullName, d.Name + "/" + file.Name);
}
}
}
}
首先,我想说的是,我已经尝试寻找解决此问题的方法,但还没有找到无需解压缩、添加我的文件夹然后再次压缩的方法。我没有使用任何第三方库。如果可能的话,我想使用 system.io.compression 来做到这一点......如果没有,我会使用 dotnetzip 作为我最后的选择。
长话短说;博士。
我希望能够将其中包含文件的目录添加到已创建的 zip 文件中。这可能使用 System.Io.Compression
库吗?
编辑:
using (FileStream zipToOpen = new FileStream(zipfile, FileMode.Open))
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
{
ZipArchiveEntry readmeEntry = archive.CreateEntry("testFolder/");
}
}
因此,使用此代码我可以在其中创建一个文件夹,但其中没有任何文件。我现在的问题是,我是否必须再次 运行 这段代码才能将我的源文件夹中的每个文件都放到 zip 内的这个文件夹中,或者是否有更好的方法?
感谢@stuartd,我设法找到了一种方法来做到这一点。他向我指出了这个答案,我找到了一种将其实现到我的代码中的方法,该代码从所述目录的源位置创建目录,其中包含文件。
代码如下:
using (FileStream zipToOpen = new FileStream("c:\MyDestination\test.zip", FileMode.Open))
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
{
ZipArchiveEntry readmeEntry;
DirectoryInfo d = new DirectoryInfo(c:\MySourceFolder);
FileInfo[] Files = d.GetFiles("*");
foreach (FileInfo file in Files)
{
readmeEntry = archive.CreateEntryFromFile("c:\MySourceFolder"+ "\" + file.Name, "MySourceFolder" + "/" + file.Name);
}
}
}
所以我所做的是转到我的源目录并遍历那里的所有文件,并使用 foreach 循环将它们添加到 zip 文件中的目标文件夹。
您还可以通过以下代码获取源目录名称:
string sourcepath = "C:\MySourceFolder";
int ind = sourcepath.LastIndexOf("\") + 1;
string folderName = sourcepath.Substring(ind, folder.Length - ind);
可以这样执行:
var targetDir = @"D:\test";
var zipFile = @"D:\test.zip";
using (ZipArchive zipArchive = ZipFile.Open(zipFile, ZipArchiveMode.Read))
zipArchive.AddDirectory(targetDir, "test");
public static class ExtensionMethods;
{
public static void AddDirectory(this ZipArchive zip, string targetDir, string subDir = null, CompressionLevel compressionLevel = CompressionLevel.Optimal)
{
var ogrDir = targetDir.Replace("/", "\");
if (!ogrDir.EndsWith("\"))
ogrDir = ogrDir + "\";
if (subDir == null)
subDir = "";
else
{
subDir = subDir.Replace("/", "\");
if (subDir.StartsWith("\"))
subDir = subDir.Remove(0, 1);
if (!subDir.EndsWith("\"))
subDir = subDir + "\";
}
Action<string> AddDirectoryAndSubs = null;
AddDirectoryAndSubs = delegate (string _targetDir)
{
string[] files = Directory.GetFiles(_targetDir);
foreach (string file in files)
{
var fileInfo = new FileInfo(file);
zip.CreateEntryFromFile(fileInfo.FullName, subDir + (fileInfo.Directory.ToString() + "\").Replace(ogrDir, "") + fileInfo.Name, compressionLevel);
}
string[] dirs = Directory.GetDirectories(_targetDir);
foreach (string dir in dirs)
AddDirectoryAndSubs(dir);
};
AddDirectoryAndSubs(targetDir);
}
}
此代码已准备好在 C# 4.5 + 中使用 System.IO.Compression
引用(并在 using
子句中),这是对先前答案的轻微改进,因为它将工作封装在一个函数。
public static void AddDirToZip(string source, string targetzip)
{
using (FileStream zipToOpen = new FileStream(targetzip, FileMode.Open))
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
{
ZipArchiveEntry readmeEntry;
DirectoryInfo d = new DirectoryInfo(source);
FileInfo[] Files = d.GetFiles("*");
foreach (FileInfo file in Files)
{
readmeEntry = archive.CreateEntryFromFile(file.FullName, d.Name + "/" + file.Name);
}
}
}
}