外置存储设备(如SD卡、U盘等)具备可插拔属性,因此系统提供了设备插拔事件的监听及挂载功能,用于管理外置存储设备,当前仅对系统应用开放。
基于fileAccessHelper查找USB目录
鸿蒙 3.2中StorageManger已支持外部存储设备自动挂载,也就说当用户插入U盘后,鸿蒙内核会监听到外部设备,然后直接挂载到系统根目录:file://docs/storage/上。开发者仅需遍历一级目录查找deviceType为6的USB设备目录即可。
import common from '@ohos.app.ability.common';
import fileAccess from '@ohos.file.fileAccess';
import usb from '@ohos.usb';
let TAG = 'USB====='
let context = getContext(this) as common.UIAbilityContext
let fileAccessHelper = fileAccess.createFileAccessHelper(context);
let out = {
uri: '',
relativePath: '',
fileName: '',
mode: 0,
size: 0,
mtime: 0,
mimeType: ''
}
export class UsbUtil {
// 设备文件列表
static fileList: fileAccess.FileInfo[] = []
// 获取USB设备目录下文件属性信息
static usbGetList(){
// 获取根节点
fileAccessHelper.getRoots()
.then((roots)=>{
console.info(TAG + 'getRoots success!')
if(roots){
// 遍历根目录
let isRootsDone = false
while (!isRootsDone){
// 获取下一级设备根目录
let rootsData = roots.next()
isRootsDone = rootsData.done
// 根属性信息
let rootsInfo: fileAccess.RootInfo = rootsData.value
// 是否为USB设备
if(rootsInfo && rootsInfo.deviceType == 6){
console.info(TAG + 'get usb devices!')
let isFileDone = false
// 获取第一级符合条件的文件(夹)信息
let fileIterator = rootsInfo.listFile()
if (!fileIterator) {
console.error(TAG + "listFile interface returns an undefined object")
}
while (!isFileDone){
// 获取USB设备目录下文件信息
let fileData = fileIterator.next()
isFileDone = fileData.done
// 目标文件信息
UsbUtil.fileList.push(fileData.value)
console.info(TAG + 'get goal!')
}
}
}
}
})
}
获取USB目录下文件名
/**
* 获取USB设备目录下文件名
*/
public usbFilesName() {
const list = new ArrayList();
for (let i = 0; i < UsbUtil.fileList.length; i++) {
const file = UsbUtil.fileList[i];
if (!file) {
continue
}
console.log("file uri: " + file.uri)
list.add({
uri: file.uri,
relativePath: file.relativePath,
fileName: file.fileName,
mode: file.mode,
size: file.size,
mtime: file.mtime,
mimeType: file.mimeType,
})
}
console.info(TAG + list)
let res = JSON.stringify(list)
// console.info(TAG + res)
return res
}
注:interface好像不能被序列化~头秃
基于volumemanager查看USB设备使用信息
/**
* 获取USB总空间、可用空间
*/
static usbSpace(){
// 总空间
volumemanager.getAllVolumes().then((volumes: Array<volumemanager.Volume>) => {
// 卷设备的通用唯一识别码
let uuid: string = volumes[0].uuid;
// 获取外置存储设备中指定卷设备的总空间大小(单位为Byte)
storageStatistics.getTotalSizeOfVolume(uuid).then((number: number) => {
UsbUtil.USBTotalSpace = UsbUtil.bytesToGB(number)
console.info(TAG + "getTotalSizeOfVolume successfully:" + number);
}).catch((err: BusinessError) => {
console.error(TAG + "getTotalSizeOfVolume failed with error:" + JSON.stringify(err));
});
// 可用空间大小
storageStatistics.getFreeSizeOfVolume(uuid).then((number: number) => {
UsbUtil.USBFreeSpace = UsbUtil.bytesToGB(number)
console.info(TAG + "getFreeSizeOfVolume successfully:" + number);
}).catch((err: BusinessError) => {
console.error(TAG + "getFreeSizeOfVolume failed with error:" + JSON.stringify(err));
});
}).catch((err: BusinessError) => {
console.error(TAG + "getAllVolumes failed with error:" + JSON.stringify(err));
});
}
/**
* 单位换算
*/
static bytesToGB(bytes:number):string {
return (bytes / 1024 ** 3).toFixed(2) // 转换为GB并保留两位小数
}
OK!方法就这些,剩下的使用就是文件读写删等操作了。
欢迎指正!