【问题标题】:GetFileAsync does not return file after saving itGetFileAsync 保存后不返回文件
【发布时间】:2014-12-24 04:35:13
【问题描述】:

我有以下方法,将文件保存到 Windows Phone 上的 LocalFolder

public async Task<bool> SaveValueByKey(string filename, KeyValuePair<string, string> dataToSave)
{
    var appData = ApplicationData.Current;

    // Good Save documentation - http://chriskoenig.net/2012/09/07/windows-8-games-and-roaming-data/
    StorageFile file = await appData.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists);

    try
    {
        // Delete the key if it already exists, then replace.
        IEnumerable<string> content = await this.LoadFileContents(filename);
        if (content.Any(l => l.StartsWith(string.Format("{0}==", dataToSave.Key))))
        {
            await this.DeleteKey(filename, dataToSave.Key);
        }

        await FileIO.WriteTextAsync(file, string.Format("{0}=={1}", dataToSave.Key, dataToSave.Value));
    }
    catch (Exception)
    {
        return false;
    }

    return true;
}

然后我稍后尝试使用此方法加载数据。

public async Task<string> LoadValueFromKey(string filename, string key)
{
    var appData = ApplicationData.Current;
    StorageFile file = null;

    try
    {
        file = await appData.LocalFolder.GetFileAsync(filename);
    }
    catch (FileNotFoundException)
    {
        return string.Empty;
    }
    catch (Exception)
    {
        return string.Empty;
    }

    IEnumerable<string> contents = await this.LoadFileContents(filename);
    string element = string.Format("{0}==", key);
    if (!contents.Any(line => line.StartsWith(element)))
    {
        return string.Empty;
    }

    return contents.First(line => line.StartsWith(element))
        .ToString()
        .Substring(element.Length);
}

GetFileAsync 的调用返回null,即使在CreateFileAsync 调用后返回给我的有效文件对象也是如此。

我在这里遗漏了什么吗?我需要声明吗?我没有看到任何与此相关的内容。

编辑

文件名和键值是从存储库传入的,存储库声明如下:

private const string tokenFilename = "UserSession.dat";

private const string tokenKey = "UserToken";

编辑 2

抛出的异常是带有以下消息的 FileNotFound 异常。

The system cannot find the file specified. (Exception from HRESULT: 0x80070002)

at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at Lifestream.App.Mobile.WindowsApp.Services.FileStorageService.<LoadValueFromKey>d__16.MoveNext()

编辑 3

如果我将应用程序作为 Windows 应用程序(这是通用应用程序)运行,则文件将被保存和加载,没有任何问题。如果我以 Windows Phone 为目标,那么当我尝试保存然后加载时会引发 File Not Found 异常。这似乎是特定于手机的,我不知道为什么

【问题讨论】:

  • 那些catch (Exception) 子句真的很难闻。尝试检查它们以查看它是否在抛出或其他东西,并在任何情况下将它们修复为远不那么普遍和数据丢失。
  • 抛出的异常是 FileNotFound 异常
  • 我遇到的问题是微软没有告诉我这些方法可能会抛出什么异常,所以我只是猜测。我现在使用 Exception,随着单元测试期间异常的增加,我为更具体的异常添加了捕获
  • IOException 对于 I/O 来说是很常见的。但通常最好让你的程序崩溃并在测试中死掉,因为它根本无法处理意外异常,而不是吞下异常并记住记录并放入正确的catch子句。
  • 我不反对,但我的问题是为什么加载文件会引发 FileNotFound 异常,而不是我如何捕获异常。不过感谢您的意见

标签: c# windows-phone-8.1 windows-8.1 storagefile


【解决方案1】:

我能够解决这个问题。问题出在 Windows Phone 项目属性上。属性->调试已选中“卸载然后重新安装我的包”选项,这会删除我每次重新运行应用程序时创建的所有已保存文件。

【讨论】:

    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    相关资源
    最近更新 更多