c# - UnauthorizedAccessException 与 Zip 存档中临时文件夹中的文件路径

标签 c# zip unauthorizedaccessexcepti

我试图让我的图像查看器应用程序处理通过直接在 Zip 文件夹中单击图像文件(使用 Windows 资源管理器浏览 Zip 文件)打开的文件。该应用程序似乎使用正确的命令行运行,如下所示:

"C:\myApp.exe" "C:\Users\Admin\AppData\Local\Temp\Temp1_Wallpapers.zip\Wallpaper1.jpg"

正在使用以下代码读取文件:

using (var fs = new FileStream(path, FileMode.Open))

异常在该行被抛出:

Exception:Thrown: "Access to the path 'C:\Users\Admin\AppData\Local\Temp\Temp1_Wallpapers.zip\Wallpaper1.jpg' is denied." (System.UnauthorizedAccessException)

A System.UnauthorizedAccessException was thrown: "Access to the path 'C:\Users\Admin\AppData\Local\Temp\Temp1_Wallpapers.zip\Wallpaper1.jpg' is denied."

我认为这可能与路径的解释方式有关。中间有一个.zip,所以这可能是问题所在,但我不知道如何解决。

此外,直接在该路径(而不是通过压缩文件夹资源管理器窗口)打开文件会导致相同的异常。

最佳答案

Windows 资源管理器能够通过 shell 名称扩展处理程序将 .zip 存档视为文件夹。这样的处理程序扩展了 shell 的功能。但这仅限于 shell 函数,它不会自动使低级文件访问函数能够执行相同的操作。像 FileStream。

您需要先将文件从 .zip 存档中复制出来,然后才能使用 FileStream 打开它。周围有很多 .zip 支持库,SharpZipLib 和 DotNetZip 很受欢迎。它最终通过 System.IO.Compression.ZipArchive 类添加到 .NET 4.5。让我们选择一个最适合 future 的示例代码。

我创建了一个包含单个图像的 Example.zip 存档并将其复制到我的临时目录中。此代码检索它并使它成为 Winforms 窗体的背景图像:

using System.IO;
using System.IO.Compression;    // Add reference to System.IO.Compression
...

     private void button1_Click(object sender, EventArgs e) {
        var srcePath = @"c:\users\hpass_000\appdata\local\temp\example.zip";
        using (var file = new FileStream(srcePath, FileMode.Open)) {
            var zip = new ZipArchive(file, ZipArchiveMode.Read);
            var entry = zip.GetEntry("Chrysanthemum.jpg");
            var destPath = Path.GetTempFileName();
            using (var srce = entry.Open())
            using (var dest = new FileStream(destPath, FileMode.Create)) {
                srce.CopyTo(dest);
            }
            using (var img = Image.FromFile(destPath)) {
                this.BackgroundImage = new Bitmap(img);
            }
            File.Delete(destPath);
        }
    }

关于c# - UnauthorizedAccessException 与 Zip 存档中临时文件夹中的文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17911584/

相关文章:

c# - 跟踪更改(未保存)的对象

c# - 仅打印出 IEnumerable 中的奇数元素?

android - 在android上压缩/压缩一个充满文件的文件夹

actionscript-3 - 如何使用 Adob​​e Air 下载和解压 .ZIP 文件夹?

c# - 带有 getDirectories 的 UnauthorizedAccessException

c# - 使用反射获取 RuntimeMethodInfo 对象的 ReturnParameter 的 Name 属性 (C#)

c# - 如何获取 Roslyn 中 NamedTypeSymbol 的所有适用方法,包括扩展方法?

java - 帮助从 .Net 创建 Zip 文件并从 Java 读取它们

c# - 如何处理来自用户代码的 UnauthorizedAccessException

c# - 如何避免未授权访问异常?