262 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			262 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import Want from '@ohos.app.ability.Want'
 | ||
| import promptAction from '@ohos.promptAction'
 | ||
| import fileAccess from '@ohos.file.fileAccess'
 | ||
| import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl'
 | ||
| import common from '@ohos.app.ability.common'
 | ||
| import fs from '@ohos.file.fs'
 | ||
| 
 | ||
| const LOGTAG = 'LOGTAG'
 | ||
| 
 | ||
| export default class FileUtil {
 | ||
|   public destFile: string
 | ||
|   public filePathFdObj: Object = {}
 | ||
|   /*
 | ||
| * @desc 创建并覆盖文件
 | ||
| *
 | ||
| */
 | ||
|   public addFile = async (filePath: string, content: string, type?: string) => {
 | ||
|     const { READ_WRITE,CREATE,APPEND } = fs.OpenMode
 | ||
|     const isExit = fs.accessSync(filePath);
 | ||
|     //文件存在先删除
 | ||
|     if (isExit) {
 | ||
|       fs.unlinkSync(filePath);
 | ||
|     }
 | ||
|     try {
 | ||
|       let file = fs.openSync(filePath, READ_WRITE | CREATE);
 | ||
|       //追加写入文件
 | ||
|       fs.writeSync(file.fd, content)
 | ||
|       fs.closeSync(file)
 | ||
|       console.error(LOGTAG, '写入文件成功')
 | ||
|       return true
 | ||
| 
 | ||
|     } catch (e) {
 | ||
|       promptAction.showToast({
 | ||
|         message: `addFile文件失败` + filePath + JSON.stringify(e),
 | ||
|         duration: 4000,
 | ||
|       })
 | ||
|       console.error(LOGTAG, '写入失败', JSON.stringify(e))
 | ||
|     }
 | ||
|   }
 | ||
|   /*
 | ||
|   * @desc 创建或者编辑文件
 | ||
|   *
 | ||
|   */
 | ||
|   public editFile = async (filePath: string, content: string, fd?: number) => {
 | ||
|     const {filePathFdObj} = this;
 | ||
|     const { READ_WRITE,CREATE,APPEND } = fs.OpenMode
 | ||
|     const newStr = content + '\n'
 | ||
|     const thisFile = filePathFdObj[filePath];
 | ||
|     try {
 | ||
|       if (thisFile) {
 | ||
|         fs.writeSync(thisFile.fd, newStr)
 | ||
|         return fd;
 | ||
|       } else {
 | ||
|         let file = fs.openSync(filePath, READ_WRITE | APPEND | CREATE);
 | ||
|         fs.writeSync(file.fd, newStr)
 | ||
|         this.filePathFdObj[filePath] = file
 | ||
|         return file.fd
 | ||
|       }
 | ||
|     } catch (e) {
 | ||
|       promptAction.showToast({
 | ||
|         message: `editFile文件失败` + filePath + JSON.stringify(e),
 | ||
|         duration: 4000,
 | ||
|       })
 | ||
|       console.error(LOGTAG, JSON.stringify(e))
 | ||
|     }
 | ||
|   }
 | ||
|   /*
 | ||
|  * @desc 关闭文件
 | ||
|  *
 | ||
|  */
 | ||
|   public closeFile = async (filePath: string) => {
 | ||
|     const {filePathFdObj} = this;
 | ||
|     const thisFile = filePathFdObj[filePath];
 | ||
|     if (thisFile) {
 | ||
|       fs.closeSync(thisFile);
 | ||
|       console.info(LOGTAG, filePath + '文件关闭成功')
 | ||
|     }
 | ||
|   }
 | ||
|   /*
 | ||
|   * @desc 读取文件
 | ||
|   *
 | ||
|   **/
 | ||
|   public readFile = async (filePath: string) => {
 | ||
|     try {
 | ||
|       console.log('strrr', filePath)
 | ||
|       const str = await fs.readText(filePath);
 | ||
|       return str
 | ||
|     } catch (e) {
 | ||
|       promptAction.showToast({
 | ||
|         message: `读取文件失败` + filePath + JSON.stringify(e),
 | ||
|         duration: 4000,
 | ||
|       })
 | ||
|       console.log('readFile文件失败' + filePath + JSON.stringify(e))
 | ||
|       return ''
 | ||
|     }
 | ||
| 
 | ||
|   }
 | ||
|   /*
 | ||
|    *  @desc获取系统目录里的文件列表
 | ||
|    */
 | ||
|   public getDeviceList = async (folderPath?: string) => {
 | ||
|     const {absolutePath,getFilePathList} = this;
 | ||
|     return getFilePathList(`${absolutePath}/${folderPath}`, false)
 | ||
|   };
 | ||
|   private context: common.UIAbilityContext
 | ||
|   private wantInfos: Want[]
 | ||
|   private fileAccessHelper: fileAccess.FileAccessHelper
 | ||
|   //后续文件路径待替换
 | ||
|   private absolutePath = '/mnt/hmdfs/100/account/device_view/local/files/duolun'
 | ||
|   private getFilePathList = async (filePath: string, isSdcard: boolean) => {
 | ||
|     let fileName = [], sdCardFileName = [];
 | ||
| 
 | ||
|     try {
 | ||
|       const filenames = await fs.listFile(filePath);
 | ||
|       for (let i = 0; i < filenames.length; i++) {
 | ||
|         console.error(LOGTAG, `目录:${filePath}的子文件:${filenames[i]}`);
 | ||
|         if (isSdcard) {
 | ||
|           sdCardFileName.push(filenames[i])
 | ||
|         } else {
 | ||
|           fileName.push(filenames[i])
 | ||
|         }
 | ||
|       }
 | ||
|       return isSdcard ? sdCardFileName : fileName
 | ||
|     } catch (e) {
 | ||
|       console.error(LOGTAG, JSON.stringify(e));
 | ||
|     }
 | ||
| 
 | ||
|   }
 | ||
|   // 检索文件列表
 | ||
|   public getSdCardPathList = async () => {
 | ||
|     this.wantInfos = await fileAccess.getFileAccessAbilityInfo();
 | ||
|     const {wantInfos,context} = this;
 | ||
|     const fileAccessHelper = fileAccess.createFileAccessHelper(this.context, this.wantInfos);
 | ||
|     this.fileAccessHelper = fileAccessHelper;
 | ||
| 
 | ||
|     let isDone = false;
 | ||
|     let rootIterator = null;
 | ||
|     try {
 | ||
|       rootIterator = await fileAccessHelper.getRoots();
 | ||
| 
 | ||
|       while (!isDone) {
 | ||
|         let isDones = false;
 | ||
|         let rootInfo = rootIterator.next();
 | ||
|         isDone = rootInfo.done; //返回true结束
 | ||
|         console.error(LOGTAG, "根目录迭代器对象 next result = " + JSON.stringify(rootInfo));
 | ||
|         if (!isDone) {
 | ||
|           let deviceType = rootInfo.value.deviceType;
 | ||
|           let displayName = rootInfo.value.displayName;
 | ||
|           let uri: string = rootInfo.value.uri;
 | ||
|           let deviceFlags = rootInfo.value.deviceFlags;
 | ||
|           console.error(LOGTAG, `设备类型:${deviceType},设备名称:${displayName},设备根目录Uri:${uri},设备支持的能力:${deviceFlags}`);
 | ||
| 
 | ||
|           if (uri.indexOf('/mnt/external/') > 0) {
 | ||
|             // if('vol-8-1' ==displayName){
 | ||
|             this.destFile = uri.split('ExternalFileManager')[1] + '/'
 | ||
|             console.error(LOGTAG, `外置存储路径:` + this.destFile);
 | ||
|             this.getFilePathList(this.destFile, true)
 | ||
|           }
 | ||
|         }
 | ||
|       }
 | ||
| 
 | ||
|     } catch (error) {
 | ||
|       console.error(LOGTAG, "getRoots failed, errCode:" + error.code + ", errMessage:" + error.message);
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   // 删除文件夹或者文件
 | ||
|   /*
 | ||
|    * @desc 删除文件夹或者文件
 | ||
|    * @param{{type}} 1:文件夹 2:文件 3:自定义目录下文件
 | ||
|    **/
 | ||
|   // 文件系统初始化
 | ||
|   private requestPermission = async () => {
 | ||
|     const {context,absolutePath} = this;
 | ||
|     let permissions: Array<Permissions> = [
 | ||
|       'ohos.permission.READ_MEDIA',
 | ||
|       'ohos.permission.WRITE_MEDIA'
 | ||
|     ];
 | ||
|     this.wantInfos = await fileAccess.getFileAccessAbilityInfo();
 | ||
|     let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager()
 | ||
|     atManager.requestPermissionsFromUser(context, permissions, async (code, result) => {
 | ||
|       const permissionRequest = result.authResults[0]
 | ||
|       if (permissionRequest == -1) {
 | ||
|         promptAction.showToast({
 | ||
|           message: "请先授权",
 | ||
|           duration: 3000,
 | ||
|         })
 | ||
|         return
 | ||
|       }
 | ||
|     })
 | ||
|   }
 | ||
| 
 | ||
|   constructor(wantInfos) {
 | ||
|     const {requestPermission} = this;
 | ||
|     this.wantInfos = wantInfos;
 | ||
|     requestPermission();
 | ||
|     fs.mkdir(this.absolutePath)
 | ||
|   }
 | ||
| 
 | ||
|   /*
 | ||
|    * @desc 校验文件夹,文件夹不存在会创建,支持嵌套
 | ||
|    *
 | ||
|    */
 | ||
|   public initFolder = async (folderPath: string) => {
 | ||
|     const {absolutePath} = this;
 | ||
|     const folderList = folderPath.split('/').filter(folderName => folderName !== '');
 | ||
| 
 | ||
|     let path = absolutePath
 | ||
|     folderList.forEach((folderName => {
 | ||
|       path += `/${folderName}`;
 | ||
|       try {
 | ||
|         const isExit = fs.accessSync(path);
 | ||
|         if (!isExit) {
 | ||
|           fs.mkdirSync(path)
 | ||
|         }
 | ||
|       } catch (e) {
 | ||
|         console.info('初始化文件夹失败', path)
 | ||
|         promptAction.showToast({
 | ||
|           message: `初始化文件夹失败` + folderPath + JSON.stringify(e),
 | ||
|           duration: 4000,
 | ||
|         })
 | ||
|       }
 | ||
|     }));
 | ||
|     return path;
 | ||
|   }
 | ||
| 
 | ||
|   public deleteF = async (path: string, type: 1 | 2 | 3) => {
 | ||
|     const {getFilePathList,absolutePath} = this
 | ||
|     if (type === 1) {
 | ||
|       const fileList = await getFilePathList(`${absolutePath}/${path}`, false);
 | ||
|       fileList.forEach(filePath => {
 | ||
|         fs.unlinkSync(`${absolutePath}/${path}/${filePath}`);
 | ||
|       })
 | ||
|       fs.rmdirSync(`${absolutePath}/${path}`);
 | ||
|       return true
 | ||
|     }
 | ||
| 
 | ||
|     if (type === 2) {
 | ||
|       fs.unlinkSync(`${absolutePath}/${path}`);
 | ||
|       return true
 | ||
|     }
 | ||
|     if (type === 3) {
 | ||
|       fs.unlinkSync(`${path}`);
 | ||
|       return true
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   // 获取系统文件绝对路径
 | ||
|   public getAbsolutePath = () => {
 | ||
|     const {absolutePath} = this;
 | ||
|     return absolutePath
 | ||
|   }
 | ||
| 
 | ||
|   public getFileContent = (filePath: string) => {
 | ||
|     const {absolutePath} = this;
 | ||
|     const { READ_WRITE } = fs.OpenMode
 | ||
|     const path = `${absolutePath}/${filePath}`
 | ||
|     const str = fs.readTextSync(path);
 | ||
|     return str
 | ||
|   }
 | ||
| }
 |