Как включить файлы в уже созданный ZIP-файл, используя FileOpenPicker - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь добавить несколько файлов в уже созданный ZIP-файл, используя PickMultipleFilesAsync () .Ранее я создал ZIP-файл, к которому хочу получить доступ, в том же коде, используя метод FilesavePicker.PickSaveFileAsync().Приложение работает на Windows 10 Pro версии 1803 на ноутбуке, и я использовал Visual Studio Community 2017 для его создания.

Проблема, с которой я столкнулся, заключается в том, что после выполнения шагов, описанных в FileOpenPicker Страница MSDN, я получаю System.UnauthorizedAccessException: 'Доступ к пути' C: \ Users \ 'Пользователь' \ Downloads {ZIP file} 'запрещен.'

Я создалZIP-файл и попытался добавить новые файлы, используя этот код:

StorageFile file = await savePicker.PickSaveFileAsync();
if (file != null)
 {
  // Prevent updates to the remote version of the file until we finish making changes and call CompleteUpdatesAsync.
  CachedFileManager.DeferUpdates(file);
  try
   {
    Stream stream = await file.OpenStreamForWriteAsync();
    using (ZipArchive archive = new ZipArchive(stream, ZipArchiveMode.Update))
     {
       // This line works fine, file is added
       archive.CreateEntryFromFile(path_to_another_file, file_name_in_ZIP);
       //....
       var dialog = new MessageDialog("Do you want to add more files to ZIP?");
       //... (dialog configuration for Yes/No options)
       var result = await dialog.ShowAsync();
       if(result.Label == "Yes")
        {
         Debug.WriteLine("Yes option was selected!");
         // Include additional files
         var openPicker = new FileOpenPicker();
         openPicker.FileTypeFilter.Add("*");
         openPicker.SuggestedStartLocation = PickerLocationId.Downloads;
         IReadOnlyList<StorageFile> addedFiles = await openPicker.PickMultipleFilesAsync();

         if (addedFiles.Count > 0)
          {
           // Application now has read/write access to the picked file(s)
           foreach (StorageFile addedFile in addedFiles)
            {
             Debug.WriteLine(addedFile.Path); // No problem here
             // I get the UnauthorizedAccessException here:
             archive.CreateEntryFromFile(addedFile.Path, @"additional files/" + addedFile.Name);
             }
          }
          else
          {
           // Update log file
           globalLog += GetTime() + "No additional files";
          }
        }
      }
    }
  } 

Я уже добавил <rescap:Capability Name="broadFileSystemAccess"/> в appxmanifest на всякий случай, но, поскольку у меня был доступ к выбранным файлам с помощью FileOpenPicker, я думаю, что это не проблема.

Когда я создал ZIP-файл в этом коде, у меня все еще должен быть к нему доступ, верно?Я подозреваю, что FileOpenPicker каким-то образом «закрывает» доступ к ZIP-файлу для предоставления доступа к добавляемым файлам или что MessageDialog препятствует доступу к ZIP-файлу, который я создал после того, как я вызвал showAsync ().

Есть лиДругой способ добиться того, что я пытаюсь?

РЕДАКТИРОВАТЬ : я не могу получить доступ к файлам, которые я выбрал, используя FileOpenPicker, несмотря на то, что я могу показать имена файлов в консоли отладки,Доступ к ZIP-файлу в порядке.

1 Ответ

0 голосов
/ 13 февраля 2019

Я только что нашел решение.Как указано здесь , вы можете использовать буфер для потоковой передачи содержимого файла в ZIP-файл, просто замените:

// I get the UnauthorizedAccessException here:
archive.CreateEntryFromFile(addedFile.Path, @"additional files/" + addedFile.Name);

на:

ZipArchiveEntry readmeEntry = archive.CreateEntry(@"additional files/" + addedFile.Name);
byte[] buffer = WindowsRuntimeBufferExtensions.ToArray(await FileIO.ReadBufferAsync(addedFile));
using (Stream entryStream = readmeEntry.Open())
  {
    await entryStream.WriteAsync(buffer, 0, buffer.Length);
  }

Таким образом, файлыдобавляются, и UnauthorizedAccessException не происходит.Надеюсь, что это поможет любому с той же проблемой!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...