@capacitor/filesystem
Filesystem API 提供了一个类似 NodeJS 的 API,用于在设备上进行文件操作。
安装
npm install @capacitor/filesystem@latest-6
npx cap sync
Apple 隐私清单要求
苹果要求应用开发者现在必须为 API 使用指定批准的原因,以增强用户隐私。在 2024 年 5 月 1 日之前,向 App Store Connect 提交应用时必须包含这些原因。
在应用中使用此特定插件时,必须在 /ios/App 目录下创建一个 PrivacyInfo.xcprivacy 文件,或使用 VS Code 扩展来生成它,并指定使用原因。
有关如何执行此操作的详细步骤,请参阅 Capacitor 文档。
对于此插件,必需的字典键是 NSPrivacyAccessedAPICategoryFileTimestamp,推荐的原因是 C617.1。
示例 PrivacyInfo.xcprivacy
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<!-- 如果 PrivacyInfo 文件已存在,请将此字典条目添加到数组中 -->
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
</dict>
</plist>
iOS
若要使文件出现在“文件”应用中,还必须在 Info.plist 中将以下键设置为 YES:
UIFileSharingEnabled(Application supports iTunes file sharing)LSSupportsOpeningDocumentsInPlace(Supports opening documents in place)
如需帮助,请阅读配置 iOS。
Android
如果使 用 Directory.Documents 或 Directory.ExternalStorage,在 Android 10 及更早版本中,此 API 要求将以下权限添加到 AndroidManifest.xml:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
有关设置 Android 权限的更多信息,请参阅 Android 指南中的设置权限。
请注意,Directory.ExternalStorage 仅在 Android 9 或更早版本上可用,而 Directory.Documents 在 Android 11 及更新版本上仅允许访问应用创建的文件/文件夹。
处理大文件时,可能需要在 AndroidManifest.xml 的 <application> 标签中添加 android:largeHeap="true"。
理解目录和文件
iOS 和 Android 在文件之间有额外的隔离层,例如备份到云端的特殊目录或用于存储文档的目录。Filesystem API 提供了一种简单的方法,将每个操作限定到设备上的特定特殊目录。
此外,Filesystem API 支持使用完整的 file:// 路径,或者在 Android 上读取 content:// 文件。只需省略 directory 参数即可使用完整的文件路径。
示例
import { Filesystem, Directory, Encoding } from '@capacitor/filesystem';
const writeSecretFile = async () => {
await Filesystem.writeFile({
path: 'secrets/text.txt',
data: 'This is a test',
directory: Directory.Documents,
encoding: Encoding.UTF8,
});
};
const readSecretFile = async () => {
const contents = await Filesystem.readFile({
path: 'secrets/text.txt',
directory: Directory.Documents,
encoding: Encoding.UTF8,
});
console.log('secrets:', contents);
};
const deleteSecretFile = async () => {
await Filesystem.deleteFile({
path: 'secrets/text.txt',
directory: Directory.Documents,
});
};
const readFilePath = async () => {
// 这是一个读取完整文件路径文件的示例。使用此方法可以从返回文件 URI 的插件(例如相机)读取二进制数据(base64 编码)。
const contents = await Filesystem.readFile({
path: 'file:///var/mobile/Containers/Data/Application/22A433FD-D82D-4989-8BE6-9FC49DEA20BB/Documents/text.txt',
});
console.log('data:', contents);
};
API
readFile(...)
readFile(options: ReadFileOptions) => Promise<ReadFileResult>
从磁盘读取文件
| 参数 | 类型 |
|---|---|
options | |
返回值:
Promise<ReadFileResult>
自: 1.0.0
writeFile(...)
writeFile(options: WriteFileOptions) => Promise<WriteFileResult>
将文件写入设备上指定位置的磁盘
| 参数 | 类型 |
|---|---|
options | |
返回值:
Promise<WriteFileResult>
自: 1.0.0
appendFile(...)
appendFile(options: AppendFileOptions) => Promise<void>
在设备上指定位置的磁盘文件中追加内容
| 参数 | 类型 |
|---|---|
options | |
自: 1.0.0
deleteFile(...)
deleteFile(options: DeleteFileOptions) => Promise<void>
从磁盘中删除文件
| 参数 | 类型 |
|---|---|
options | |
始于: 1.0.0
mkdir(...)
mkdir(options: MkdirOptions) => Promise<void>
创建一个目录。
| 参数 | 类型 |
|---|---|
options | |
始于: 1.0.0
rmdir(...)
rmdir(options: RmdirOptions) => Promise<void>
删除一个目录
| 参数 | 类型 |
|---|---|
options | |
始于: 1.0.0
readdir(...)
readdir(options: ReaddirOptions) => Promise<ReaddirResult>
返回目录中的文件列表(非递归)
| 参数 | 类型 |
|---|---|
options | |
返回值:
Promise<ReaddirResult>
始于: 1.0.0
getUri(...)
getUri(options: GetUriOptions) => Promise<GetUriResult>
返回指定路径和目录的完整文件 URI
| 参数 | 类型 |
|---|---|
options | |
返回值:
Promise<GetUriResult>
始于: 1.0.0
stat(...)
stat(options: StatOptions) => Promise<StatResult>
返回文件的相关数据
| 参数 | 类型 |
|---|---|
options | |
返回值:
Promise<StatResult>
始于: 1.0.0
rename(...)
rename(options: RenameOptions) => Promise<void>
重命名文件或目录
| 参数 | 类型 |
|---|---|
options | |
始于: 1.0.0
copy(...)
copy(options: CopyOptions) => Promise<CopyResult>
复制文件或目录
| 参数 | 类型 |
|---|---|
options | |
返回值:
Promise<CopyResult>
始于: 1.0.0
checkPermissions()
checkPermissions() => Promise<PermissionStatus>
检查读/写权限。
在 Android 上,仅在使用 Directory.Documents 或
Directory.ExternalStorage 时需要。
返回值:
Promise<PermissionStatus>
始于: 1.0.0
requestPermissions()
requestPermissions() => Promise<PermissionStatus>
请求读/写权限。
在 Android 上,仅在使用 Directory.Documents 或
Directory.ExternalStorage 时需要。
返回值:
Promise<PermissionStatus>
始于: 1.0.0
downloadFile(...)
downloadFile(options: DownloadFileOptions) => Promise<DownloadFileResult>
向服务器发起 HTTP 请求,并将文件下载到指定目标位置。
| 参数 | 类型 |
|---|---|
options | |
返回值:
Promise<DownloadFileResult>
始于: 5.1.0
addListener('progress', ...)
addListener(eventName: 'progress', listenerFunc: ProgressListener) => Promise<PluginListenerHandle>
为文件下载进度事件添加监听器。
| 参数 | 类型 |
|---|---|
eventName | 'progress' |
listenerFunc | |
返回值:
Promise<PluginListenerHandle>
始于: 5.1.0