Не удается создать файлы на 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");