【问题标题】:local file storage deletes content automatically本地文件存储自动删除内容
【发布时间】:2013-02-16 13:35:36
【问题描述】:
    public static async Task SaveFileAsync(string FileName, T data)
    {
        MemoryStream memStream = new MemoryStream();
        DataContractSerializer serializer = new DataContractSerializer(typeof(T));
        serializer.WriteObject(memStream, data);

        StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(FileName,
            CreationCollisionOption.ReplaceExisting);
        using (Stream stream = await file.OpenStreamForWriteAsync())
        {
            memStream.Seek(0, SeekOrigin.Begin);
            await memStream.CopyToAsync(stream);
            await stream.FlushAsync();
        }
    }

    public static async Task<T> RestoreFileAsync(string FileName)
    {
        T result = default(T);
        try
        {
            StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(FileName);
            using (IInputStream inStream = await file.OpenSequentialReadAsync())
            {
                DataContractSerializer serializer = new DataContractSerializer(typeof(T));
                result = (T)serializer.ReadObject(inStream.AsStreamForRead());
                return result;
            }
        }

        catch (FileNotFoundException)
        {
            return default(T);
        }
    }

我正在使用此代码来保存和检索我的数据,它工作正常。

将我的数据保存到这个本地文件并启动我的应用程序后,有时没有数据。

我将我的数据保存为.xml 文件。

我每次保存时都会检查文件,它有已保存的内容。 但有时它会删除它,我不知道为什么。

我试过DataContractJsonSerializer 仍然有同样的问题。

【问题讨论】:

  • 文件是空的还是被删除了? **什么时候**会发生这种情况?可以边看文件边运行应用吗?
  • 不,文件是空的,当我恢复它删除它的数据时会发生这种情况,而不是所有时候,只是有时,有时它会保存我保存的数据。
  • 这通常是一个锁定问题。这篇文章有帮助吗? blog.jerrynixon.com/2013/02/…

标签: c# windows-8 xml-serialization windows-runtime


【解决方案1】:

正如 Jerry 所指出的,这可能是一个锁定问题。这也可能是一种竞争条件(我们看不到您调用这些方法的代码,因此请确保在另一个已经运行时不能调用其中一个)。

我看到的一个潜在领域是这两行:

storageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(FileName,
        CreationCollisionOption.ReplaceExisting);
    using (Stream stream = await file.OpenStreamForWriteAsync())

在此代码中,您需要在一个步骤中创建文件(必要时覆盖),然后在另一个步骤中打开文件。您正在等待,所以我在这里没有看到任何问题,但是如果您最终得到一个空文件,那么这两行之间可能会出现故障,这是有道理的。事实证明,OpenStreamForWriteAsync 的重载允许您在文件不存在时创建文件,如果文件存在则覆盖它。您可以将这两个步骤合二为一。

http://msdn.microsoft.com/en-us/library/hh582148.aspx

最后(我认为这与您的问题无关)您可以完全跳过内存流。 DataContractSerializer 可以直接写入 FileStream 就好了。不妨为自己节省几行代码和内存占用。

我希望这会有所帮助。如果您弄明白了,请告诉我们。

开发支持、设计支持和更多精彩即将推出:http://bit.ly/winappsupport

【讨论】:

    【解决方案2】:

    我在我的项目中遇到了同样的问题。我在调用 SaveFileAsync 之前添加了 await 关键字。我不再在 App.xaml.cs 的 OnSuspending 处理程序中调用此方法,它现在可以工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 2020-03-22
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      相关资源
      最近更新 更多