【UWP开发】uwp如何在win10和xbox one本地保存存档

使用说明

uwp官方是建议通过xboxlive保存存档的,如果需要使用本地存档的接口,使用如下方法。


读取存档

*导入命名空间

using Windows.Foundation;
using Windows.Storage;
using Windows.System;

*读取存档接口

public void LoadData(string userId,System.Action<string> successHandle,System.Action<string> failHandle)
    {
        StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
        IAsyncOperation<StorageFile> saveFileAsync = storageFolder.GetFileAsync(GetSaveDataFileName(userId));
        saveFileAsync.Completed = (IAsyncOperation<StorageFile> info, AsyncStatus status) =>
        {
            if (status == AsyncStatus.Completed)
            {
                StorageFile saveFile = info.GetResults();
                IAsyncOperation<string> readAsync = FileIO.ReadTextAsync(saveFile);
                    readAsync.Completed = (IAsyncOperation<string> readInfo, AsyncStatus readStatus) =>
                {
                    if (readStatus == AsyncStatus.Completed)
                    {
                        string data = readInfo.GetResults();
                        if (successHandle != null)
                        {
                            successHandle(data);
                        }
                    }
                };
            }
            else
            {
                if (failHandle != null)
                {
                    failHandle("");
                }
            }
        };
    }


保存存档

public void SaveData(string userId, string data, System.Action successHandle, System.Action<string> failHandle)
    {
        StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
        IAsyncOperation<StorageFile> saveFileAsync = storageFolder.CreateFileAsync(GetSaveDataFileName(userId),CreationCollisionOption.ReplaceExisting);
        saveFileAsync.Completed = (IAsyncOperation<StorageFile> info, AsyncStatus status) =>
        {
            Debug.Log("SaveStatus:" + status.ToString());
            if (status == AsyncStatus.Completed)
            {
                StorageFile saveFile = info.GetResults();
                IAsyncAction writeAsync = FileIO.WriteTextAsync(saveFile, data);
                writeAsync.Completed = (IAsyncAction writeInfo, AsyncStatus writeStatus) =>
                {
                    if (writeStatus == AsyncStatus.Completed)
                    {
                        if (successHandle != null)
                        {
                            successHandle();
                        }
                    }
                    else
                    {
                        if (failHandle != null) failHandle("");
                    }
                };
            }
            else
            {
                if (failHandle != null) failHandle("");
            }
        };
    }

    string GetSaveDataFileName(string userId)
    {
        return "LittleTriangle.sav";
        //奇怪的是不能使用后面的文件命名
        //if (string.IsNullOrEmpty(userId))
        //{
        //return "LittleTriangle.sav";
        //}
        //else {
        //    return userId + ".sav";
        //}
    }

遇到的问题:

●编译之后触发存档,提示存档成功,再次读档却读不到?

原来每次编译会自动先把之前的应用卸载掉,之前的存档也就没了...


●存档路径位置?

C:\Users\用户名\AppData\Local\Packages\应用包名xxx\LocalState\LittleTriangle.sav


●存档名字规范?

这个是最让我困惑的,我命名成LittleTriangle_【userId】.sav,或者【userId】.sav(【userId】为获取的玩家id),提示我存档失败,也就是应该是userId有一些不符合规范的符号,所以不能存档。


●官方文档的写法提示报错?

官方文档的写法是通过wait等待,发现在项目中这样写会报错。猜测因为官方是XAML而我是D3D。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章