UnknownAccessException,包含Zip档案中临时文件夹中的文件路径

use*_*322 9 c# zip unauthorizedaccessexcepti

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

"C:\myApp.exe" "C:\Users\Admin\AppData\Local\Temp\Temp1_Wallpapers.zip\Wallpaper1.jpg"
Run Code Online (Sandbox Code Playgroud)

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

using (var fs = new FileStream(path, FileMode.Open))
Run Code Online (Sandbox Code Playgroud)

并且在该行抛出异常:

异常:抛出:"访问路径'C:\ Users\Admin\AppData\Local\Temp\Temp1_Wallpapers.zip\Wallpaper1.jpg'被拒绝." (System.UnauthorizedAccessException的)

抛出了System.UnauthorizedAccessException:"拒绝访问路径'C:\ Users\Admin\AppData\Local\Temp\Temp1_Wallpapers.zip\Wallpaper1.jpg'."

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

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

Han*_*ant 6

Windows资源管理器可以通过shell名称扩展处理程序将.zip存档视为文件夹.这种处理程序扩展了shell的功能.但是,这仅限于shell函数,它不会自动使低级文件访问功能能够做到这一点.像FileStream一样.

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

我创建了一个带有单个图像的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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 它不起作用是完全正常的,这是我试图在答案中提出的观点.听起来你完全错过了它.不太确定如何帮助你超越驼峰,我建议你做我推荐的事情. (2认同)
  • 对,它只是**看起来像一个文件夹.Windows资源管理器创建了这种错觉.它不是,它实际上是一个普通文件.您必须编写代码以从存档中提取文件.我发布了一个示例实现. (2认同)

use*_*322 2

我刚刚发现问题所在。从压缩文件夹中提取到临时文件夹中的文件将具有read-only属性,我的图像查看器应用程序显然无法处理并抛出该属性UnauthorizedAccessException。我只需要删除该属性,一切都会好起来的。猜测尝试读取只读文件是一种访问冲突。

  • 不,读取只读文件不是未经授权的,但您用来读取它们的代码要求过多的(读/写)权限。解决这个问题,错误就会消失。 (2认同)
  • 尝试向 FileStream 构造函数添加第三个参数:“FileAccess.Read”。.Net 默认情况下采用最严格的(“ReadWrite”)权限,这有点愚蠢,尽管我猜否则论坛上会充斥着“为什么我不能写入我的文件流!?!?!” (2认同)