无法使用Xamarin在Android上创建文件

cod*_*nd1 11 c# android xamarin.android xamarin

我有一个适用于Android的Xamarin-Studio应用程序,我只想下载文件并在本地保存.但是当我尝试在files文件夹中创建一个文件时,我得到一个例外:

File.Create("data/data/com.company.app/files/newFile.png");
Run Code Online (Sandbox Code Playgroud)

给我:

System.UnauthorizedAccessException
Access to the path 'data/data/com.company.app/files/newFile.png' is denied.
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

SKa*_*all 16

您应该使用Environment或IsolatedStorage.例如:

var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
var filename = Path.Combine(path, "newFile.png");
Run Code Online (Sandbox Code Playgroud)


小智 7

我正在用VS2013编写Xamarin代码.对于使用我正在编写的应用程序创建的目录,我有访问被拒绝错误.我的应用程序/storage/emulated/0/POIApp通过连接来创建一个名为的目录:

System.IO.Path.Combine(Android.OS.Environment.ExternalStorageDirectory.Path, "POIApp");
Run Code Online (Sandbox Code Playgroud)

我发现我必须使用VS2013来编辑我的应用程序的"属性"(POIApp),即右键单击解决方案资源管理器中的项目图标; 从弹出菜单中选择属性.VS2013主窗口中会出现一个新选项卡.左侧有几个选项,例如Application,Android Manifest,Android Options,Build等.选择"Android Manifest".在主面板的底部是"必需权限"部分.当我检查"READ_EXTERNAL_STORAGE"和"WRITE_EXTERNAL_STORAGE"时,我的问题解决了.


cod*_*nd1 2

我终于意识到这File.create()不是问题所在。我有这样的代码:

\n\n
string tmpFilePath = FilesDir.AbsolutePath.stringByAppendingPath (f.Path);\nJava.IO.File tmpFile = new Java.IO.File( tmpFilePath);\ntmpFile.Mkdirs ();\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,Mkdirs()不仅像我假设的 \xe2\x80\x93 那样创建所有中间目录 \xe2\x80\x93\xc2\xa0 ,而且还在文件路径本身创建一个目录。因此无法创建该文件,因为已经存在同名目录。\n正确的方法是:

\n\n
string tmpFile = FilesDir.AbsolutePath.stringByAppendingPath (f.Path);\nJava.IO.File tmpParentFolder = new Java.IO.File(tmpFile).getParentFile();\ntmpParentFolder.Mkdirs ();\n
Run Code Online (Sandbox Code Playgroud)\n\n

在我看来,FileExistsAndIsDirectory例外会比UnauthorizedAccessException

\n