繁体   English   中英

XML 文件来自 ZIP 存档在 C# 中不完整

[英]XML file from ZIP Archive is incomplete in C#

我处理过存储在 ZIP 存档中的大型 XML 文件(~1000000 行,34mb)。 XML 文件在运行时用于存储和加载应用程序设置和测量值。 加载了这个 function:

 public static void LoadFile(string path, string name)
    {
        using (var file = File.OpenRead(path))
        {
            
            
            using (var zip = new ZipArchive(file, ZipArchiveMode.Read))
            {
                var foundConfigurationFile = zip.Entries.First(x => x.FullName == ConfigurationFileName);

                using (var stream = new StreamReader(foundConfigurationFile.Open()))
                {
                    var xmlSerializer = new XmlSerializer(typeof(ProjectConfiguration));
                    var newObject = xmlSerializer.Deserialize(stream);
                    CurrentConfiguration = null;
                    CurrentConfiguration = newObject as ProjectConfiguration;
                    AddRecentFiles(name, path);
                }
            }

        }
    }

这在大多数时间都有效。 但是,有些文件没有读到最后,我得到一个错误,该文件包含无效的 XML。我用过

foundConfigurationFile.ExtractToFile();

并发现读取的文件停在 ~800000 行。 但这只发生在这段代码中。 当我通过编辑器打开文件时,一切都在那里。 看起来 zip 没有正确加载,或者就此而言,没有完全加载。 我是否有一些限制? 或者我的代码中是否存在我没有发现的错误?

该文件通过以下方式保存:

 using (var file = File.OpenWrite(Path.Combine(dirInfo.ToString(), fileName.ToString()) + ".pwe"))
        {
            var zip = new ZipArchive(file, ZipArchiveMode.Create);
            var configurationEntry = zip.CreateEntry(ConfigurationFileName, CompressionLevel.Optimal);
            var stream = configurationEntry.Open();
            var xmlSerializer = new XmlSerializer(typeof(ProjectConfiguration));
            xmlSerializer.Serialize(stream, CurrentConfiguration);
            stream.Close();
            zip.Dispose();
        }

更新:

问题是 File.OpenWrite() 方法。 如果您尝试使用此方法覆盖文件,如果新文件比旧文件短,则会导致旧文件和新文件混合。 File.OpenWrite() 按照文档中的说明首先截断旧文件

为了正确地做到这一点,有必要使用 File.Create() 方法。 因为此方法首先截断旧文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM