Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adroid write to files. #42

Open
sstahurski opened this issue May 25, 2016 · 4 comments
Open

Adroid write to files. #42

sstahurski opened this issue May 25, 2016 · 4 comments

Comments

@sstahurski
Copy link

Having problems writing then reading files Xamarian Android application.

Its the same issue posted to here....
http://stackoverflow.com/questions/21999804/cross-platform-solution-to-isolated-storage-in-pcl/37439443#37439443

I have my permissions set correctly to read/write external storage in my android manifest file.

Reading the data I get this exception
ex {PCLStorage.Exceptions.FileNotFoundException: File does not exist: /data/data/com.bconnect.expo/files…} PCLStorage.Exceptions.FileNotFoundException

This is after the write appears to be successful.

Shouldn't the file name be '/Android/data/com.bconnect.expo/files....' ?

Here is my code, as you can see I'm not doing really anything more than what the examples give

    private async void writeDeviceData ()
    {
        IFolder rootFolder = FileSystem.Current.LocalStorage;

        //load everything into a dictionary
        Dictionary<string,string> expoContents = new Dictionary<string, string>();

                    //omitted.... for size

        //create file
        IFile outFile = await rootFolder.CreateFileAsync("ExpoFile.txt", CreationCollisionOption.ReplaceExisting);

        //write to file
        var strContents = JsonConvert.SerializeObject(expoContents);

        try
        {
            await outFile.WriteAllTextAsync( strContents );

        }
        catch(Exception ex) 
        {

        }

    }

    private async void readDeviceData ()
    {

        IFolder rootFolder = FileSystem.Current.LocalStorage;

        try{
            IFile inFile = await rootFolder.GetFileAsync("Expofile.txt");
            string strContents = inFile.ReadAllTextAsync ().Result;
                              //...omitted for size
            }
        }
        catch ( Exception ex)
        {
            //go out to web service
            reloadSiteData ();
        }

    }
@Blackhex
Copy link

I can confirm this issue on MemoPad 7 with Android 4.4.2.

@Emasoft
Copy link

Emasoft commented Sep 10, 2016

I have the same problem.
On iOS it works fine. But on Android I get the same bug.
On Android I first write the file correctly (I checked with the AndroidDeviceMonitor file browser). So I'm sure that the file is there and the path is correct. Then I load it from the cache, and then I get the file not found error. This is the exception:

GetCachedBadge: PCLStorage.Exceptions.FileNotFoundException: File does not exist: /storage/emulated/0/toolbar/y62d2ke8.ink/36D99203@3x.png
  at PCLStorage.FileSystemFolder+<GetFileAsync>d__6.MoveNext () [0x000bc] in <filename unknown>:0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 
  at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 
  at System.Runtime.CompilerServices.TaskAwaiter`1[TResult].GetResult () [0x00000] in /Users/builder/data/lanes/3540/1cf254db/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:357 
  at ToolbarBadgeSample.Controls.ToolbarItemEx+<GetCachedBadge>c__async2.MoveNext () [0x000bb] in /Users/Admin/Projects/xamarin-samples-12545da4b6e715faedbb247c8a9ffa04f6d7a7e9/ToolbarBadgeSample/ToolbarBadgeSample/ToolbarBadgeSample/Controls/ToolbarItemEx.cs:348 
Could not load image named: {0}: /storage/emulated/0/toolbar/y62d2ke8.ink/36D99203@3x.png

I checked my code, and it is fine. It asks for the correct path and filename.
But the PCLStorage library is not able to found it for some reasons.

@zippo227
Copy link

zippo227 commented May 9, 2017

@Emasoft I'm having a similar issue on uwp. I'm thinking it may have to do with file permissions.

@zippo227
Copy link

zippo227 commented May 9, 2017

@Emasoft I wrote up the bug for UWP, which I supppose is different from your Android bug. issue 58

I was having a bug similar to yours on Android the other day. I think part of it was that I was writing the files in parallell. Once I blocked the write function with a SemaphoreSlim, I was able to read the files after writing them.

private SemaphoreSlim writeLock = new SemaphoreSlim(1, 1);
private async Task<string> CacheFileHelper(string filename, MemoryStream stream)
{
	await writeLock.WaitAsync();

	try
	{
		IFile file;
		file = await FileSystem.Current.LocalStorage.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
		using (var fileStream = await file.OpenAsync(PCLStorage.FileAccess.ReadAndWrite))
		{
			byte[] imgBytes = stream.ToArray();
			await fileStream.WriteAsync(imgBytes, 0, imgBytes.Length);
		}

		string path = file.Path;
		return path;
	}
	catch(Exception ex)
	{
		Console.WriteLine(ex.Message);
	}
	finally
	{
		writeLock.Release();
	}

	return string.Empty;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants