繁体   English   中英

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

[英]Cannot create files on Android with Xamarin

我有一个适用于 Android 的 Xamarin-Studio 应用程序,我只想下载文件并将它们保存在本地。 但是,当我尝试在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.

我究竟做错了什么?

您应该使用 Environment 或 IndependentStorage。 例如:

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

我正在使用 VS2013 编写 Xamarin。 对于使用我正在编写的应用程序创建的目录,我遇到了拒绝访问错误。 我的应用程序通过以下方式连接创建了一个名为/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.Manifest 文件中添加以下权限

<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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM