Zipfile OpenRead 在 c# uwp 应用程序中抛出对路径的访问被拒绝异常?

Posted

技术标签:

【中文标题】Zipfile OpenRead 在 c# uwp 应用程序中抛出对路径的访问被拒绝异常?【英文标题】:Zipfile OpenRead throws Access to the path is denied exception in c# uwp app? 【发布时间】:2019-10-16 03:30:14 【问题描述】:

我几个月来一直在使用以下代码,没有出现任何问题,突然间,它向我抛出了“拒绝访问路径”异常。我一直在清单中使用“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"; );
                

      

【问题讨论】:

【参考方案1】:

将您的 StorageFile 流式传输到 ZipArchive 中,而不是丢弃 StorageFile 并使用 ZipFile.Open 从其路径重新打开文件。类似于以下内容:

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

BroadFileSystemAccess 仅通过 Windows.Storage 类提供访问权限 - 请参阅 Accessing additional locations。 ZipFile.OpenRead() 尝试使用 System.IO 而不是 Windows.Storage 直接重新打开路径。除非路径位于应用程序无需添加权限即可读取的位置(例如应用程序数据),否则此操作将失败。

【讨论】:

【参考方案2】:

对于读取和写入文件,您的应用程序应在 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>

【讨论】:

可能是的,但是这个应用程序不需要管理权限,只需要用户使用文件选择器选择的目录的权限。 UWP 真是一团糟……我很遗憾选择了这种方法……但是我在项目中太先进了。【参考方案3】:

我使用与 Francois 相同的代码,但两次通过类似于以下代码的 zip 文件。第二次会随机得到这个错误。我终于想出了如何用一个循环来完成这项工作,现在它运行良好。顺便说一句,我尝试了一切,包括在循环之间放置一个 Sleep(1000) 甚至是用户提示,但没有任何区别。通常情况下,这样的问题有时是结构问题的指标,解决方案可以产生更清晰的代码,即一个循环而不是两个循环。

            try 
                using (ZipArchive archive = ZipFile.OpenRead(NewImage.Path))
                
                    foreach (ZipArchiveEntry member in archive.Entries)
                    
                        // do some preprocessing here
                    
                
                using (ZipArchive archive = ZipFile.OpenRead(NewImage.Path))
                
                    foreach (ZipArchiveEntry member in archive.Entries)
                    
                        // do final processing here
                    
                
            
            catch (Exception e)
            
                Console.WriteLine($"e.Message");
            

【讨论】:

以上是关于Zipfile OpenRead 在 c# uwp 应用程序中抛出对路径的访问被拒绝异常?的主要内容,如果未能解决你的问题,请参考以下文章

C# StreamContent 和 File.OpenRead() 不产生 HTTP'able 多部分内容

C# ZipFile.CreateFromDirectory 编码

C# 将 zip 条目从一个 zipFile 导出到另一个 zipFile

如何在命令行中编译 ZipFile 类(C#)

C# ZipFile在成功操作后抛出异常[重复]

在 Mac 上下载 C# ZipFile 时,显示文件路径而不是文件夹