尝试从 ZipArchive 中提取时出现 UnauthorizedAccessException

问题描述 投票:0回答:1

我正在开发一个 C# 控制台应用程序,该应用程序从 GitHub 发布页面下载

.zip
存档并将其提取到本地的某个文件。下载过程工作正常,但我还将包含该行,以防出现与之相关的问题。

client.DownloadFile("RELEASE-URL-HERE", "Release.zip");
using (ZipArchive archive = ZipFile.OpenRead("Release.zip"))
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
        Console.WriteLine("Extracting " + entry.Name);                    
        entry.ExtractToFile(Path.Combine(@"E:\dev\winforms\pie\bin\Release", entry.Name));
    }
}

我知道有一个更简单的过程可以从文件中提取所有项目,但我想使用

foreach
循环来完成此操作,以便控制提取的每个文件(可能是过滤文件或记录某些文件类型)。

但是,当提取过程开始时,我收到以下异常:

System.UnauthorizedAccessException: Access to the path 'E:\dev\winforms\pie\bin\Release' is denied.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
   at System.IO.Compression.ZipFileExtensions.ExtractToFile(ZipArchiveEntry source, String destinationFileName, Boolean overwrite)
   at pie.PieUpdater.Main()

我首先认为它可能来自我所在的当前文件夹,但即使在完全不同的路径中创建空文件夹(例如

E:\outputfolder
),错误似乎是相同的。

我什至尝试以管理员身份运行可执行文件,但似乎没有任何改变。

检查了为什么访问路径被拒绝?的答案,其中一个似乎表明当输出文件是目录时会出现此问题,并且实际上,尝试提取的第一个元素是 文件夹称为

/x64
。我 90% 确定这就是问题所在。

是我处理目录的方式错误吗?我是否需要手动浏览 zip 内的所有目录路径并将它们提取为文件?还是问题来自其他地方?

如果目录处理逻辑错误,是否有更简单的方法来提取包含目录和文件的存档,而不需要单独处理目录?

c# .net c#-ziparchive
1个回答
0
投票

文档说 ExtractToFile 用于将条目的内容提取到文件中(如方法名称所示)。

因此,如果您的条目是目录,那么它不起作用是有道理的。 (如果目标是文件夹,该方法还会引发参数异常)。

您可能想使用 ExtractToDirectory 来代替,但您将失去逐文件管理功能。

您建议的一种解决方案是自行手动处理目录。没有直接的属性可以知道 ZipArchiveEntry 是否是目录,但此线程有一些有关它的信息:如何判断“ZipArchiveEntry”是否是目录? (如果这是一个目录,ZipArchiveEntry.FullName 以“/”结尾)。

或者,您可能想使用另一个包来处理 zip 文件。我最近使用 SharpCompress 包来管理存档文件(我需要处理更多的存档类型,而不仅仅是 Zip 文件)。 使用 SharpCompress,条目有一个属性 IsDirectory:

while (reader.MoveToNextEntry())
{
    if (!reader.Entry.IsDirectory)
    {
        reader.WriteEntryToDirectory(destinationFolderPath, new ExtractionOptions { ExtractFullPath = true, Overwrite = true });
    }
}

(请注意,我在使用 SharpCompress 进行编码时遇到了一些问题,我必须自己管理,不确定 ZipFile 是否也是如此)。

© www.soinside.com 2019 - 2024. All rights reserved.