Xamarin 表单:如何在设备外部存储中创建文件夹和文件?

2023-12-05

我正在尝试在设备的外部存储上的该文件夹中创建一个文件夹和一个文本文件。与 WhatsApp 的做法相同。另外,我需要向该文件写入一些数据。

是否可以以 xamarin 形式执行此操作?或者我们应该使用依赖服务吗?

提前致谢

UPDATE

@Lucas 张 - MSFT 我尝试了您的依赖服务,但设备上没有生成文件或文件夹。我不能使用PCLStorage因为我需要在设备外部文件夹中创建文件。

这实际上不是我正在寻找的。我需要先创建一个文件夹,然后在该文件夹上创建一个文本文件。我需要将数据写入该文件而不丢失以前的数据。该文件和文件夹应该在设备文件管理器上可见,因为该文件将由用户使用。

我认为这个接口应该有2个功能。

void CreateFolderAndFile(字符串文件夹名,字符串文件名); //在此功能上,我们需要在设备文件夹上创建一个文件夹和文件(如果尚不存在)。如果它已经存在,则不执行任何操作。

无效WriteDataToFile(字符串数据); //在此函数中,我们需要将数据写入顶部添加的文件中


以 xamarin 形式执行此操作?或者我们应该使用依赖服务吗?

选项1:

当然我们需要使用依赖服务。

在Android项目中

public async Task SaveAndView(string fileName, String contentType, MemoryStream stream)
        {
            try
            {
                string root = null;
                //Get the root path in android device.
                if (Android.OS.Environment.IsExternalStorageEmulated)
                {
                    root = Android.OS.Environment.ExternalStorageDirectory.ToString();
                }
                else
                    root = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

                //Create directory and file 
                Java.IO.File myDir = new Java.IO.File(root + "/meusarquivos");
                myDir.Mkdir();

                Java.IO.File file = new Java.IO.File(myDir, fileName);

                //Remove if the file exists
                if (file.Exists()) file.Delete();

                //Write the stream into the file
                FileOutputStream outs = new FileOutputStream(file);
                outs.Write(stream.ToArray());

                outs.Flush();
                outs.Close();
           }
            catch (Exception ex)
            {
                //...
            }
        }
await DependencyService.Get<ISave>().SaveAndView(xxx.ToString() + ".pdf", "application/pdf", stream);

不要忘记添加以下权限并获得运行时权限。

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

in iOS

iOS 对应用程序对文件系统的操作施加了一些限制,以保护应用程序数据的安全,并保护用户免受恶意应用程序的侵害。这些限制是应用程序沙箱的一部分 - 一组限制应用程序访问文件、首选项、网络资源、硬件等的规则。应用程序仅限于在其主目录(安装位置)内读取和写入文件;它无法访问其他应用程序的文件。

你可以检查docs更多细节 。

选项2:

如果您确实想直接在 Forms 中实现它。我们可以使用该插件PCL存储来自努吉特。

跨平台本地文件夹

在 Xamarin.Form 中,PCL存储API 将帮助我们使用下面给出的代码检索所有平台的本地文件夹名称和路径。无需编写任何特定于平台的代码即可访问本地文件夹。

Using PCLStorage;  

IFolder folder = FileSystem.Current.LocalStorage; 

创建新文件夹

若要在本地文件夹中创建新的子文件夹,请调用 CreateFolderAsync 方法。

string folderName ="xxx" ;  
IFolder folder = FileSystem.Current.LocalStorage;  
folder = await folder.CreateFolderAsync(folderName, CreationCollisionOption.ReplaceExisting);  

创建新文件

若要在本地文件夹中创建新文件,请调用 CreateFileAsync 方法。

string filename=”username.txt”;  
IFolder folder = FileSystem.Current.LocalStorage;  
IFile file = await folder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);  

检查文件夹是否已存在

我们可以检查特定文件夹中是否存在现有文件夹,如下所示。

public async static Task<bool> IsFolderExistAsync(this string folderName, IFolder rootFolder = null)  
     {  
         // get hold of the file system  
         IFolder folder = rootFolder ?? FileSystem.Current.LocalStorage;  
         ExistenceCheckResult folderexist = await folder.CheckExistsAsync(folderName);  
         // already run at least once, don't overwrite what's there  
         if (folderexist == ExistenceCheckResult.FolderExists)  
         {  
             return true;  
  
         }  
         return false;  
     }  

检查文件是否已经存在

我们可以检查特定文件夹中是否存在文件,如下所示。

