本地文件存储会自动删除内容

时间:2013-02-16 13:35:36

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

    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但仍有同样的问题。

2 个答案:

答案 0 :(得分:0)

杰瑞指出,这可能是一个锁定问题。它也可能是竞争条件(我们没有看到您调用这些方法的代码,因此请确保在另一个已经运行时无法调用它)。

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

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

答案 1 :(得分:0)

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