2015-08-17 3 views
0

Я пытаюсь скопировать содержимое одного файла Excel в другой файл Excel при замене строки внутри файла на копии. Он работает по большей части, но файл теряет 27 kb данных. Какие-либо предложения?C# ZipArchive loss data

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); 
     } 
    } 
} 

Я использовал DocumentFormat.OpenXML Microsoft и Excel Interop, однако, они оба не хватает нескольких основных компонентов, которые мне нужны.

Update:

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(); 
} 
+0

у вас отсутствуют какие-либо данные? Вы сжимаете, поэтому при изменении данных внутри вы получите разные размеры файлов. –

+0

Я фактически меняю текст с «Template_x_1» на «Template_x_2» –

+0

Есть ли проблема, отличная от «размеры файла разные»? Если это единственная проблема, радоваться в 27 тыс. Спасенных! – spender

ответ

0

Попробуйте процесс без изменения строки и посмотреть, если размер файла совпадает. Если это так, то кажется, что ваша копия работает правильно, однако, как предположил Марк B, при сжатии даже небольшое изменение может привести к большему изменению общего размера.

+0

Я вынул замену строки, поэтому никаких изменений не было, но я все еще оставался с той же проблемой. –

+0

Вы пробовали с другими вариантами файла и всегда ли он потерян 27k? Если это так, что бы некоторые из буфера потока не были сброшены в файл в конце процесса. – Setherith

+0

Да Я пробовал другие варианты файла. Это хороший момент, где бы вы порекомендовали сделать сброс буфера потока? –