1

我发现了一个与我类似的问题,但不幸的是它没有答案。

我在 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);
    }
}

上述断言触发,报告:

在迭代 2 上“创建”时:访问被拒绝。(来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))

如果有人可以让我知道我做错了什么,我将不胜感激。我对此束手无策。

4

1 回答 1

0

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

System.IO相关功能的情况下,Microsoft建议您调用完全执行此操作的Dispose()orClose()方法。在您的情况下,很可能无法成功删除文件,因为它是通过Stream对象打开的。

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

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

于 2017-01-28T12:23:11.370 回答