使用 ZipArchive 但不使用 ZipFile 时出现 c# UnauthorizedAccessException
c# UnauthorizedAccessException when using ZipArchive but not ZipFile
我可以在以下测试代码中使用 ZipFile.CreateFromDirectory
从特定文件夹压缩文件(我只使用此代码来测试压缩的工作原理):
// 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";
ZipFile.CreateFromDirectory(strStartPath, strZipPath);
但是,这会将文件夹中的所有内容压缩在一起。我正在尝试使用以下代码中的 ZipArchive
将文件夹中的特定项目压缩在一起:
// 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";
using (ZipArchive archive = ZipFile.OpenRead(strStartPath))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
if (!(entry.FullName.EndsWith(".TIF", StringComparison.OrdinalIgnoreCase)))
{
entry.ExtractToFile(Path.Combine(strZipPath, entry.FullName));
}
}
}
它在 ZipFile.OpenRead(strStartPath)
给出了错误。为什么我能够访问第一段代码中的确切文件夹,但不能访问第二段代码?或者是否有更简单的方法来搜索文件夹并仅压缩特定项目?
您使用的 Zip 库有误
实际上你是在尝试打开一个目录,就好像它是一个 zip 文件一样,然后遍历该目录的内容(这实际上也是一个 zip 文件),然后尝试提取每个成员 进入 一个不同的 zip 文件
这是您所描述的您正在尝试做的事情的一个工作示例:
string strStartPath = @"PATH TO FILES TO PUT IN ZIP FILE";
string strZipPath = @"PATH TO ZIP FILE";
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.FullName.EndsWith(".TIF", StringComparison.OrdinalIgnoreCase)))
{
archive.CreateEntryFromFile(Path.Combine(file.Directory.ToString(), file.Name), file.Name);
}
}
}
这将获取文件夹的所有根级内容并将其放入 zip 文件中。您将需要实现自己的方式来递归获取子文件夹及其内容,但这超出了这个问题的范围。
编辑:这是一个工作示例,其中包含适当的文件夹递归 select 所有文件,甚至在子目录中
public void ZipFolder()
{
string strStartPath = @"PATH TO FILES TO PUT IN ZIP FILE";
string strZipPath = @"PATH TO ZIP FILE";
if (File.Exists(strZipPath))
File.Delete(strZipPath);
using (ZipArchive archive = ZipFile.Open(strZipPath, ZipArchiveMode.Create))
{
foreach (FileInfo file in RecurseDirectory(strStartPath))
{
if (!(file.FullName.EndsWith(".TIF", StringComparison.OrdinalIgnoreCase)))
{
var destination = Path.Combine(file.DirectoryName, file.Name).Substring(strStartPath.Length + 1);
archive.CreateEntryFromFile(Path.Combine(file.Directory.ToString(), file.Name), destination);
}
}
}
}
public IEnumerable<FileInfo> RecurseDirectory(string path, List<FileInfo> currentData = null)
{
if (currentData == null)
currentData = new List<FileInfo>();
var directory = new DirectoryInfo(path);
foreach (var file in directory.GetFiles())
currentData.Add(file);
foreach (var d in directory.GetDirectories())
RecurseDirectory(d.FullName, currentData);
return currentData;
}
我可以在以下测试代码中使用 ZipFile.CreateFromDirectory
从特定文件夹压缩文件(我只使用此代码来测试压缩的工作原理):
// 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";
ZipFile.CreateFromDirectory(strStartPath, strZipPath);
但是,这会将文件夹中的所有内容压缩在一起。我正在尝试使用以下代码中的 ZipArchive
将文件夹中的特定项目压缩在一起:
// 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";
using (ZipArchive archive = ZipFile.OpenRead(strStartPath))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
if (!(entry.FullName.EndsWith(".TIF", StringComparison.OrdinalIgnoreCase)))
{
entry.ExtractToFile(Path.Combine(strZipPath, entry.FullName));
}
}
}
它在 ZipFile.OpenRead(strStartPath)
给出了错误。为什么我能够访问第一段代码中的确切文件夹,但不能访问第二段代码?或者是否有更简单的方法来搜索文件夹并仅压缩特定项目?
您使用的 Zip 库有误
实际上你是在尝试打开一个目录,就好像它是一个 zip 文件一样,然后遍历该目录的内容(这实际上也是一个 zip 文件),然后尝试提取每个成员 进入 一个不同的 zip 文件
这是您所描述的您正在尝试做的事情的一个工作示例:
string strStartPath = @"PATH TO FILES TO PUT IN ZIP FILE";
string strZipPath = @"PATH TO ZIP FILE";
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.FullName.EndsWith(".TIF", StringComparison.OrdinalIgnoreCase)))
{
archive.CreateEntryFromFile(Path.Combine(file.Directory.ToString(), file.Name), file.Name);
}
}
}
这将获取文件夹的所有根级内容并将其放入 zip 文件中。您将需要实现自己的方式来递归获取子文件夹及其内容,但这超出了这个问题的范围。
编辑:这是一个工作示例,其中包含适当的文件夹递归 select 所有文件,甚至在子目录中
public void ZipFolder()
{
string strStartPath = @"PATH TO FILES TO PUT IN ZIP FILE";
string strZipPath = @"PATH TO ZIP FILE";
if (File.Exists(strZipPath))
File.Delete(strZipPath);
using (ZipArchive archive = ZipFile.Open(strZipPath, ZipArchiveMode.Create))
{
foreach (FileInfo file in RecurseDirectory(strStartPath))
{
if (!(file.FullName.EndsWith(".TIF", StringComparison.OrdinalIgnoreCase)))
{
var destination = Path.Combine(file.DirectoryName, file.Name).Substring(strStartPath.Length + 1);
archive.CreateEntryFromFile(Path.Combine(file.Directory.ToString(), file.Name), destination);
}
}
}
}
public IEnumerable<FileInfo> RecurseDirectory(string path, List<FileInfo> currentData = null)
{
if (currentData == null)
currentData = new List<FileInfo>();
var directory = new DirectoryInfo(path);
foreach (var file in directory.GetFiles())
currentData.Add(file);
foreach (var d in directory.GetDirectories())
RecurseDirectory(d.FullName, currentData);
return currentData;
}