2017-01-27 154 views
1

我發現了一個類似question礦,但遺憾的是它沒有一個答案了。C#創建文件StorageFile.DeleteAsync失敗0X80070005 E_ACCESSDENIED

我使用StorageFile類在C#創建,寫,然後重複刪除文件。在我的第二次迭代中,它無法創建文件,返回拒絕訪問錯誤。

下面是一個簡單的單元測試,我放在一起在Visual Studio 2015年來演示該問題:

[TestMethod] 
public async Task DeleteTest() 
{ 
    StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder; 
    byte[] array = System.Text.Encoding.ASCII.GetBytes("Test data"); 

    int i = 1, max = 20; 
    string phase = "not started"; 
    try 
    { 
     do 
     { 
      // create file 
      phase = "creating"; 
      StorageFile file = await folder.CreateFileAsync("test" /*,CreationCollisionOption.GenerateUniqueName*/); 

      // write data to the file 
      phase = "opening"; 
      System.IO.Stream stream = await file.OpenStreamForWriteAsync(); 

      phase = "writing"; 
      await stream.WriteAsync(array, 0, array.Length); 

      phase = "flushing"; 
      await stream.FlushAsync(); 

      // delete file 
      phase = "deleting"; 
      await file.DeleteAsync(); 
     } while (++i <= max); 
    } 
    catch(Exception e) 
    { 
     Assert.Fail("While '{0}' on iteration {1}: {2}", phase, i, e.Message); 
    } 
} 

以上火災斷言,報告:

雖然 '打造' 的迭代2:訪問被拒絕。 (異常來自HRESULT :0X80070005(E_ACCESSDENIED))

如果任何人都可以讓我知道我做錯了,我會很感激的。我憑我的智慧結束了這一切。

+0

你肯定'伺機file.DeleteAsync();'已'的等待folder.CreateFileAsync'下一次迭代之前完成? – Prajwal

+0

不,我不是。看起來好像還沒有完成,因爲我得到了訪問被拒絕的錯誤。但我期望'await'操作符可以使程序執行等待,直到文件被刪除。 – Jeff

+0

我想刪除文件之前,你應該先'的Dispose()'的System.IO.Stream對象。建議清理該對象使用的資源。這也可以解決ACCESSDENIED的問題。 – crazyGamer

回答

0

某些庫功能,如文件流訪問化妝用的非託管資源,那一定是對象的句柄之前正確地清理可以被摧毀。這避免了情況,比如當文件在後臺打開的程序執行完畢後也並防止它們被修改等

System.IO情況及相關功能,微軟recommends您致電Dispose()Close()方法完全一樣。你的情況,這是最有可能的是,文件不能成功,因爲它是通過Stream對象開放刪除。

因此,在Flush()之後加上Dispose()就可以解決問題了。

注:Dispose()自動調用Flush(),這樣的顯式調用是多餘的。