是否可以在 C# 中将文件夹压缩在一起?
Is it possible to zip folders together in c#?
例如,如果我有一个名为 2016 的文件夹,并且该文件夹中有文件夹 Jan-Dec 和其他文件,是否可以将这些文件夹压缩到 2016.zip 中?我尝试将文件夹中的所有文件压缩在一起,但我只想将文件夹压缩在一起,文件夹中没有其他文件。
基本上,2016.zip 2016.zip 中有 Jan-Dec 文件夹,每个文件夹中都有各自的文件,而不是 zip 中的空文件夹。
以下代码抓取以 00 开头的文件,但不抓取文件夹。
// Where the files are located
string strStartPath = txtTargetFolder.Text;
// Where the zip file will be placed
string strZipPath = @"C:\Users\smelmo\Desktop\testFinish\" + strFileNameRoot + "_" + txtDateRange1.Text.Replace(@"/", "_") + "_" + txtDateRange2.Text.Replace(@"/", "_") + ".zip";
if(File.Exists(strZipPath))
{
File.Delete(strZipPath);
}
using (ZipArchive archive = ZipFile.Open(strZipPath, ZipArchiveMode.Create))
{
foreach (FileInfo file in new DirectoryInfo(strStartPath).GetFiles())
{
if (file.Name.StartsWith("00"))
{
var entry = archive.CreateEntryFromFile(Path.Combine(file.Directory.ToString(), file.Name), file.Name);
}
}
}
我也尝试过使用 typeof()
,但它无法抓取文件夹或任何东西。
using (ZipArchive archive = ZipFile.Open(strZipPath, ZipArchiveMode.Create))
{
foreach (FileInfo file in new DirectoryInfo(strStartPath).GetFiles())
{
Type t = file.GetType();
if (t.Equals(typeof(Directory)))
{
var entry = archive.CreateEntryFromFile(Path.Combine(file.Directory.ToString(), file.Name), file.Name);
}
}
编辑: 为清楚起见添加了详细信息
具有以下文件夹结构:
此代码(已更新):
using System.IO;
using System.IO.Compression;
class Program
{
static void Main(string[] args)
{
string sourceFolder = @"c:\temp";
string zipFilePath = Path.Combine(sourceFolder, "test.zip");
// TODO: Check if the archive exists maybe?
using (ZipArchive archive = ZipFile.Open(zipFilePath, ZipArchiveMode.Create))
{
foreach (var directoryName in Directory.GetDirectories(sourceFolder))
{
foreach (var filePath in Directory.GetFiles(directoryName))
{
var dirInfo = new DirectoryInfo(directoryName);
var fileName = Path.GetFileName(filePath);
var entry = archive.CreateEntry($"{dirInfo.Name}\{fileName}");
}
}
}
}
}
生成此 zip:
例如,如果我有一个名为 2016 的文件夹,并且该文件夹中有文件夹 Jan-Dec 和其他文件,是否可以将这些文件夹压缩到 2016.zip 中?我尝试将文件夹中的所有文件压缩在一起,但我只想将文件夹压缩在一起,文件夹中没有其他文件。
基本上,2016.zip 2016.zip 中有 Jan-Dec 文件夹,每个文件夹中都有各自的文件,而不是 zip 中的空文件夹。
以下代码抓取以 00 开头的文件,但不抓取文件夹。
// Where the files are located
string strStartPath = txtTargetFolder.Text;
// Where the zip file will be placed
string strZipPath = @"C:\Users\smelmo\Desktop\testFinish\" + strFileNameRoot + "_" + txtDateRange1.Text.Replace(@"/", "_") + "_" + txtDateRange2.Text.Replace(@"/", "_") + ".zip";
if(File.Exists(strZipPath))
{
File.Delete(strZipPath);
}
using (ZipArchive archive = ZipFile.Open(strZipPath, ZipArchiveMode.Create))
{
foreach (FileInfo file in new DirectoryInfo(strStartPath).GetFiles())
{
if (file.Name.StartsWith("00"))
{
var entry = archive.CreateEntryFromFile(Path.Combine(file.Directory.ToString(), file.Name), file.Name);
}
}
}
我也尝试过使用 typeof()
,但它无法抓取文件夹或任何东西。
using (ZipArchive archive = ZipFile.Open(strZipPath, ZipArchiveMode.Create))
{
foreach (FileInfo file in new DirectoryInfo(strStartPath).GetFiles())
{
Type t = file.GetType();
if (t.Equals(typeof(Directory)))
{
var entry = archive.CreateEntryFromFile(Path.Combine(file.Directory.ToString(), file.Name), file.Name);
}
}
编辑: 为清楚起见添加了详细信息
具有以下文件夹结构:
此代码(已更新):
using System.IO;
using System.IO.Compression;
class Program
{
static void Main(string[] args)
{
string sourceFolder = @"c:\temp";
string zipFilePath = Path.Combine(sourceFolder, "test.zip");
// TODO: Check if the archive exists maybe?
using (ZipArchive archive = ZipFile.Open(zipFilePath, ZipArchiveMode.Create))
{
foreach (var directoryName in Directory.GetDirectories(sourceFolder))
{
foreach (var filePath in Directory.GetFiles(directoryName))
{
var dirInfo = new DirectoryInfo(directoryName);
var fileName = Path.GetFileName(filePath);
var entry = archive.CreateEntry($"{dirInfo.Name}\{fileName}");
}
}
}
}
}
生成此 zip: