HarmonyOS鸿蒙Next中文件获取:读取目录下所有文件
HarmonyOS鸿蒙Next中文件获取:读取目录下所有文件 有什么方式获取 制定路径下,某个文件夹下全部数据,
现在提示 13900001 操作不允许,如何一次性授权!!!
路径:“file://docs/storage/Users/currentUser/Sounds/CallRecord”
const context = getContext() as common.UIAbilityContext;
const permissions : Array<Permissions> = ['ohos.permission.READ_AUDIO'];
abilityAccessCtrl.createAtManager().requestPermissionsFromUser(context, permissions).then((data) => {
console.info("请求权限成功:", data);
// 创建FileUri对象并获取沙箱路径 file://docs/storage/Users/currentUser/Sounds/CallRecord
let fileUriObject = new fileUri.FileUri("file://docs/storage/Users/currentUser/Download");
let sandboxPath = fileUriObject.path; // 直接获取沙箱路径
console.info('sandboxPath', sandboxPath)
let listFileOption : ListFileOptions = {
recursion: false,
listNum: 0,
filter: {
// suffix: [".png", ".jpg", ".jpeg"],
// displayName: ["*abc", "efg*"],
// fileSizeOver: 1024
}
};
fs.listFile(sandboxPath, listFileOption, (err : BusinessError, filenames : Array<string>) => {
if (err) {
console.error(`Failed to list file. Code: ${err.code}, message: ${err.message}`);
} else {
console.info(`Succeeded in listing file.`);
for (let i = 0; i < filenames.length; i++) {
console.info(`Succeeded in listing file, file name: ${filenames[i]}`);
}
}
});
}).catch((err) => {
console.error("请求权限失败:", err);
});
更多关于HarmonyOS鸿蒙Next中文件获取:读取目录下所有文件的实战教程也可以访问 https://www.itying.com/category-93-b0.html
背景知识:
你好,app不能直接读取非自己应用下的目录(沙箱),否则会出现目录需要权限问题(报错:13900001 操作不允许)。你只能读取自己app下的目录。或者使用 [@ohos.file.picker (选择器)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-file-picker) 通过系统让用户选择需要的文件。
问题解决:
读写操作可以在自己应用路径下操作,如果需要操作非应用包下的目录需要使用 picker (选择器)
更多关于HarmonyOS鸿蒙Next中文件获取:读取目录下所有文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
- 如果是为了获取通话录音列表:放弃直接文件遍历。使用 MediaLibrary 的 getAssets(MediaType.AUDIO)。如果 MediaLibrary 也看不到通话录音,说明系统未向第三方应用开放此接口(常见于华为/荣耀等厂商的系统保护)。此时,你只能引导用户通过系统分享功能将录音发送给你的应用。
- 如果是为了获取应用自己生成的录音:保存到 context.getExternalFilesDir() 或context.filesDir。直接使用 fs.listFile 遍历这些沙箱目录,无需任何权限。
- 如果必须访问公共下载目录:使用 @kit.FileManagementKit (API 11+) 的 fileManagement.getPublicPath() 方法获取标准公共路径。确保在 module.json5 中声明了 ohos.permission.WRITE_MEDIA 或 READ_MEDIA。
权限不足啊,ohos.permission.READ_AUDIO 仅允许你通过媒体库接口访问音频元数据,而不代表你可以使用 fs.listFile 直接遍历底层物理目录。
import { picker } from '@kit.CoreFileKit';
import { fileIo as fs, ListFileOptions } from '@kit.CoreFileKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';
async function selectFolderAndListFiles() {
try {
const documentPicker = new picker.DocumentViewPicker();
const documentSelectOptions = new picker.DocumentSelectOptions();
documentPicker.select(documentSelectOptions).then((documentSelectResult: Array<string>) => {
// 拿到用户选择的路径 URI
let pathUri = documentSelectResult[0];
//直接对公共路径进行 listFile 仍可能受限,建议通过已授权的 URI 打开目录
let file = fs.openSync(pathUri, fs.OpenMode.READ_ONLY);
let listFileOption: ListFileOptions = {
recursion: false,
listNum: 0
};
// 使用 fd 或 uri 相关的接口读取
fs.listFile(file.fd, listFileOption).then((filenames) => {
filenames.forEach(name => console.info("文件名: " + name));
});
});
} catch (err) {
let error = err as BusinessError;
console.error(`Picker failed. Code: ${error.code}, message: ${error.message}`);
}
}
file://docs/storage/Users/currentUser/Sounds/CallRecord 这个路径不是你的应用沙箱路径,而是设备上用户文件的路径。
在 HarmonyOS 里,应用无法直接访问其他目录,必须用户主动授权。
ohos.permission.READ_AUDIO 只能读音频文件内容,不等于可以读目录。两个是不同权限。
建议通过 FilePicker 让用户"主动选择要授权的文件夹",授权后你的应用才能访问。
不对吧,你要读的路径:file://docs/storage/Users/currentUser/Sounds/CallRecord
这个是系统公共目录,不是沙箱啊!
你只申请 READ_AUDIO 不够,会直接报:13900001 Operation not allowed
必须一次性授权 3 个权限
ohos.permission.READ_AUDIO
ohos.permission.WRITE_AUDIO
ohos.permission.FILE_ACCESS_PUBLIC
读取路径是这个:
import { Environment } from '@kit.EnvironmentKit';
// 获取系统公共的 Sounds/CallRecord 目录
const publicSoundDir = Environment.PublicDirectory.DIRECTORY_SOUNDS + "/CallRecord";
应用只能访问沙箱内的文件,公共目录下的文件需要用户授权,
这个路径看命名属于公共目录,怎么能拉起授权
公共目录下的文件/目录(除了“Download/包名/“目录)没法直接访问
在HarmonyOS Next中,读取目录下所有文件可使用 @ohos.file.fs 模块的 listDir() 方法。例如:fs.listDir("/data/storage/el2/base/haps/entry/files/") 返回 FileInfo[],包含文件名、大小等信息。同步版本 listDirSync() 也可用。需在 module.json5 中声明 ohos.permission.READ_MEDIA 权限(或对应存储权限)。路径需根据应用沙箱调整。
在HarmonyOS Next中,13900001(操作不允许)是因为fs.listFile不能直接读取像Sounds/CallRecord这样的公共媒体目录。虽然申请了ohos.permission.READ_AUDIO,但该权限只允许通过系统媒体库接口(如@ohos.multimedia.mediaLibrary)访问音频文件,并不赋予文件系统直接列表目录的能力。要读取录音文件列表,应使用audioAccessHelper等专门的媒体访问API,通过查询媒体存储获取文件,而非原生文件路径。公共目录无法“一次性授权”给fs接口;只有应用沙箱目录(如context.filesDir)才可以通过fs.listFile自由读列。如需批量处理,可将文件提前存入沙箱。