public async static Task<bool> IsFileExistAsync(this string fileName, IFolder rootFolder = null)  
        {  
            // get hold of the file system  
            IFolder folder = rootFolder ?? FileSystem.Current.LocalStorage;  
            ExistenceCheckResult folderexist = await folder.CheckExistsAsync(fileName);  
            // already run at least once, don't overwrite what's there  
            if (folderexist == ExistenceCheckResult.FileExists)  
            {  
                return true;  
  
            }  
            return false;  
        }  

写入文件

如果要写入任何扩展文件文档,只需使用 WriteAllTextAsync 方法进行写入即可。

public async static Task<bool> WriteTextAllAsync(this string filename, string content = "", IFolder rootFolder = null)  
      {  
          IFile file = await filename.CreateFile(rootFolder);  
          await file.WriteAllTextAsync(content);  
          return true;  
      }  

注意:Android项目中还需要添加权限。

Update

File类提供了创建、删除、读取共享项目中文件的相关方法,但只能访问应用程序文件夹。

File.WriteAllText(fileName, text);
string text = File.ReadAllText(fileName);

要在外部存储中创建文件,请尝试使用DependencyService在本机平台上实现该功能。

1.创建接口定义方法

public interface IAccessFile
{
    void CreateFile(string FileName);
}

2.在android平台上实现服务

[assembly: Xamarin.Forms.Dependency(typeof(AccessFileImplement))]
namespace XamarinFirebase.Droid
{
    public class AccessFileImplement : IAccessFile
    {
        void CreateFile(string FileName)
        {
            string text = "xxx";
            byte[] data = Encoding.ASCII.GetBytes(text);
            string DownloadsPath = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, Android.OS.Environment.DirectoryDownloads);
            string filePath = Path.Combine(DownloadsPath, FileName);
            File.WriteAllBytes(filePath, data);
        }
    }
}

3.消费共享项目中的DependencyService命令

DependencyService.Get<IAccessFile>().CreateFile("myfile.txt");

它不能在 iOS 平台上使用,iOS 对应用程序可以对文件系统执行的操作施加一些限制,以保护应用程序数据的安全。 应用程序仅限于读取和写入其主目录(安装位置)内的文件;它无法访问其他应用程序的文件。

相关教程:

https://learn.microsoft.com/en-us/xamarin/android/platform/files/external-storage?tabs=windows

