10

我正在尝试使我的图像查看器应用程序与通过直接单击 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))

并在该行引发异常:

异常:抛出:“访问路径 '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,所以这可能是问题,但我不知道如何解决。

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

4

3 回答 3

6

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

您需要先将文件从 .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);
        }
    }
于 2013-08-10T18:28:35.133 回答
2

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

于 2013-08-10T23:41:11.190 回答
1

该问题与临时文件路径中的 无关,.因为句点在文件名和目录名中都是合法的。

如您所料,在 shell 中打开一个 Zip 文件夹并打开一个文件会自动将内容提取到一个临时文件夹,这只是一个普通文件夹。这里唯一看起来很奇怪的是它打开了管理员临时文件夹。您是否以普通用户身份运行exe?如果 exe 和 shell 在不同的用户下运行,则 exe 可能无法访问 shell 使用的临时文件夹。

于 2013-08-10T23:34:35.487 回答