有人可以告訴我我的代碼有什么問題嗎?我想將多個 xml 壓縮到一個檔案中,但結果檔案始終為空。
using (MemoryStream zipStream = new MemoryStream())
{
using (ZipArchive zip = new ZipArchive(zipStream, ZipArchiveMode.Create, true))
{
string[] xmls = Directory.GetFiles(@"c:\temp\test", "*.xml");
foreach (string xml in xmls)
{
var file = zip.CreateEntry(xml);
using (var entryStream = file.Open())
using (var streamWriter = new StreamWriter(entryStream))
{
streamWriter.Write(xml);
}
}
}
using (FileStream fs = new FileStream(@"C:\Temp\test.zip", FileMode.Create))
{
zipStream.Position = 0;
zipStream.CopyTo(fs);
}
}
uj5u.com熱心網友回復:
請參閱檔案中的注釋(強調我的):
entryName 字串應該反映您要在 zip 存檔中創建的條目的相對路徑。您提供的字串沒有限制。但是,如果未將其格式化為相對路徑,則會創建條目,但在提取 zip 存檔的內容時可能會出現例外。如果存檔中已存在具有指定路徑和名稱的條目,則會創建具有相同路徑和名稱的第二個條目。
您在這里使用的是絕對路徑:
var file = zip.CreateEntry(xml);
我的猜測是,當您嘗試打開存檔時,它會默默地顯示條目失敗。
更改代碼以使用不帶路徑的檔案名:
var file = zip.CreateEntry(Path.GetFileName(xml));
作為一個單獨的問題,請注意您只是將檔案名寫入 ZIP 條目,而不是實際檔案。我想你想要這樣的東西:
var zipEntry = zip.CreateEntry(Path.GetFileName(xml));
using (var entryStream = file.Open())
{
using var fileStream = File.OpenRead(xml);
fileStream.CopyTo(entryStream);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/465793.html
下一篇:除錯谷歌應用腳??本
