Windows中的DeleteAsync fileStorage出错创建更新

时间:2017-10-23 15:46:15

标签: windows uwp windows-10

升级到windows fall创建我的应用程序有问题,当删除文件时,它给了我一个例外:

  

System.IO.FileLoadException:'进程无法访问该文件,因为它正由另一个进程使用。 (来自HRESULT的异常:0x80070020)'

首先将文件复制到我的目录然后删除:

protected override async void OnNavigatedTo(NavigationEventArgs e)
    {
        if (e.Parameter != null)
        {
             folder = ApplicationData.Current.LocalFolder;
             this.myfile= e.Parameter as MyFile;

             this.view = await this.myfile.CopyAsync(folder, this.myfile.Name, NameCollisionOption.ReplaceExisting);
        }
    }

之前离开视图:

 protected override async void OnNavigatedFrom(NavigationEventArgs e)
    {
        await this.view.DeleteAsync();
    }

在Windows创建中更新此工作,在windows fall创建更新中无效。

更新: 我已经分析了错误,这是由于使用了PdfDocument库。

var folder = ApplicationData.Current.LocalFolder;
StorageFile file = await folder.GetFileAsync("temp.pdf");
using (IRandomAccessStream filestream = await file.OpenAsync(FileAccessMode.ReadWrite))
{

}
var pdfDocument = await PdfDocument.LoadFromFileAsync(file);
using (IRandomAccessStream filestream1 = await file.OpenAsync(FileAccessMode.ReadWrite))
{

}

1 个答案:

答案 0 :(得分:0)

  

仅当我使用OpenAsync(文件访问模式.ReadWrite)打开文件时才会发生错误; ,如果我用同一个文件打开视图两次,我会收到错误

如果您的意思是打开文件两次而不处理第一个流,如下面的代码片段所示,它会抛出您在线程中描述的异常。

await temp.OpenAsync(FileAccessMode.ReadWrite);
await temp.OpenAsync(FileAccessMode.ReadWrite);
  

也许我需要一种关闭文件的方法?

如您所述,您需要调用dispose方法以允许将Stream使用的资源重新分配用于其他目的。在调用dispose方法之前,流不会自动释放,因此您无法再次打开文件流。例如,您应该将代码段更新为:

StorageFile temp = await ApplicationData.Current.LocalFolder.CreateFileAsync("test.txt", CreationCollisionOption.ReplaceExisting);
IRandomAccessStream stream = await temp.OpenAsync(FileAccessMode.ReadWrite);
stream.Dispose(); 
IRandomAccessStream streamtwice= await temp.OpenAsync(FileAccessMode.ReadWrite);
streamtwice.Dispose();

Using statement提供了一种方便的语法,可确保正确使用IDisposable个对象。建议使用using语句,代码如下:

StorageFile temp = await ApplicationData.Current.LocalFolder.CreateFileAsync("test.txt", CreationCollisionOption.ReplaceExisting);
using (IRandomAccessStream stream = await temp.OpenAsync(FileAccessMode.ReadWrite))
{
}