我遇到文件访问问题。
主要问题是我无法在由文件夹选择器获取的文件夹中编写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'。
答案 0 :(得分:2)
错误是正确的:您没有直接访问该文件夹的权限。目前,您最好的选择可能是创建一个ZipArchive,通过ZipEntry枚举文件夹,然后将每个文件分别流式传输到File access permissions中。
更多详细信息:
您的访问权限是通过文件选择器返回的StorageFolder授予的,需要通过该StorageFolder使用。
从您链接的Skip the path: stick to the StorageFile文档中引用,并为简化起见添加了一些重点:
检索代表应用程序数据的StorageFolder之后 位置,您可以通过使用访问该位置的文件和文件夹 StorageFolder方法。
由于ZipFile不使用StorageFolder方法,因此无法访问目标文件夹。权限未附加到传递到ZipFile的路径上。
我在博客条目IStorageFolderHandleAccess
中对此进行了更深入的讨论正在进行一些工作,以通过直接文件系统调用来限制代理访问,但尚未完成。在当前版本的Windows 10中,您可以使用IStorageItemHandleAccess,CreateFile2FromApp或https://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!");
}
}
}