Zipfile OpenRead выбрасывает Доступ к пути запрещен исключение в приложении c # uwp? - PullRequest
0 голосов
/ 16 октября 2019

Я использовал следующий фрагмент кода в течение нескольких месяцев без проблем, и внезапно он вызывает у меня исключение «Доступ к пути запрещен». Я использовал «BroadFileSystemAccess» в своем манифесте и использую средство выбора файлов, чтобы выбрать файл, который я передаю в качестве параметра StorageFile. Я также убедился, что в приложении включен FileAccess.

Что не так? Не могу понять это после часов отладки и поиска ...

   public async Task AddImageToPlaylist(StorageFile NewImage)
   {

                try {
                    using (ZipArchive archive = ZipFile.OpenRead(NewImage.Path))
                    {
                        foreach (ZipArchiveEntry member in archive.Entries)
                        {
                            NumSlides += 1;
                            AllFiles.Add(new imgitem { type = "zip", zipname = NewImage.Path, filepath = member.FullName, imgname = NewImage.Name, imgsize = (ulong)member.Length, imgdate = member.LastWriteTime, index = NumSlides, ImgRating = 0 });
                         }

                    }

                }
                catch (Exception)
                {
                    await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { MessageBlock.Text = "Exception encountered loading ZIP file"; });
                }

      }

Ответы [ 2 ]

3 голосов
/ 16 октября 2019

Передайте файл StorageFile в ZipArchive, а не отбрасывайте StorageFile и повторно открывайте файл по его пути с помощью ZipFile.Open. Что-то вроде следующего:

using System.IO;
....
ZipArchive archive = new ZipArchive(await NewImage.OpenStreamForReadAsync());

BroadFileSystemAccess предоставляет доступ только через классы Windows.Storage - см. Доступ к дополнительным расположениям . ZipFile.OpenRead () пытается заново открыть путь, используя System.IO вместо Windows.Storage. Это не удастся, если путь не находится в местоположении (например, данных приложения), которое приложение может прочитать без добавления разрешений.

0 голосов
/ 16 октября 2019

Для чтения и записи файла ваше приложение должно иметь права администратора в aap.manifest

<security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <!-- UAC Manifest Options
             If you want to change the Windows User Account Control level replace the 
             requestedExecutionLevel node with one of the following.

        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

            Specifying requestedExecutionLevel element will disable file and registry virtualization. 
            Remove this element if your application requires this virtualization for backwards
            compatibility.
        -->
        <requestedExecutionLevel level="requireAdministrator" uiAccess="true" />
      </requestedPrivileges>
      <applicationRequestMinimum>
        <defaultAssemblyRequest permissionSetReference="Custom" />
        <PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
      </applicationRequestMinimum>
    </security>
...