Я пытаюсь скопировать содержимое одного файла 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();
}
у вас отсутствуют какие-либо данные? Вы сжимаете, поэтому при изменении данных внутри вы получите разные размеры файлов. –
Я фактически меняю текст с «Template_x_1» на «Template_x_2» –
Есть ли проблема, отличная от «размеры файла разные»? Если это единственная проблема, радоваться в 27 тыс. Спасенных! – spender