Почему в ZipFile.CreateFromDirectory отказано в доступе? - PullRequest
0 голосов
/ 08 сентября 2018

У меня проблема с доступом к файлу.

Основная проблема в том, что я не могу записать ZipFile в папку , полученную с помощью средства выбора папок.

Пока я работал над этим проектом, пока не столкнулся с проблемой ZipFile, я выполнял много заданий, связанных с созданием файлов, удалением файлов, созданием папок в этой папке. Это не имеет значения для этой проблемы.

Как указано в документации по доступу к файлу , у меня есть права доступа к папке, выбранной пользователем при использовании средства выбора папок.

Но я не могу создать этот 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? 1023 *

Редактировать

Сообщение об исключении следующее System.UnauthorizedAccessException: 'Доступ к пути' C: \ Users \ yohan \ Desktop \ 새 폴더 (2) \ 1.zip 'запрещен'.

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Я реализую с помощью StorageFile, Stream, ZipArchive, ZipArchiveEntry, Stream Writer.
ниже мой краткий источник для создания файла почтового индекса в папке, полученной средством выбора папки ().
Это прекрасно работает. Роб Каплан, спасибо за ваше очень четкое объяснение.

                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!");
                        }
                    }
                }
0 голосов
/ 09 сентября 2018

Ошибка правильная: у вас нет прямого доступа к этой папке. На данный момент лучшим вариантом является, вероятно, создание ZipArchive, перечисление папки с помощью FolderQuery и потоковая передача каждого файла по отдельности в ZipEntry .

Подробнее:

Ваш доступ предоставляется через StorageFolder, возвращаемый средством выбора файлов, и его необходимо использовать через этот StorageFolder.

Цитирование из Разрешения на доступ к файлу документации, которую вы связали, и добавление акцента для ясности:

После извлечения StorageFolder, который представляет данные приложения Вы можете получить доступ к файлам и папкам в этом месте , используя Методы StorageFolder .

Поскольку ZipFile не использует методы StorageFolder, он не может достичь целевой папки. Разрешения не привязаны к пути, переданному в ZipFile.

Я обсуждал это более подробно в своей записи в блоге Пропустить путь: придерживаться StorageFile

Работа над посредническим доступом осуществляется через прямые вызовы файловой системы, но она еще не завершена. В текущих версиях Windows 10 вы можете использовать IStorageFolderHandleAccess , IStorageItemHandleAccess или CreateFile2FromApp , чтобы получить собственный файл HANDLE, который можно использовать для создания System.IO.File. объект, но он не будет работать для классов .Net, таких как ZipFile, которые берут Path и сами открывают файл.

...