我发现了一个与我相似的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))
如果有人能让我知道我做错了什么,我会很感激。我的智慧结束了。
答案 0 :(得分:0)
某些库功能(如文件流访问)使用非托管资源,必须在可以销毁对象句柄之前正确清理 。这样可以避免在程序执行完毕后文件在后台打开的情况,并防止它们被修改等等。
如果是System.IO
及其相关功能,则可以使用Dispose()
或Close()
方法调用Microsoft recommends。在您的情况下,由于文件是通过Stream
对象打开的,因此很可能无法成功删除该文件。
因此,在Dispose()
上Flush()
之后添加Stream
可以解决问题。
注意:Dispose()
会自动调用Flush()
,因此显式调用是多余的。