2

我有一个 C# WinForms .NET 应用程序,我试图在其中写入一个 zip 存档并使用 System.IO.Compression 从中读取。

现在我创建了 ziparchive:

    public void SaveStdV20ZipProject(string strfilepath, clsProjectInfo GameInfo)
    {
        using (var ms = new MemoryStream())
        {
            using (var archive = new ZipArchive(ms, ZipArchiveMode.Create, true))
            {
                string strProjectData = String.Empty;
                StringBuilder sb = new StringBuilder();

                // First, we add the Game Info data...
                sb.AppendLine(GameInfo.strGameVersion);
                sb.AppendLine(GameInfo.strProjectType);
                sb.AppendLine(GameInfo.strGameTitle);
                sb.AppendLine(GameInfo.strAuthor);
                sb.AppendLine(GameInfo.strCreationDate);
                sb.AppendLine(GameInfo.blTSImagePresent.ToString());
                sb.AppendLine(GameInfo.blTSAudioPresent.ToString());
                sb.AppendLine(GameInfo.blTSVideoPresent.ToString());
                sb.AppendLine(GameInfo.blFSSImagePresent.ToString());
                sb.AppendLine(GameInfo.blFSSAudioPresent.ToString());
                sb.AppendLine(GameInfo.blFSSVideoPresent.ToString());
                sb.AppendLine(GameInfo.intTotalQuestions.ToString());
                sb.AppendLine(GameInfo.intTotalMediaItems.ToString());
                sb.AppendLine(GameInfo.intTotalCategories.ToString());
                sb.AppendLine(GameInfo.blTiebreakerPresent.ToString());

                // Next, create an archive entry for the Game Data string...
                strProjectData = sb.ToString();

                var ProjectData = archive.CreateEntry("ProjectData.txt");

                using (var entryStream = ProjectData.Open())
                using (var streamWriter = new StreamWriter(entryStream))
                {
                    streamWriter.Write(strProjectData);
                }

                // We're done writing all the data for this project. Now let's write it to the file...
                using (var fileStream = new FileStream(@strfilepath, FileMode.Create))
                {
                    ms.Seek(0, SeekOrigin.Begin);
                    ms.CopyTo(fileStream);
                }
            }
        }
    }

这是我打开它的方式:

    public void OpenStdV20ZipProject(string strfilepath)
    {
        string zipPath = strfilepath;
        string extractPath = Path.GetTempFileName();

        using (ZipArchive archive = ZipFile.OpenRead(zipPath))
        {
            foreach (ZipArchiveEntry entry in archive.Entries)
            {
                if (entry.FullName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
                {
                    using (StreamReader sr = new StreamReader(extractPath))
                    {
                        clsProjInfo.strGameVersion = (string)sr.ReadLine();
                        clsProjInfo.strProjectType = (string)sr.ReadLine();
                        clsProjInfo.strGameTitle = (string)sr.ReadLine();
                        clsProjInfo.strAuthor = (string)sr.ReadLine();
                        clsProjInfo.strCreationDate = (string)sr.ReadLine();
                        clsProjInfo.blTSImagePresent = Convert.ToBoolean(sr.ReadLine());
                        clsProjInfo.blTSAudioPresent = Convert.ToBoolean(sr.ReadLine());
                        clsProjInfo.blTSVideoPresent = Convert.ToBoolean(sr.ReadLine());
                        clsProjInfo.blFSSImagePresent = Convert.ToBoolean(sr.ReadLine());
                        clsProjInfo.blFSSAudioPresent = Convert.ToBoolean(sr.ReadLine());
                        clsProjInfo.blFSSVideoPresent = Convert.ToBoolean(sr.ReadLine());
                        clsProjInfo.intTotalQuestions = Convert.ToInt32(sr.ReadLine());
                        clsProjInfo.intTotalMediaItems = Convert.ToInt32(sr.ReadLine());
                        clsProjInfo.intTotalCategories = Convert.ToInt32(sr.ReadLine());
                        clsProjInfo.blTiebreakerPresent = Convert.ToBoolean(sr.ReadLine());
                    }
                }
            }
        }
    }         // <-THIS IS LINE 1320

它抛出了一个缺失方法异常,我在 Internet 上到处寻找修复方法。这是堆栈跟踪:

System.MissingMethodException occurred
  HResult=0x80131513
  Message=Method not found: 'System.IO.Compression.ZipArchive       System.IO.Compression.ZipFile.OpenRead(System.String)'.
  Source=TASv20ClsLib
  StackTrace:
   at TASv20ClsLib.clsOpenStandardProject.OpenStdV20ZipProject(String strfilepath) in C:\Users\Reuben\Documents\Visual Studio 2017\Projects\C# Projects\TRIVIA AUTHOR SUITE V20 PROJECTS 2\TAS v20 Zip Test Jun14 2\TASv20ClsLib\Class1.cs:line 1320
   at Trivia_Author_v20.frmMain.openV20ProjectToolStripMenuItem_Click(Object sender, EventArgs e) in C:\Users\Reuben\Documents\Visual Studio 2017\Projects\C# Projects\TRIVIA AUTHOR SUITE V20 PROJECTS 2\TAS v20 Zip Test Jun14 2\Trivia Author v10 New Approach\frmMain.cs:line 1627
   at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
   at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
   at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
   at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
   at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e,     ToolStripItemEventType met)
   at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
   at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
   at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ToolStrip.WndProc(Message& m)
   at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.Run(Form mainForm)
   at Trivia_Author_v20.Program.Main(String[] args) in C:\Users\Reuben\Documents\Visual Studio 2017\Projects\C# Projects\TRIVIA AUTHOR SUITE V20 PROJECTS 2\TAS v20 Zip Test Jun14 2\Trivia Author v10 New Approach\Program.cs:line 126
4

3 回答 3

3

ZipFile.OpenRead(string)方法仅在 .NET 4.5 中添加。它在以前的版本中不存在。

您的问题不清楚您的项目针对哪个版本的 .NET,也不清楚您尝试运行它的位置安装了哪个版本的 .NET,但毫无疑问,您的目标是 .NET 4.5 或更高版本,但正在尝试运行代码仅安装了旧版本的 .NET。

要解决此问题,请确保在要运行代码的计算机上安装了 .NET 4.5,或者使用旧 API。例如,您可以轻松编写自己的OpenRead(string)方法:

ZipArchive OpenRead(string filename)
{
    return new ZipArchive(File.OpenRead(filename), ZipArchiveMode.Read);
}
}
于 2017-06-16T21:13:44.130 回答
2

这是 .Net Framework 4.6x 版本中引入的一系列绑定问题的一部分。它可能在某个地方有效,但在其他地方无效。

其中大部分是他们在 4.6.1 和 4.7.1 之间遇到的相关绑定重定向问题。在 4.7.2 中修复。这些问题通常在使用框架和引用 .Net 标准包时表现出来

它在这个框架问题中得到解决: https ://github.com/dotnet/corefx/issues/7702

最好的选择是在 .Config 文件中使用绑定重定向,或者升级到 .Net Framework 4.7.2 或更高版本

于 2019-05-04T01:41:57.970 回答
-1

在这里我使用了 Ionic,它的工作很好,你可以使用

您需要将 Ionic.zip 导入您的项目。

using (var zip = Ionic.Zip.ZipFile.Read("YourFilePAth"))
{
    <enter code here>
};
于 2017-06-15T10:08:44.027 回答