无法使用 PCLStorage 或 Xamarin Forms Labs 在 Android 文件系统中创建文件夹/文件

Posted

技术标签:

【中文标题】无法使用 PCLStorage 或 Xamarin Forms Labs 在 Android 文件系统中创建文件夹/文件【英文标题】:Not able to create a folder/file in Android file system with PCLStorage or Xamarin Forms Labs 【发布时间】:2015-05-20 23:12:21 【问题描述】:

我正在使用 Xamarin 平台开发一个 android 应用程序,并且我试图在我的本地存储上创建一个文件夹,但我没有成功。

首先,我尝试通过 Xamarin Forms Labs 创建的 FileManager 类使用 System.IO 命名空间。我传递“/storage/emulated/0/`”路径的函数的 sn-p。

        public void CreateDirectory(string path)
        
            this.isolatedStorageFile.CreateDirectory(path);
        

        public Stream OpenFile(string path, FileMode mode, FileAccess access)
        
            return (Stream)this.isolatedStorageFile.OpenFile(path, (System.IO.FileMode)mode, (System.IO.FileAccess)access);
        

这不起作用,因此我选择使用 PCLStorage 库进行跨平台文件操作。我试过这段代码。

IFolder rootFolder = FileSystem.Current.LocalStorage;
folder = await rootFolder.CreateFolderAsync("wakesocial",
                CreationCollisionOption.OpenIfExists);

没用。我导航到内部存储的根目录,但没有看到该文件夹​​。

所以错误似乎并没有因为正在使用的库而发生,而是特定于 Android 的。我已经在清单中读取和写入外部存储。所以问题是。应用程序是否有权在存储设备的根级别创建文件或文件夹,或者是否必须在特定位置(例如 Android/data/packagename)创建文件或文件夹

【问题讨论】:

如果您在清单中设置了读/写权限,那么您应该没有任何理由不能在根 sdcard 路径中创建目录或文件。您提供给CreateDirectory() 的路径是什么? EG:您使用的是 System.Environment.SpecialFolder 文件夹类型之一吗? 还有,isolatedStorageFile是什么数据类型? @MattR System.IO.IsolatedStorage 啊,是的,我错过了您问题的 PCL 部分。 System.Environment.SpecialFolder 在 PCL 中不可用。 好的,我删除了它,因为我知道它不可用。我将它设置在一个 android 应用程序的变量中,然后使用该路径,看看它是否有效。 【参考方案1】:
string folderPath = Environment.ExternalStorageDirectory.AbsolutePath; //Android     

   public async Task PCLGenaratePdf(string folderPath )
    
        IFolder rootFolder = await FileSystem.Current.GetFolderFromPathAsync(folderPath );
        IFolder folder = await rootFolder.CreateFolderAsync("folder", CreationCollisionOption.OpenIfExists);
        IFile file = await folder.CreateFileAsync("file.pdf", CreationCollisionOption.ReplaceExisting);
    

【讨论】:

谢谢你的回复 Iceburg,我再试一次,让你知道。如果它正在工作,它不会被选为答案? 在我的 happy.xaml.cs 中添加 IFolder 需要什么命名空间? @AshishJain 添加 PCL 存储 nuget 包 你能告诉我那个金块包的确切名称吗?会很有帮助的。 它正在工作,我在某些时候犯了一个错误,现在它正在工作,还有一件事我需要问你正在经过的路径是什么?是文件夹路径吗?如果是,那么您如何获取文件夹路径?此行不适用于我获取路径字符串 path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);【参考方案2】:

经过大量尝试,我用这个解决了这个问题

        string rootPath = Android.App.Application.Context.GetExternalFilesDir(null).ToString();

        var filePathDir = Path.Combine(rootPath, "Folder");

        if (!File.Exists(filePathDir))
        
            Directory.CreateDirectory(filePathDir);
        

创建的文件夹可通过 adb @ /sdcard/Android/Data/Folder 或类似的东西访问,或者在设备内存中访问 @ /Android/data/>/files/Folder

【讨论】:

【参考方案3】:

在 Android 上,PCL 存储的 LocalStorage 文件夹 corresponds to the "My Documents" Special Folder。

我不确定您要在哪个路径中创建文件夹,但如果您知道路径并想使用 PCL 存储,您应该可以使用FileSystem.Current.GetFolderFromPathAsync 获取 PCL 存储 @987654323 @ 对应于现有文件夹。

【讨论】:

以上是关于无法使用 PCLStorage 或 Xamarin Forms Labs 在 Android 文件系统中创建文件夹/文件的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Pcl Storage 在 Xamarin 表单中读取文件

Xamarin,如何使用 WebView 浏览 lokala 文件,(不是预装文件)

PCL将图像文件保存到本地文件系统

无法在 Xamarin iOS 应用程序中将文本共享到电子邮件或短信中

发生一个或多个错误。 (无法解析 TLS 数据包头)C# Xamarin Android Project Visual Studio

无法创建没有列错误的表Xamarin SQLite