【问题标题】:How to close the opened StorageFile?如何关闭打开的 StorageFile?
【发布时间】:2015-10-05 12:26:48
【问题描述】:

我正在编写一个 Windows Phone 8.1 (WINRT XAML) 应用程序

在方法 1 中,我打开一个 StorageFile,在方法 2 中,我在同一个文件上写入。但它在写入文件时显示错误。

  1. 打开并读取内容后如何关闭此文件?
  2. 那么在方法2中写入后如何再次关闭该文件?

    private async Task<bool> Method1(int workOutID)
    {
        string filename = "WorkoutOfflineDataFile.txt";
        StorageFolder LocalStorageFolderObject = ApplicationData.Current.LocalFolder;
        StorageFile StorageFileObject = await LocalStorageFolderObject.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists);
        string JSONFromFile = await FileIO.ReadTextAsync(StorageFileObject);
    }
    
    private async void Method2()
    {
        string filename = "WorkoutOfflineDataFile.txt";
        StorageFolder LocalStorageFolderObject = ApplicationData.Current.LocalFolder;
        StorageFile StorageFileObject = await LocalStorageFolderObject.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists);
        await FileIO.WriteTextAsync(StorageFileObject, JSonData_ToSave);
    }
    

错误:

抛出异常:'System.UnauthorizedAccessException' in mscorlib.ni.dll

附加信息:访问被拒绝。 (HRESULT 的例外情况: 0x80070005 (E_ACCESSDENIED))

【问题讨论】:

  • 请将您的代码粘贴到代码块中。现在它不可读。
  • @Festyk,请立即查看
  • 你是怎么调用这些方法的?
  • @Kristian Vukusic,Page.Loaded 执行方法1,然后当所有任务完成后,执行方法2
  • Method2 不是一个任务,所以如果你从代码中触发它并等待它,程序将不会等待完成它。

标签: c# .net windows-runtime windows-phone-8.1 windows-phone


【解决方案1】:

代码看起来是对的,我认为异常是由其他东西引发的。

无论如何,如果你想确保你的文件和流在读/写操作后被关闭,你可以使用一次性方式:

private async Task<bool> Method1(int workOutID)
{
    string filename = "WorkoutOfflineDataFile.txt";
    StorageFolder LocalStorageFolderObject = ApplicationData.Current.LocalFolder;
    StorageFile StorageFileObject = await LocalStorageFolderObject.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists);
    using (var stream = await StorageFileObject.OpenStreamForReadAsync())
    {
        using (var reader = new StreamReader(stream))
        {
            string JSONFromFile = reader.ReadToEnd();
        }
    }
}

private async void Method2()
{
    string filename = "WorkoutOfflineDataFile.txt";
    StorageFolder LocalStorageFolderObject = ApplicationData.Current.LocalFolder;
    StorageFile StorageFileObject = await LocalStorageFolderObject.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists);
    using (var stream = await StorageFileObject.OpenStreamForWriteAsync())
    {
        using (var writer = new StreamWriter(stream))
        {
            writer.Write(JSonData_ToSave);
        }
    }
}

【讨论】:

    【解决方案2】:

    Festyk 的解决方案有效吗?也许只是尝试使用:

    StorageFile StorageFileObject = await LocalStorageFolderObject.GetFileAsync(filename);
    

    在您的第二种方法中,如果您确定文件已经存在 - 请记住,否则它将引发异常。

    【讨论】:

    • WorkoutOfflineDataFile.txt 在第一种方法中打开。我不知道如何关闭它的处理程序。它不是在方法 2 中打开的。显示,UnauthorizedAccessException
    【解决方案3】:

    你在 method1() 中锁定了文件

    private async Task<bool> Method1(int workOutID)
    {
        string filename = "WorkoutOfflineDataFile.txt";
        StorageFolder LocalStorageFolderObject = ApplicationData.Current.LocalFolder;
        StorageFile StorageFileObject = await LocalStorageFolderObject.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists);
        string JSONFromFile = await FileIO.ReadTextAsync(StorageFileObject);
    }
    

    当您尝试访问 WorkoutOfflineDataFile.txt 时,您实际上是在锁定此文件,因此在关闭之前没有其他线程可以访问它。

    Luca 的回答似乎又好又安全。尝试使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 2022-11-16
      • 2016-01-22
      • 2019-11-20
      相关资源
      最近更新 更多