【问题标题】:Why is ZipFile.CreateFromDirectory throwing access denied here?为什么 ZipFile.CreateFromDirectory 在这里拒绝访问?
【发布时间】:2018-09-08 16:05:43
【问题描述】:

我遇到了文件访问问题。

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

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

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

但我无法在该文件夹中创建此 ZipFile。以下是我的来源和例外情况。

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

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

编辑

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

【问题讨论】:

  • 您可以尝试以管理员身份运行您的程序吗? (或以管理员身份运行visual studio,或文件)
  • @OrYaacov 我尝试以管理员身份运行我的 Visual Studio,但结果与我的帖子相同。
  • @LosPollosHermanos 您可以看到我的源代码与该链接的答案相似。我不认为我确实将目录替换为文件。
  • @HansPassant 正如链接所说,在我的源代码中,文件夹

标签: c# uwp zipfile


【解决方案1】:

错误是正确的:您没有直接访问该文件夹的权限。现在你最好的选择可能是创建一个 ZipArchive,通过FolderQuery 枚举文件夹并将每个文件单独流式传输到ZipEntry

更多细节:

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

引用您链接的 File access permissions 文档并添加一些重点以清楚起见:

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

由于 ZipFile 不使用 StorageFolder 方法,它无法到达目标文件夹。权限未附加到传递给 ZipFile 的路径。

我在我的博客文章Skip the path: stick to the StorageFile中更深入地讨论了这个问题

正在进行通过直接文件系统调用来检测代理访问的工作,但尚未完成。在当前版本的 Windows 10 中,您可以使用 IStorageFolderHandleAccessIStorageItemHandleAccessCreateFile2FromApp 获取可用于创建 System.IO.File 对象的本机文件 HANDLE,但它不适用于 .Net 类例如 ZipFile 采用 Path 并自己打开文件。

【讨论】:

  • 非常感谢您的明确回答。我阅读了您的博客,现在我清楚地了解了为什么我不能使用它。我会按照你的建议(ZipArchive 和 ZipEntry),从现在开始我会仔细阅读文档。
  • @RobCaplan,谢谢你的帖子。如果我按照您的建议使用 ZipArchive 和 ZipEntry,则不会将隐藏文件、文件夹、.URL 文件添加到其中,如您在此示例中所见。有什么建议? github.com/ZhuMingHao/ZipFile
【解决方案2】:

我使用 StorageFile、Stream、ZipArchive、ZipArchiveEntry、Stream Writer 实现。
下面是我在文件夹选择器()获取的文件夹中创建 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!");
                        }
                    }
                }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多