Windows 運行時 IRandomAccessStream 介面會在讀過檔案結尾時報告無效位置
將 Windows 隨機訪問流 (IRandomAccessStream) 轉換為託管流時,託管流將預設使用一個緩衝區。當檔案中的最後一個位元組填充到緩衝區中時,該緩衝區會讀過檔案結尾並報告位置不正確。此問題影響使用該位置的所有代碼;例如,當您使用 System.IO.Compression.ZipArchive 類從 Windows 運行時流讀取資料時,就會出現這種情況。
問題發生位置樣本:
Windows.Storage.Pickers.FileOpenPicker fop = new Windows.Storage.Pickers.FileOpenPicker();
fop.FileTypeFilter.Add(".zip");
StorageFile file = await fop.PickSingleFileAsync();
using (System.IO.Stream s = await file.OpenStreamForReadAsync())
{
using (var za = new System.IO.Compression.ZipArchive(s))
{
foreach (var entry in za.Entries) // Fails here.... // Do something here
{
}
}
}
解決此問題的方法:
使用長度為零的緩衝區開啟流。調用 file.OpenReadAsync() 而非 file.OpenStreamForReadAsync() 方法,然後對產生的 Windows 運行時流調用 AsStreamForRead(0)。
例如:
using (var ws = await file.OpenReadAsync())
{
using (var s = ws.AsStreamForRead(0))
{
using (var za = new System.IO.Compression.ZipArchive(s)) // This will now work correctly.
{
// Do something here
}
}
}