Xamarin PCLStorage不写/读文本文件

时间:2017-06-22 06:07:20

标签: file xamarin xamarin.forms storage

我正在研究Xamarin.Forms(我猜表单部分是不相关的)应用程序,并尝试使用PCLStorage Xamarin插件将JSON字符串保存到文本文件中。如果没有互联网连接,文本文件将用于缓存数据。

我将插件添加到所有项目(PCL,iOS,Android,UWP)。我将以下代码添加到我的便携式类中。

using PCLStorage;

namespace DailyBibleReading
{
    public class Helper
    {
        // read a text file from the app's local folder
        public static async Task<string> ReadTextFileAsync(string _filename)
        {
            // declare an empty variable to be filled later
            string result = null;

            // see if the file exists
            try
            {
                // get hold of the file system
                IFolder rootFolder = FileSystem.Current.LocalStorage;

                // create a folder, if one does not exist already
                //IFolder folder = await rootFolder.CreateFolderAsync("DailyBibleReading", CreationCollisionOption.OpenIfExists);

                // create a file, overwriting any existing file
                IFile file = await rootFolder.CreateFileAsync(_filename, CreationCollisionOption.ReplaceExisting);

                // populate the file with some text
                result = await file.ReadAllTextAsync();
            }
            // if the file doesn't exist
            catch (Exception ex)
            {
                // Output to debugger
                Debug.WriteLine(ex);
            }

            // return the contents of the file
            return result;
        }

        // write a text file to the app's local folder
        public static async Task<string> WriteTextFileAsync(string _filename, string _content)
        {
            // declare an empty variable to be filled later
            string result = null;
            try
            {
                // get hold of the file system
                IFolder rootFolder = FileSystem.Current.LocalStorage;

                // create a folder, if one does not exist already
                //IFolder folder = await rootFolder.CreateFolderAsync("DailyBibleReading", CreationCollisionOption.OpenIfExists);

                // create a file, overwriting any existing file
                IFile file = await rootFolder.CreateFileAsync(_filename, CreationCollisionOption.ReplaceExisting);

                // populate the file with some text
                await file.WriteAllTextAsync(_content);

                result = _content;
            }
            // if there was a problem
            catch (Exception ex)
            {
                // Output to debugger
                Debug.WriteLine(ex);
            }

            // return the contents of the file
            return result;
        }
    }
}

您可能会注意到CreateFolderAsync部分已被注释掉。我觉得不需要在应用程序的文件夹中创建另一个文件夹。不过,我确实尝试了两种方式,以防万一这是一个要求。两种方式都没有用。您可能还注意到LocalStorage正在使用中。我也试过RemoteStorage,结果相同。

当我收到JSON字符串时,我会调用这些方法。

string result = null;

// make the api call
result = await Helper.GetHttpStringAsync("http://www.anti-exe.com/api/dailybiblereading?begindate=" + _begindate + "&enddate=" + _enddate + "&version=" + _version);

string textfile = "ApiResults.txt";
// if there is no content
if (result == null || result == "" || result.Contains("SQLSTATE") == true)
{
    // read content from a pre-existing file
    result = await Helper.ReadTextFileAsync(textfile);
    // Output to debugger
    Debug.WriteLine("Can't connect to the API." + "\r\n" + "Loading from local cache.");
}
else
{
    // write to a cache file
    await Helper.WriteTextFileAsync(textfile, result);
}

这一切看起来都非常简单(更不用说它可以正常使用我的原生Windows 10代码)。尝试并获取JSON。如果没有(没有互联网或API关闭),请从缓存中获取JSON字符串。如果有JSON,请将其写入缓存。

我的假设是它实际上并没有写入文件。我不知道实际检查该文件内容的任何方法(不能只打开记事本并加载它)。

我打开了应用。我关闭了应用程序。我删除了互联网访问。我打开应用程序。完成所有操作后,result为空(result == "")。

1 个答案:

答案 0 :(得分:1)

您的代码中明确说明了问题。

// create a file overwriting any existing file
IFile file = await rootFolder.CreateFileAsync(_filename, CreationCollisionOption.ReplaceExisting);

//创建一个文件覆盖任何现有文件

因此,如果文件存在,那么你就把它扔掉并制作一个新文件。然后,您从新文件中读取文本,那里没有任何内容。您可能想尝试使用CreationCollisionOption.OpenIfExists作为文件打开方法。