我正在尝试让我的图像查看器应用程序使用直接在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
,所以这可能是问题所在,但我不知道如何解决这个问题。
此外,只是直接在该路径上打开文件(而不是通过压缩文件夹浏览器窗口)会导致相同的异常。
答案 0 :(得分: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);
}
}
答案 1 :(得分:2)
我刚刚发现了问题所在。从压缩文件夹中提取到临时文件夹的文件将具有read-only
属性,我的图像查看器应用程序显然无法处理并抛出UnauthorizedAccessException
。我只需要删除该属性,一切都会好的。猜测尝试读取只读文件是违反各种规定的行为。
答案 2 :(得分:1)
该问题与临时文件路径中的.
无关,因为句点在文件名和目录名中都是合法的。
如您所料,在shell中打开Zip文件夹并打开文件会自动将内容提取到临时文件夹,这只是一个普通的文件夹。这里唯一看起来很奇怪的是它打开 Administrator 临时文件夹。你是作为普通用户运行exe吗?如果exe和shell在不同的用户下运行,则exe可能无法访问shell使用的临时文件夹。