Не удается создать файлы на Android с помощью Xamarin

у меня есть приложение Xamarin-Studio для Android, и я просто хочу загрузить файлы и сохранить их локально. Но когда я пытаюсь создать файл в папке files Папка я получаю исключение:

File.Create("data/data/com.company.app/files/newFile.png");

дает мне:

System.UnauthorizedAccessException
Access to the path 'data/data/com.company.app/files/newFile.png' is denied.

что я делаю не так?

5 ответов


вы должны использовать среду или IsolatedStorage. Например:

var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
var filename = Path.Combine(path, "newFile.png");

я кодирую Xamarin с помощью VS2013. У меня была ошибка отказа в доступе для каталога, созданного с помощью приложения, которое я пишу. Мое приложение создает каталог с именем /storage/emulated/0/POIApp путем объединения через:

System.IO.Path.Combine(Android.OS.Environment.ExternalStorageDirectory.Path, "POIApp");

я обнаружил, что мне пришлось использовать VS2013 для редактирования "свойств" моего приложения (POIApp), т. е. щелкните правой кнопкой мыши значок проекта в обозревателе решений; выберите "свойства" во всплывающем меню. В главном окне VS2013 появится новая вкладка. Слева есть несколько выбор, например, приложение, Манифест Android, параметры Android, сборка и т. д. Выберите "Манифест Android". В нижней части главной панели раздел "необходимые разрешения". Моя проблема была решена, когда я проверил "READ_EXTERNAL_STORAGE"и " WRITE_EXTERNAL_STORAGE".


добавьте следующее разрешение на Android.Файл манифеста

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


я, наконец, понял, что File.create() не было проблемой. У меня был такой код:

string tmpFilePath = FilesDir.AbsolutePath.stringByAppendingPath (f.Path);
Java.IO.File tmpFile = new Java.IO.File( tmpFilePath);
tmpFile.Mkdirs ();

еще, Mkdirs() не только создает все промежуточные каталоги-как я предполагал – но и создает каталог в самом пути к файлу. Поэтому файл не может быть создан, потому что уже существует каталог с таким же именем. Правильный путь:

string tmpFile = FilesDir.AbsolutePath.stringByAppendingPath (f.Path);
Java.IO.File tmpParentFolder = new Java.IO.File(tmpFile).getParentFile();
tmpParentFolder.Mkdirs ();

в свою защиту, в FileExistsAndIsDirectory исключение было бы намного полезнее, чем UnauthorizedAccessException


используя Mono, я думаю, должен быть таким же, как в Xamarin Studio.

var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
File.Create(path + "newFile.png");