buco
buco

Reputation: 41

how to correctly read from isolated file in windows phone development

i have this two methods for writting and reading from the file.

    public static async Task WriteDataToFileAsync(string fileName, string content)
    {
        byte[] data = Encoding.Unicode.GetBytes(content);

        var folder = ApplicationData.Current.LocalFolder;
        var file = await folder.CreateFileAsync(fileName, CreationCollisionOption.OpenIfExists);

        using (var s = await file.OpenStreamForWriteAsync())
        {
            await s.WriteAsync(data, 0, data.Length);
        }
    }



    public async static Task<string> ReadFileContentsAsync()
    {
        var folder = ApplicationData.Current.LocalFolder;

        try
        {
            var file = await folder.OpenStreamForReadAsync("MenuData.json");

            using (var streamReader = new StreamReader(file))
            {
                Debug.WriteLine(streamReader.ReadToEnd());
                return streamReader.ReadToEnd();
            }
        }
        catch (Exception)
        {
            return string.Empty;
        }


    }

which are then used in this two methods

    public static async void ApiToFileRestaurants()
    {
        HttpClient client = new HttpClient();
        HttpResponseMessage response = client.GetAsync("http://bonar.si/api/restaurants").Result;
        response.EnsureSuccessStatusCode();
        string responseBody = response.Content.ReadAsStringAsync().Result;
        await Restaurant.WriteDataToFileAsync("MenuData.json", responseBody);


    }

    public async static Task<List<Restaurant>> FileToRestaurantList()
    {
        var responseBody = await Restaurant.ReadFileContentsAsync();
        List<Restaurant> parsedRestaurants = (List<Restaurant>)Newtonsoft.Json.JsonConvert.DeserializeObject(responseBody, typeof(List<Restaurant>));
        return parsedRestaurants;
    }

now my problem here is that ReadFileAsync doesn't return the results which i know are saved in MenuData.json file but instead returns empty string.

I was mostly getting source code for this from msdn documentation.

Location of the file in my wp power tools looks like that. I'm a novice programer so i might overlooked something else

Upvotes: 0

Views: 71

Answers (2)

buco
buco

Reputation: 41

i got the solution from one other forum

You're calling streamReader.ReadToEnd() twice. The first time you log it to the Debug stream, the second is what you actually use as a result. The method moves the file pointer to the end everytime it's called and by the second time there's nothing to read.

so removing that debug line almost fixed my problem. I did get the string i wanted to but there was an error somewhere in it so Newtonsoft.Json had a hard time parsing it. So i tried @asitis solution and changed .json to .text and it worked

Upvotes: 2

CodeNoob
CodeNoob

Reputation: 757

Can you try to read the data from file asyncronously by using ReadToEndAsync which basically parses the complete data and sends response as one string.

var file = await folder.OpenStreamForReadAsync("MenuData.json");
using (var streamReader = new StreamReader(file))
{
   return await streamReader.ReadToEndAsync();
}

Hope this helps!

Upvotes: 2

Related Questions