【问题标题】:'Could not load file or assembly System.IO.Compression' on UWPUWP 上的“无法加载文件或程序集 System.IO.Compression”
【发布时间】:2017-09-18 13:13:39
【问题描述】:

我的应用程序是通用窗口平台应用程序。我尝试实现一个运行时组件来解压缩一个压缩文件夹。我的要求之一是可以处理超过 260 个字符的路径。

public static IAsyncActionWithProgress < string > Unzip(string zipPath, string destination) {
    return AsyncInfo.Run < string > (async(_, progress) => {
        var zipFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri(zipPath));

        try {
            Stream stream = await zipFile.OpenStreamForReadAsync();
            ZipArchive archive = new ZipArchive(stream);
            archive.ExtractToDirectory(destination);
        } catch (Exception e) {
            Debug.WriteLine(e.Message);
        }
    });
}

我尝试执行我的方法得到以下异常消息:

System.IO.FileNotFoundException: Could not load file or assembly 'System.IO.Compression, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.
   at Zip.Zip.<>c__DisplayClass0_0.<<Unzip>b__0>d.MoveNext()
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start[TStateMachine](TStateMachine& stateMachine)
   at Zip.Zip.<>c__DisplayClass0_0.<Unzip>b__0(CancellationToken _, IProgress`1 progress)
   at System.Thread (~4340)

我尝试使用 NuGet 添加 System.IO.Compression,但仍然遇到相同的错误。 zip 文件和目标文件夹存在。

我尝试在 Visual Studio 2015 而不是 Visual Studio 2017 上调试我的项目,发现我可以通过这种方式使用 System.IO.Compression,但路径长度存在限制。

【问题讨论】:

    标签: c# uwp nuget windows-10-universal zipfile


    【解决方案1】:

    首先,通过在我这边进行测试,使用最新的 Visual Studio 2017,您的代码 sn-p 可以在默认情况下使用少于 260 个字符的文件路径。如果使用超过 260 个字符的路径,visual studio 2017 将抛出异常

    System.IO.PathTooLongException: '文件名或扩展名太长。

    这与 Visual Studio 2015 相同。所以请检查您是否正确使用了命名空间。 using System.IO.Compression;

    我的一个要求是可以处理超过 260 个字符的路径。

    其次,当您尝试通过GetFileFromApplicationUriAsync 方法获取文件时会抛出错误。所以这不是System.IO.Compression命名空间的问题,你真正需要解决的是最大路径长度限制,详情请参考this article。有关文件路径太长问题的更多详细信息,请尝试参考this thread。但它们可能不适合 UWP 应用。

    在 UWP 应用中,您可以使用 FileOpenPicker 获取文件并将文件传递给组件以读取文件流。文件选择器会将长文件名转换为“xxx-UN~1.ZIP”之类的快照以供阅读。

    FileOpenPicker openpicker = new FileOpenPicker();
    openpicker.FileTypeFilter.Add(".zip");
    var zipfile = await openpicker.PickSingleFileAsync();
    Stream stream = await zipfile.OpenStreamForReadAsync();
    ZipArchive archive = new ZipArchive(stream);
    archive.ExtractToDirectory(destination);
    

    我建议您避免使用长文件路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      • 2017-01-01
      • 2018-06-21
      • 2020-08-17
      相关资源
      最近更新 更多