https://learn.microsoft.com/en-us/xamarin/ios/app-fundamentals/file-system#special-considerations

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xamarin 表单:如何在设备外部存储中创建文件夹和文件? 的相关文章

  • 通过套接字发送包含文件的字典(python)

    是否可以通过套接字发送包含文件 图像或文档 作为值的字典 我尝试了类似下面的东西 但失败了 with open cat jpeg rb as f myFile f read 2048 data id 1283 filename cat jp
  • 如何更改 Xamarin.Forms 中标签的字体系列?

    我尝试使用 CSS 和 XAML 更改标签的字体系列 但字体没有反映 我正在尝试在我的应用程序中使用 Montserrat 字体 我怎样才能解决这个问题 XAML 代码
  • 如何为 GlassFish Web 应用程序提供对外部资源(文件)的访问?

    我是一个有点玻璃鱼 http en wikipedia org wiki GlassFish初学者 所以请原谅我对这个问题的无知 基本上 我们正在为一个游戏网站提供服务 为了使我们的网络应用程序可以下载客户端 我们将其复制到domain1中
  • Device.BeginInvokeOnMainThread 的用途是什么?

    我希望有人向我解释什么是 Device BeginInvokeOnMainThread 以及它的用途是什么 还有一些使用案例的示例 只是添加一个例子 假设你有一个异步方法DoAnyWorkAsync如果你这样称呼它 仅作为示例 DoAnyW
  • 如何通过双击图标来执行JAVA程序?

    我写了一个java程序 现在我想在没有 IDE Eclipse 等的情况下打开我的控制台 java 应用程序 只需双击桌面上的可执行版本即可 我已将 java 项目导出为 Runnable JAR 文件 但无法打开 当我尝试使用cmd打开应
  • 如何在Xamarin.Android上播放默认按钮的声音?

    我正在使用 Xamarin forms 制作一个应用程序 如果您尝试过 您可能会知道表单的按钮不足以用作图像按钮 所以我使用图像作为按钮并添加手势识别器 运行良好 好处是我可以像使用 Image 一样使用所有 Image 的可绑定属性 如
  • 我如何知道文件已打开或正在使用? [复制]

    这个问题在这里已经有答案了 可能的重复 有没有办法检查文件是否正在使用 https stackoverflow com questions 876473 is there a way to check if a file is in use
  • 当前平台不支持桌面 API

    我遇到过这个错误 java lang UnsupportedOperationException 当前平台不支持桌面 API 我将从我的 java 应用程序中打开一个文件 我用这个方法 Desktop getDesktop open new
  • 如何获取 tokio-io 的 async_read 文件句柄

    我想从文件句柄中流式传输行 但我不知道如何满足File has async read use std fs File use std io BufReader BufRead use tokio core reactor Handle us
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • Java - 为什么从文件读取时跳过零

    为什么我的程序在读取文件时忽略零 例如 以下是文件中的数字 0001 0011 0010 然后这是我的输出 1 11 10 这是我的代码 File file new File num txt Scanner scanner new Scan
  • Linux下单个目录下文件过多会怎样?

    如果一个目录中有大约 1 000 000 个单独的文件 大部分大小为 100k 其中没有其他目录和文件 是否会以任何其他可能的方式降低效率或产生缺点 ARG MAX 会对此提出异议 例如 rm rf 在目录中时 会说 参数太多 想要执行某种
  • 如何只读取文件的第一行

    我已经用谷歌搜索了一段时间 但我找不到只读取文件第一行的函数 我需要读取文本文件的第一行并从中提取日期 Perl 新手 open my file lt filename txt my firstLine lt file gt close f
  • 将文件标记为从 Python 中删除?

    在我的一个脚本中 我需要删除当时可能正在使用的文件 我知道我无法删除正在使用的文件 直到它不再使用为止 但我也知道我可以将该文件标记为由操作系统 Windows XP 删除 我将如何在 Python 中做到这一点 以及另一个不依赖于 pyw
  • Bash 目录上的 For 循环

    快速背景 ls src file1 file2 dir1 dir2 dir3 Script bin bash for i in src do if d i then echo i fi done Output src dir1 src di
  • iOS 4.2.1 丢失文件?

    这是我第一次使用最新的 xcode 3 2 5 和新的 iOS 4 2 1 当我在设备上运行应用程序时 我收到以下运行时错误 无法读取 Developer Platforms iPhoneOS platform DeviceSupport
  • 如何将屏幕截图转换为二进制?

    我正在开发一个 Xamarin Forms 项目 在该项目中我想将我的屏幕截图 PNG 转换为二进制并将其上传到服务器 现在服务器部分需要一个API 我将由已经完成它的人交给我 我只需要实现它 在我完成这个任务之后 到目前为止 我已经成功地
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 获取 Cocoa 中文件的类型

    我成功找到了指定文件的扩展文件类型 JPEG 图像 TIFF 图像等 但我正在寻找更通用的东西 可以对 大类别 中的文件进行分类 如图像 moovies 文本文件等 有没有办法在可可 或 Objective C 中实现这一点 感谢您的帮助
  • 扫描目录“User\Documents\My Music”时出现 UnauthorizedAccessException

    问题 为什么我在扫描用户的 我的文档 文件夹时出现此错误 但在扫描 我的音乐 我的图片 我的视频 目录时却没有出现此错误 次要 不太重要的问题 我正在和一位朋友谈论这个问题 他不懂技术 但了解足够的技术来进行对话 他帮助我进一步缩小了这个问

