2012-11-09 50 views
2

我正在VS2012,WinRT和C#中工作。無法使用DeleteAsync刪除文件

我試圖在解壓縮後刪除一些文件。我收到「訪問被拒絕」錯誤。如果我停止該應用程序並重新啓動它,則相同的代碼可以正常工作,因此看起來仍有附加的句柄。

如果我不調用unZipFile方法,我可以刪除這些文件。

有沒有確定的方法來釋放文件?我在刪除調用之前將它設置爲null(file = null;)。

下面是調用解壓方法的代碼塊:

StorageFile file = await CreateOutputFile(fileName, path); 

     MemoryStream theMemStream = new MemoryStream(); 

     theMemStream.Write(bytes, 0, bytes.Length); 

     await FileIO.WriteBytesAsync(file, bytes); 

     await theMemStream.FlushAsync(); 
     theMemStream.Dispose(); 

     var result = await unZipFile(file, path); 

     file = null; 

這裏的unZipFile方法:

 private async Task<string> unZipFile(StorageFile file, string path) 
     { 

     StorageFolder sf = await GetOutputFolder(path); 

    using (var zipStream = await file.OpenStreamForReadAsync()) 
    { 
     using (MemoryStream zipMemoryStream = new MemoryStream((int)zipStream.Length)) 
     { 

      await zipStream.CopyToAsync(zipMemoryStream); 

      try 
      { 
       var archive = SharpCompress.Archive.ArchiveFactory.Open(file.Path); 

       foreach (var entry in archive.Entries) 
       { 
        entry.WriteTo(zipMemoryStream); 

        Stream fileData = entry.OpenEntryStream(); 

        StorageFile outputFile = await sf.CreateFileAsync(entry.FilePath, CreationCollisionOption.ReplaceExisting); 

        using (Stream outputFileStream = await outputFile.OpenStreamForWriteAsync()) 
        { 
         await fileData.CopyToAsync(outputFileStream); 
         await outputFileStream.FlushAsync(); 
         outputFileStream.Dispose(); 
        } 
       } 
       archive = null; 
      } 
      catch (Exception ex) 
      { 
       throw new IOException("Error writing decompressed output file: " + ex.Message); 
      } 

      await zipStream.FlushAsync(); 
      zipStream.Dispose(); 

      await zipMemoryStream.FlushAsync(); 
      zipMemoryStream.Dispose(); 
     } 
    } 

    return "success"; 
} 

這裏的刪除方法。這是在解壓後爲每個文件調用的:

private async Task<string> deleteFile(string path, string filename) 
{ 
    StorageFolder folder = await GetOutputFolder(path); 

    var files = await folder.GetFilesAsync(); 

    foreach (StorageFile file in files) 
    { 
     try 
     { 
      if (file != null) 
      { 
       if (file.Name == filename) 
        await file.DeleteAsync(); 
      } 
     } 
     catch (Exception ex) 
     { 
      return ex.Message; 
     } 
    } 
    return "success"; 
} 

回答

3

什麼文件會得到異常,提取的文件或zip歸檔文件本身?

如果是後者的情況下,ArchiveFactory.Open()返回IArchive它繼承IDisposable,所以應該在一個塊using所以它被使用後廢棄包var archive = SharpCompress.Archive.ArchiveFactory.Open(file.Path);

+1

就是這樣!非常棒。我會給你一個點擊,但它不會讓我因爲我還沒有足夠的積分。我會盡快做到。 – CodeChops