Windows RT IRandomAccessStream 介面會在讀過檔案結尾時報告無效位置

來源:互聯網
上載者:User

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

         }

      }

   }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.