簡體   English   中英

C#ZipArchive丟失數據

[英]C# ZipArchive losing data

我正在嘗試將一個Excel文件的內容復制到另一個Excel文件,同時替換副本中文件內部的字符串。 它在大多數情況下都可以正常工作,但是文件丟失了27 kb的數據。 有什么建議么?

public void ReplaceString(string what, string with, string path) {
    List < string > doneContents = new List < string > ();
    List < string > doneNames = new List < string > ();
    using(ZipArchive archive = ZipFile.Open(_path, ZipArchiveMode.Read)) {
        int count = archive.Entries.Count;
        for (int i = 0; i < count; i++) {
            ZipArchiveEntry entry = archive.Entries[i];

            using(var entryStream = entry.Open())
            using(StreamReader reader = new StreamReader(entryStream)) {
                string txt = reader.ReadToEnd();
                if (txt.Contains(what)) {
                    txt = txt.Replace(what, with);
                }
                doneContents.Add(txt);
                string name = entry.FullName;
                doneNames.Add(name);
            }
        }
    }

    using(MemoryStream zipStream = new MemoryStream()) {
        using(ZipArchive newArchive = new ZipArchive(zipStream, ZipArchiveMode.Create, true, Encoding.UTF8)) {
            for (int i = 0; i < doneContents.Count; i++) {
                int spot = i;
                ZipArchiveEntry entry = newArchive.CreateEntry(doneNames[spot]);

                using(var entryStream = entry.Open())
                using(var sw = new StreamWriter(entryStream)) {
                    sw.Write(doneContents[spot]);
                }
            }
        }

        using(var fileStream = new FileStream(path, FileMode.Create)) {
            zipStream.Seek(0, SeekOrigin.Begin);
            zipStream.CopyTo(fileStream);
        }
    }
}

我使用了Microsoft的DocumentFormat.OpenXML和Excel Interop,但是它們都缺少一些我需要的主要組件。

更新:

using(var fileStream = new FileStream(path, FileMode.Create)) {
    var wrapper = new StreamWriter(fileStream);
    wrapper.AutoFlush = true;
    zipStream.Seek(0, SeekOrigin.Begin);
    zipStream.CopyTo(wrapper.BaseStream);
    wrapper.Flush();
    wrapper.Close();
}

在不更改字符串的情況下嘗試該過程,並查看文件大小是否相同。 如果是這樣,則您的副本似乎可以正常工作,但是正如Marc B建議的那樣,壓縮后,即使很小的更改也可能導致整體大小的較大更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM