在StorageFile.DeleteAsync失败后,C#创建文件,其中包含0x80070005 E_ACCESSDENIED

时间:2017-01-27 05:18:34

标签: c# access denied storagefile

我发现了一个与我相似的question,但遗憾的是它没有答案。

我在C#中使用StorageFile类来重复创建,写入和删除文件。在我的第二次迭代中,它无法创建文件,返回拒绝访问错误。

这是一个简单的单元测试,我在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);
    }
}

上面的断言引发了警告:

  

在创造&#39;在迭代2:访问被拒绝。 (例外   HRESULT:0x80070005(E_ACCESSDENIED))

如果有人能让我知道我做错了什么,我会很感激。我的智慧结束了。

1 个答案:

答案 0 :(得分:0)

某些库功能(如文件流访问)使用非托管资源,必须在可以销毁对象句柄之前正确清理 。这样可以避免在程序执行完毕后文件在后台打开的情况,并防止它们被修改等等。

如果是System.IO及其相关功能,则可以使用Dispose()Close()方法调用Microsoft recommends。在您的情况下,由于文件是通过Stream对象打开的,因此很可能无法成功删除该文件。

因此,在Dispose()Flush()之后添加Stream可以解决问题。

注意:Dispose()会自动调用Flush(),因此显式调用是多余的。