为什么ZipFile.CreateFromDirectory抛出访问被拒绝?

时间:2018-09-08 16:05:44

标签: c# uwp zipfile

我遇到文件访问问题。

主要问题是我无法在由文件夹选择器获取的文件夹中编写ZipFile。

虽然我一直在从事这个项目,但是直到遇到ZipFile问题之前,我都做了很多与创建文件,删除文件以及在该文件夹中创建文件夹相关的工作。这个问题似乎无关紧要。

正如the file-access documentation所说,我对用户在使用文件夹选择器时选择的文件夹具有访问权限。

但是我不能在那个文件夹中创建这个ZipFile。以下是我的消息来源和例外情况。

string zipfPath = folder.Path + @"\" + i.ToString() + ".zip";
await folder.CreateFolderAsync("DADADAD");
ZipFile.CreateFromDirectory(folder.Path + @"/DADADAD", zipfPath);

denied

为什么我无法使用ZipFile.Create(Path string)访问该文件夹?使用UWP时是否还有其他要求?也许我只是滥用ZipFile.Create

编辑

以下是异常消息 System.UnauthorizedAccessException:'拒绝访问路径'C:\ Users \ yohan \ Desktop \새(2)\ 1.zip'。

2 个答案:

答案 0 :(得分:2)

错误是正确的:您没有直接访问该文件夹的权限。目前,您最好的选择可能是创建一个ZipArchive,通过ZipEntry枚举文件夹,然后将每个文件分别流式传输到File access permissions中。

更多详细信息:

您的访问权限是通过文件选择器返回的StorageFolder授予的,需要通过该StorageFolder使用。

从您链接的Skip the path: stick to the StorageFile文档中引用,并为简化起见添加了一些重点:

  

检索代表应用程序数据的StorageFolder之后   位置,您可以通过使用访问该位置的文件和文件夹   StorageFolder方法

由于ZipFile不使用StorageFolder方法,因此无法访问目标文件夹。权限未附加到传递到ZipFile的路径上。

我在博客条目IStorageFolderHandleAccess

中对此进行了更深入的讨论

正在进行一些工作,以通过直接文件系统调用来限制代理访问,但尚未完成。在当前版本的Windows 10中,您可以使用IStorageItemHandleAccessCreateFile2FromApphttps://jsfiddle.net/marksalvania/94uyLvp1/来获取本机文件HANDLE,您可以使用它来创建System.IO.File对象,但是它不会不适用于.Net类(例如ZipFile),这些类带有一个Path并自己打开文件。

答案 1 :(得分:0)

我使用StorageFile,Stream,ZipArchive,ZipArchiveEntry,Stream Writer来实现。
以下是我在文件夹picker()获取的文件夹中创建zip文件的简短信息。
效果很好。罗伯·卡普兰(Rob Caplan),谢谢您的明确解释。

                StorageFile f = await folder.CreateFileAsync("test.zip");

                using (Stream s = (await f.OpenStreamForWriteAsync()))
                {
                    using (ZipArchive zz = new ZipArchive(s, ZipArchiveMode.Update))
                    {
                        ZipArchiveEntry read = zz.CreateEntry("scc.txt");
                        using (StreamWriter sw = new StreamWriter(read.Open()))
                        {
                            await sw.WriteLineAsync("StackOverFlow");
                            await sw.WriteLineAsync("Thanks!");
                        }
                    }
                }