随机推荐

  • selenium webdriver chrome 115 停止工作

    I have 铬 115 0 5790 99安装在 Windows 上 我使用硒4 10 0 在我的 python 代码中我调用服务 服务 ChromeDriverManager install 它返回错误ValueError url 没有
  • 在新安装的 MySQL 上使用以前的 MySQL 数据文件夹

    如果我能做出适当的SQL dump backup我本来会的 但是OS已过期 只能登录SafeMode 我无法启动的地方MySQL server 因此 我只能手动备份文件目录 我有 C ProgramData MySQL MySQL Serv
  • 在 .NET 中,对于 128 位数字,我应该使用什么类型?

    我需要做一些大整数数学运算 是否有任何类或结构可以表示 128 位整数并实现所有常用运算符 顺便说一句 我意识到decimal可以用来表示 96 位 int While BigInteger是大多数应用程序的最佳解决方案 如果您有性能关键的
  • 事件未到达 kurento java 服务器

    我是 Kurento 媒体服务器的新手 我正在尝试将事件从 kurento 媒体服务器发送到我拥有的 java 应用程序 我使用以下步骤创建了一个事件 编辑了interfacejson 文件 events properties name T
  • 约束线性回归/二次规划 python

    我有一个这样的数据集 import numpy as np a np array 1 2 2 3 4 2 b np array 1 5 6 c np array 5 4 6 2 1 9 m np vstack a b c y np arra
  • $(document).ready(function () $ 未定义[重复]

    这个问题在这里已经有答案了 我正在开发 asp net mvc 并使用 Kendo UI 网格控件进行数据检索 将这些功能用于另一个应用程序 但问题不在代码中 所有 JavaScript 和 Kendo grid ui 参考 包括当我运行应
  • “instanceof List”和“o instanceof List”之间的区别

    我认为以下内容没有任何区别 Object o new LinkedList
  • 如果 HTML 文本太大,则添加省略号 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 如果字符串太大 有没有办法在字符串中添加省略号 三个点 例如 From This is a very large sentence To This is a ve 可以使用 PHP
  • 如何使用 Java JDBC 从数据库获取所有触发器名称?

    我想从 Oracle 数据库模式中检索所有触发器名称 我使用 getFunctions 检索所有函数 但找不到另一个触发器 DatabaseMetaData dbmd ResultSet result dbmd getFunctions n
  • 错误:Visual Studio 中未加载 opencv_world310.dll 的符号

    我正在 Visual Studio 2015 中使用 OpenCV 3 1 0 编写程序 大多数操作工作正常 但是 我收到访问冲突错误 我已经调试了该项目 执行faceClassifier load haarcascade frontalf
  • 如何检查数组中每个项目的第一个字母?

    我正在构建一个猪拉丁语翻译器 但我不知道如何识别输入单词的第一个字母 我已将输入转换为数组 其中每个项目都是一个新单词 但是如何选择每个项目的每个第一个字母来确定它是否是辅音 元音 等 a This is a sentence for wo
  • 为什么结构体字段显示为空?

    我正在努力从以下代码中获得正确的输出 package main import encoding json fmt func main var jsonBlob3 byte name Platypus spec Monotremata id
  • android 所有动态生成按钮的点击事件

    我编写代码来生成动态按钮 但我不知道如何动态实现每个按钮的单击事件 我找到了一些答案 但无法使用我的代码 请帮助我 这是我的代码 public class dynamicbuttion extends Activity Override p
  • 如何按需挂起 Java 线程?

    我正在用java开发一个多线程游戏 我有几个工作线程从中央线程管理器获取模块 然后自行执行 现在 如果它暂时没有什么可执行的 我希望能够暂停这样的线程 我尝试从线程管理器调用 wait 方法 但这只会导致它忽略后面的 notificatio
  • 带边框和透明间隙的 CSS 三角形切口

    我需要使用 CSS 绘制以下图案作为页面各部分之间的分隔符 使用skewX 技术来自这个答案 我能够准确地模仿三角形切口 两个伪元素附加到下部部分的顶部 一个向左倾斜 一个向右倾斜 以便上部部分的背景显示出来 但我不知道如何添加边框 如第一
  • SQL 一对多

    我正在尝试为我们拥有的系统构建一个 SQL 模式channels 每个都有一个id 以及一个或多个fixtures 我很难找到实现这种一对多映射的方法 即一channel太多fixtures 我正在使用H2数据库引擎 我不能有桌子 id f
  • Excel 数据验证列表,其中排除已使用的值

    我有 A 列 其中有一些数据 B 列有一个数据验证列表下拉列表 其中包含 A 列中的值 当我从 B 列中的列表中选择值 例如 B1 A B2 B B3 C 时 我希望下拉列表排除该列中已使用的值 因此 在屏幕截图中 B4 中的下拉列表应该只
  • 为什么 iPhone 视频是颠倒的?

    我有一个使用标准相机应用程序捕获的视频文件 并使用它从我的 Iphone 5 复制btsync orig mov ISO Media Apple QuickTime movie 那个播放倒挂在 mplayer 或 vlc 中 当我使用 AW
  • 从 M 文件控制 simulink

    我正在尝试从 M 文件控制 simulink 我想要在 M 文件中做的是给 simulink 模型一些输入 运行 simulink 模型 在 0 6 秒时更改一个输入值 然后使用新输入继续运行 simulink 模型 我已经知道通过使用se
  • Xamarin 表单:如何在设备外部存储中创建文件夹和文件?

    我正在尝试在设备的外部存储上的该文件夹中创建一个文件夹和一个文本文件 与 WhatsApp 的做法相同 另外 我需要向该文件写入一些数据 是否可以以 xamarin 形式执行此操作 或者我们应该使用依赖服务吗 提前致谢 UPDATE Luc