123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889 |
- import fileUri from '@ohos.file.fileuri';
- import fs, { ListFileOptions, ReadOptions, ReadTextOptions, WriteOptions } from '@ohos.file.fs';
- import { BusinessError } from '@kit.BasicServicesKit';
- import { StrHelper } from './StrHelper';
- import { hilog } from '@kit.PerformanceAnalysisKit';
- import { image } from '@kit.ImageKit';
- import { buffer } from '@kit.ArkTS';
- import { LogHelper } from './LogHelper';
- import { ToolsHelper } from './ToolsHelper';
- import { photoAccessHelper } from '@kit.MediaLibraryKit';
- import { GlobalContext } from '../ContextConfig';
- export class FileHelper {
- private constructor() {
- }
- static readonly separator: string = '/';
- /**
- * 获取文件目录下的文件夹路径或文件路径。
- * @param dirPath 文件路径;支持完整路径和相对路径(download/wps/doc);dirPath传空字符串表示根目录
- * @param fileName 文件名(test.text);fileName传空字符串表示文件夹路径
- * @param blHap true:HAP级别文件路径、 false:App级别文件路径
- * @returns
- */
- static getFilesDirPath(dirPath: string = "", fileName: string = "", blHap: boolean = true): string {
- let filePath = blHap ? getContext().filesDir : getContext().getApplicationContext().filesDir; //根目录
- if (StrHelper.isNotEmpty(dirPath)) {
- if (StrHelper.startsWith(dirPath, filePath)) { //路径中包含根目录,是完整路径。
- filePath = dirPath;
- } else { //路径中不包含根目录,拼接成完整路径。
- filePath = filePath + FileHelper.separator + dirPath;
- }
- if (!FileHelper.accessSync(filePath)) {
- FileHelper.mkdirSync(filePath) //如果文件夹不存在就创建
- }
- }
- if (StrHelper.isNotEmpty(fileName)) {
- filePath = filePath + FileHelper.separator + fileName;
- }
- return filePath;
- }
- /**
- * 获取缓存目录下的文件夹路径或文件路径。
- * @param dirPath 文件路径;支持完整路径和相对路径(download/wps/doc);dirPath传空字符串表示根目录
- * @param fileName 文件名(test.text);fileName传空字符串表示文件夹路径
- * @param blHap true:HAP级别文件路径、 false:App级别文件路径
- * @returns
- */
- static getCacheDirPath(dirPath: string = "", fileName: string = "", blHap: boolean = true): string {
- let filePath = blHap ? getContext().cacheDir : getContext().getApplicationContext().cacheDir; //根目录
- if (StrHelper.isNotEmpty(dirPath)) {
- if (FileHelper.hasDirPath(dirPath)) { //路径中包含根目录,是完整路径。
- filePath = dirPath;
- } else { //路径中不包含根目录,拼接成完整路径。
- filePath = filePath + FileHelper.separator + dirPath;
- }
- if (!FileHelper.accessSync(filePath)) {
- FileHelper.mkdirSync(filePath) //如果文件夹不存在就创建
- }
- }
- if (StrHelper.isNotEmpty(fileName)) {
- filePath = filePath + FileHelper.separator + fileName;
- }
- return filePath;
- }
- /**
- * 获取临时目录下的文件夹路径或文件路径。
- * @param dirPath 文件路径;支持完整路径和相对路径(download/wps/doc);dirPath传空字符串表示根目录
- * @param fileName 文件名(test.text);fileName传空字符串表示文件夹路径
- * @param blHap true:HAP级别文件路径、 false:App级别文件路径
- * @returns
- */
- static getTempDirPath(dirPath: string = "", fileName: string = "", blHap: boolean = true): string {
- let filePath = blHap ? getContext().tempDir : getContext().getApplicationContext().tempDir; //根目录
- if (StrHelper.isNotEmpty(dirPath)) {
- if (FileHelper.hasDirPath(dirPath)) { //路径中包含根目录,是完整路径。
- filePath = dirPath;
- } else { //路径中不包含根目录,拼接成完整路径。
- filePath = filePath + FileHelper.separator + dirPath;
- }
- if (!FileHelper.accessSync(filePath)) {
- FileHelper.mkdirSync(filePath) //如果文件夹不存在就创建
- }
- }
- if (StrHelper.isNotEmpty(fileName)) {
- filePath = filePath + FileHelper.separator + fileName;
- }
- return filePath;
- }
- /**
- * 判断是否是完整路径
- * @param path 文件路径
- */
- static hasDirPath(path: string): boolean {
- return StrHelper.startsWith(path, "/data/storage/el1/") || StrHelper.startsWith(path, "/data/storage/el2/");
- }
- /**
- * 通过URI或路径,获取FileUri
- * @param uriOrPath URI或路径
- * @returns
- */
- static getFileUri(uriOrPath: string): fileUri.FileUri {
- return new fileUri.FileUri(uriOrPath);
- }
- /**
- * 通过URI或路径,获取文件名。
- * @param uriOrPath URI或路径
- * @returns
- */
- static getFileName(uriOrPath: string): string {
- return FileHelper.getFileUri(uriOrPath).name;
- }
- /**
- * 通过URI或路径,获取文件路径
- * @param uriOrPath URI或路径
- * @returns
- */
- static getFilePath(uriOrPath: string): string {
- return FileHelper.getFileUri(uriOrPath).path;
- }
- /**
- * 通过URI或路径,获取对应文件父目录的URI。
- * @param uriOrPath URI或路径
- */
- static getParentUri(uriOrPath: string): string {
- return FileHelper.getFileUri(uriOrPath).getFullDirectoryUri();
- }
- /**
- * 通过URI或路径,获取对应文件父目录的路径名。
- * @param uriOrPath URI或路径
- */
- static getParentPath(uriOrPath: string): string {
- let parentUri = FileHelper.getParentUri(uriOrPath);
- return FileHelper.getFilePath(parentUri)
- }
- /**
- * 以同步方法获取文件URI。
- * @param path 应用沙箱路径
- * @returns
- */
- static getUriFromPath(path: string): string {
- return fileUri.getUriFromPath(path);
- }
- /**
- * 根据文件名获取文件后缀
- * @param fileName 例如: test.txt test.doc
- * @returns
- */
- static getFileExtention(fileName: string) {
- if (StrHelper.isNotEmpty(fileName) && fileName.includes(".")) {
- return fileName.substring(fileName.lastIndexOf(".") + 1);
- }
- return '';
- }
- /**
- * 获取指定文件夹下所有文件的大小或指定文件大小。
- * @param path 文件夹路径 或 文件路径
- */
- static getFileDirSize(path: string): number {
- if (FileHelper.accessSync(path)) { //path存在
- if (FileHelper.isDirectory(path)) { //文件夹
- let count: number = 0;
- FileHelper.listFileSync(path, { recursion: true }).forEach((filePath) => {
- count = count + FileHelper.lstatSync(path + filePath).size
- })
- return count;
- } else { //文件
- return FileHelper.lstatSync(path).size
- }
- }
- return 0;
- }
- /**
- * 判断文件是否是普通文件。
- * @param file string|number 文件应用沙箱路径path或已打开的文件描述符fd。
- * @returns
- */
- static isFile(file: string | number): boolean {
- return fs.statSync(file).isFile();
- }
- /**
- * 判断文件是否是目录。
- * @param file string|number 文件应用沙箱路径path或已打开的文件描述符fd。
- * @returns
- */
- static isDirectory(file: string | number): boolean {
- return fs.statSync(file).isDirectory();
- }
- /**
- * 重命名文件或文件夹,使用Promise异步回调。
- * @param oldPath string 文件的应用沙箱原路径。
- * @param newPath string 文件的应用沙箱新路径。
- * @returns
- */
- static rename(oldPath: string, newPath: string): Promise<void> {
- return fs.rename(oldPath, newPath);
- }
- /**
- * 重命名文件或文件夹,以同步方法。
- * @param oldPath string 文件的应用沙箱原路径。
- * @param newPath string 文件的应用沙箱新路径。
- * @returns
- */
- static renameSync(oldPath: string, newPath: string) {
- fs.renameSync(oldPath, newPath);
- }
- /**
- * 创建目录,当recursion指定为true,可多层级创建目录,使用Promise异步回调。
- * @param path 目录的应用沙箱路径。
- * @param recursion 是否多层级创建目录。recursion指定为true时,可多层级创建目录。recursion指定为false时,仅可创建单层目录。
- * @returns
- */
- static mkdir(path: string, recursion: boolean = true): Promise<void> {
- if (recursion) {
- return fs.mkdir(path, recursion);
- } else {
- return fs.mkdir(path);
- }
- }
- /**
- * 创建目录以同步方法,当recursion指定为true,可多层级创建目录。
- * @param path 目录的应用沙箱路径。
- * @param recursion 是否多层级创建目录。recursion指定为true时,可多层级创建目录。recursion指定为false时,仅可创建单层目录。
- */
- static mkdirSync(path: string, recursion: boolean = true) {
- if (recursion) {
- fs.mkdirSync(path, recursion);
- } else {
- fs.mkdirSync(path);
- }
- }
- /**
- * 删除整个目录,使用Promise异步回调。
- * @param path 目录的应用沙箱路径。
- * @returns
- */
- static rmdir(path: string): Promise<void> {
- return fs.rmdir(path);
- }
- /**
- * 删除整个目录,以同步方法。
- * @param path 目录的应用沙箱路径。
- */
- static rmdirSync(path: string) {
- return fs.rmdirSync(path);
- }
- /**
- * 删除单个文件,使用Promise异步回调。
- * @param path 文件的应用沙箱路径。
- * @returns
- */
- static unlink(path: string): Promise<void> {
- return fs.unlink(path);
- }
- /**
- * 删除单个文件,以同步方法。
- * @param path 文件的应用沙箱路径。
- * @returns
- */
- static unlinkSync(path: string) {
- fs.unlinkSync(path);
- }
- /**
- * 检查文件是否存在,使用Promise异步回调。
- * @param path 文件应用沙箱路径。
- * @returns
- */
- static access(path: string): Promise<boolean> {
- return fs.access(path);
- }
- /**
- * 检查文件是否存在,以同步方法。
- * @param path 文件应用沙箱路径。
- * @returns
- */
- static accessSync(path: string): boolean {
- return fs.accessSync(path);
- }
- static getFileFd(uri: string) {
- let file = FileHelper.openSync(uri, fs.OpenMode.READ_ONLY)
- return file.fd
- }
- /**
- * 图片转base64
- * @param photoUri
- * @returns
- */
- static BmpToBase64(photoUri: string): Promise<string> {
- const imagePackerApi: image.ImagePacker = image.createImagePacker();
- const packOpts: image.PackingOption = { format: 'image/jpeg', quality: 100 };
- return new Promise<string>((resolve, reject) => {
- let file = FileHelper.openSync(photoUri, fs.OpenMode.READ_ONLY)
- const imageSource = image.createImageSource(file.fd);
- LogHelper.error('file.fd:' + file.fd)
- imageSource.createPixelMap().then((pixelMap) => {
- imagePackerApi.packing(pixelMap, packOpts).then((data: ArrayBuffer) => {
- let buf: buffer.Buffer = buffer.from(data);
- LogHelper.error('data:' + data)
- resolve(buf.toString('base64'))
- }).catch((err: BusinessError) => {
- LogHelper.error('packing failed with err: ' + JSON.stringify(err));
- reject(err)
- })
- }).catch((err: BusinessError) => {
- LogHelper.error('createPixelMap failed with err: ' + JSON.stringify(err));
- reject(err)
- });
- })
- }
- /**
- * 保存图片到相册,需要注意权限
- * @param pixmap
- */
- static saveImage(pixmap: image.PixelMap): Promise<string> {
- return new Promise<string>(async (resolve, reject) => {
- let imageBuffer: ArrayBuffer = new ArrayBuffer(1);
- try {
- imageBuffer = await image.createImagePacker().packing(pixmap, { format: "image/png", quality: 100 });
- } catch (err) {
- ToolsHelper.showMessage('保存失败');
- console.error(`Invoke packingPixelMap2Jpg failed, err: ${JSON.stringify(err)}`);
- reject()
- return;
- }
- const uri = await photoAccessHelper.getPhotoAccessHelper(GlobalContext.getContext())
- .createAsset(photoAccessHelper.PhotoType.IMAGE, 'png');
- fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
- .then(async (file) => {
- try {
- await fs.write(file.fd, imageBuffer);
- ToolsHelper.showMessage('保存成功');
- } finally {
- await fs.close(file.fd); // 确保文件关闭
- }
- resolve(uri);
- }).catch(() => {
- ToolsHelper.showMessage('保存失败');
- reject()
- return;
- });
- });
- }
- /**
- * 打开文件,支持使用URI打开文件。使用Promise异步回调。
- * @param path string 文件的应用沙箱路径或URI。
- * @param mode number 打开文件的选项,必须指定如下选项中的一个,默认以只读方式打开。
- * @returns
- */
- static open(path: string, mode: number = fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE): Promise<fs.File> {
- return fs.open(path, mode);
- }
- /**
- * 打开文件,支持使用URI打开文件。以同步方法。
- * @param path string 文件的应用沙箱路径或URI。
- * @param mode number 打开文件的选项,必须指定如下选项中的一个,默认以只读方式打开。
- * @returns
- */
- static openSync(path: string, mode: number = fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE): fs.File {
- return fs.openSync(path, mode);
- }
- /**
- * 从文件读取数据,使用Promise异步回调。
- * @param fd number 已打开的文件描述符。
- * @param buffer ArrayBuffer 用于保存读取到的文件数据的缓冲区。
- * @param options 支持如下选项:
- * offset,number类型,表示期望读取文件的位置。可选,默认从当前位置开始读。
- * length,number类型,表示期望读取数据的长度。可选,默认缓冲区长度。
- * @returns
- */
- static read(fd: number, buffer: ArrayBuffer, options?: ReadOptions): Promise<number> {
- return fs.read(fd, buffer, options)
- }
- /**
- * 从文件读取数据,以同步方法。
- * @param fd number 已打开的文件描述符。
- * @param buffer ArrayBuffer 用于保存读取到的文件数据的缓冲区。
- * @param options 支持如下选项:
- * offset,number类型,表示期望读取文件的位置。可选,默认从当前位置开始读。
- * length,number类型,表示期望读取数据的长度。可选,默认缓冲区长度。
- * @returns
- */
- static readSync(fd: number, buffer: ArrayBuffer, options?: ReadOptions): number {
- return fs.readSync(fd, buffer, options)
- }
- /**
- * 基于文本方式读取文件(即直接读取文件的文本内容),使用Promise异步回调。
- * @param filePath 文件的应用沙箱路径。
- * @param options 支持如下选项:
- * offset,number类型,表示期望读取文件的位置。可选,默认从当前位置开始读取。
- * length,number类型,表示期望读取数据的长度。可选,默认文件长度。
- * encoding,string类型,当数据是 string 类型时有效,表示数据的编码方式,默认 'utf-8',仅支持 'utf-8'。
- * @returns
- */
- static readText(filePath: string, options?: ReadTextOptions): Promise<string> {
- return fs.readText(filePath, options);
- }
- /**
- * 基于文本方式读取文件(即直接读取文件的文本内容),以同步方法。
- * @param filePath 文件的应用沙箱路径。
- * @param options 支持如下选项:
- * offset,number类型,表示期望读取文件的位置。可选,默认从当前位置开始读取。
- * length,number类型,表示期望读取数据的长度。可选,默认文件长度。
- * encoding,string类型,当数据是 string 类型时有效,表示数据的编码方式,默认 'utf-8',仅支持 'utf-8'。
- * @returns
- */
- static readTextSync(filePath: string, options?: ReadTextOptions): string {
- return fs.readTextSync(filePath, options);
- }
- /**
- * 将数据写入文件,使用Promise异步回调。
- * @param fd number 已打开的文件描述符。
- * @param buffer ArrayBuffer|string 待写入文件的数据,可来自缓冲区或字符串。
- * @param options 支持如下选项:
- * offset,number类型,表示期望写入文件的位置。可选,默认从当前位置开始写。
- * length,number类型,表示期望写入数据的长度。可选,默认缓冲区长度。
- * encoding,string类型,当数据是string类型时有效,表示数据的编码方式,默认 'utf-8'。当前仅支持 'utf-8'。
- * @returns
- */
- static write(fd: number, buffer: ArrayBuffer | string, options?: WriteOptions): Promise<number> {
- return fs.write(fd, buffer, options)
- }
- /**
- * 将数据写入文件,以同步方法。
- * @param fd number 已打开的文件描述符。
- * @param buffer ArrayBuffer|string 待写入文件的数据,可来自缓冲区或字符串。
- * @param options 支持如下选项:
- * offset,number类型,表示期望写入文件的位置。可选,默认从当前位置开始写。
- * length,number类型,表示期望写入数据的长度。可选,默认缓冲区长度。
- * encoding,string类型,当数据是string类型时有效,表示数据的编码方式,默认 'utf-8'。当前仅支持 'utf-8'。
- * @returns
- */
- static writeSync(fd: number, buffer: ArrayBuffer | string, options?: WriteOptions): number {
- return fs.writeSync(fd, buffer, options)
- }
- /**
- * 将数据写入文件,并关闭文件。
- * @param path string 文件的应用沙箱路径或URI。
- * @param buffer ArrayBuffer|string 待写入文件的数据,可来自缓冲区或字符串。
- * @param append 是否追加,true-追加,false-不追加(直接覆盖)
- * @returns
- */
- static async writeEasy(path: string, buffer: ArrayBuffer | string, append: boolean = true): Promise<number> {
- try {
- let file = FileHelper.openSync(path, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
- let offset = append ? FileHelper.statSync(file.fd).size : 0
- let options: WriteOptions = { offset: offset, encoding: 'utf-8' };
- return await FileHelper.write(file.fd, buffer, options).finally(() => {
- FileHelper.close(file.fd); //关闭文件
- });
- } catch (err) {
- let error = err as BusinessError;
- hilog.error(0x0000, '=====>', `FileHelper-writeEasy-异常 ~ code: ${error.code} -·- message: ${error.message}`)
- return -1;
- }
- }
- /**
- * 关闭文件,使用Promise异步回调。
- * @param file 已打开的File对象或已打开的文件描述符fd。
- * @returns
- */
- static close(file: fs.File | number): Promise<void> {
- return fs.close(file);
- }
- /**
- * 关闭文件,以同步方法。
- * @param file 已打开的File对象或已打开的文件描述符fd。
- */
- static closeSync(file: fs.File | number) {
- fs.closeSync(file);
- }
- /**
- * 列出文件夹下所有文件名,支持递归列出所有文件名(包含子目录下),支持文件过滤,使用Promise异步回调。
- * @param path string 文件夹的应用沙箱路径。
- * @param options 文件过滤选项。默认不进行过滤。
- * recursion boolean 是否递归子目录下文件名,默认为false。
- * listNum number 列出文件名数量。当设置0时,列出所有文件,默认为0。
- * filter Filter 文件过滤选项。当前仅支持后缀名匹配、文件名模糊查询、文件大小过滤、最近修改时间过滤。
- * @returns
- */
- static listFile(path: string, options?: ListFileOptions): Promise<string[]> {
- return fs.listFile(path, options);
- }
- /**
- * 列出文件夹下所有文件名,支持递归列出所有文件名(包含子目录下),支持文件过滤,以同步方法。
- * @param path string 文件夹的应用沙箱路径。
- * @param options 文件过滤选项。默认不进行过滤。
- * recursion boolean 是否递归子目录下文件名,默认为false。
- * listNum number 列出文件名数量。当设置0时,列出所有文件,默认为0。
- * filter Filter 文件过滤选项。当前仅支持后缀名匹配、文件名模糊查询、文件大小过滤、最近修改时间过滤。
- * @returns
- */
- static listFileSync(path: string, options?: ListFileOptions): string[] {
- return fs.listFileSync(path, options);
- }
- /**
- * 获取文件详细属性信息,使用Promise异步回调。
- * @param file string|number 文件应用沙箱路径path或已打开的文件描述符fd。
- */
- static stat(file: string | number): Promise<fs.Stat> {
- return fs.stat(file);
- }
- /**
- * 获取文件详细属性信息,以同步方法。
- * @param file string|number 文件应用沙箱路径path或已打开的文件描述符fd。
- * @returns
- */
- static statSync(file: string | number): fs.Stat {
- return fs.statSync(file);
- }
- /**
- * 拷贝文件或者目录,支持拷贝进度监听,使用Promise异步返回。
- * @param srcUri 待复制文件或目录的uri。
- * @param destUri 目标文件或目录的uri。
- * @param options options中提供拷贝进度回调:
- * ProgressListener 拷贝进度监听。
- * @returns
- */
- static copy(srcUri: string, destUri: string, options?: fs.CopyOptions): Promise<void> {
- return fs.copy(srcUri, destUri, options);
- }
- /**
- * 复制文件,使用Promise异步回调。
- * @param src string|number 待复制文件的路径或待复制文件的文件描述符。
- * @param dest string|number 目标文件路径或目标文件的文件描述符。
- * @param mode number 提供覆盖文件的选项,当前仅支持0,且默认为0。0:完全覆盖目标文件。
- * @returns
- */
- static copyFile(src: string | number, dest: string | number, mode: number = 0): Promise<void> {
- return fs.copyFile(src, dest, mode);
- }
- /**
- * 以同步方法复制文件。
- * @param src string|number 待复制文件的路径或待复制文件的文件描述符。
- * @param dest string|number 目标文件路径或目标文件的文件描述符。
- * @param mode number 提供覆盖文件的选项,当前仅支持0,且默认为0。0:完全覆盖目标文件。
- */
- static copyFileSync(src: string | number, dest: string | number, mode: number = 0) {
- fs.copyFileSync(src, dest, mode);
- }
- /**
- * 复制源文件夹至目标路径下,只能复制沙箱里的文件夹,使用Promise异步返回。
- * @param src 源文件夹的应用沙箱路径。
- * @param dest 目标文件夹的应用沙箱路径。
- * @param mode 复制模式:
- * mode为0,文件级别抛异常。目标文件夹下存在与源文件夹名冲突的文件夹,若冲突文件夹下存在同名文件,则抛出异常。源文件夹下未冲突的文件全部移动至目标文件夹下,目标文件夹下未冲突文件将继续保留,且冲突文件信息将在抛出异常的data属性中以Array<ConflictFiles>形式提供。
- * mode为1,文件级别强制覆盖。目标文件夹下存在与源文件夹名冲突的文件夹,若冲突文件夹下存在同名文件,则强制覆盖冲突文件夹下所有同名文件,未冲突文件将继续保留。
- * @returns
- */
- static copyDir(src: string, dest: string, mode: number = 1): Promise<void> {
- return fs.copyDir(src, dest, mode);
- }
- /**
- * 以同步方法复制源文件夹至目标路径下,只能复制沙箱里的文件夹。
- * @param src 源文件夹的应用沙箱路径。
- * @param dest 目标文件夹的应用沙箱路径。
- * @param mode 复制模式:
- * mode为0,文件级别抛异常。目标文件夹下存在与源文件夹名冲突的文件夹,若冲突文件夹下存在同名文件,则抛出异常。源文件夹下未冲突的文件全部移动至目标文件夹下,目标文件夹下未冲突文件将继续保留,且冲突文件信息将在抛出异常的data属性中以Array<ConflictFiles>形式提供。
- * mode为1,文件级别强制覆盖。目标文件夹下存在与源文件夹名冲突的文件夹,若冲突文件夹下存在同名文件,则强制覆盖冲突文件夹下所有同名文件,未冲突文件将继续保留。
- * @returns
- */
- static copyDirSync(src: string, dest: string, mode: number = 1) {
- fs.copyDirSync(src, dest, mode);
- }
- /**
- * 移动文件,使用Promise异步回调。
- * @param src string 源文件的应用沙箱路径。
- * @param dest string 目的文件的应用沙箱路径。
- * @param mode number 移动模式。若mode为0,移动位置存在同名文件时,强制移动覆盖。若mode为1,移动位置存在同名文件时,抛出异常。默认为0。
- * @returns
- */
- static moveFile(src: string, dest: string, mode: number = 0): Promise<void> {
- return fs.moveFile(src, dest, mode)
- }
- /**
- * 移动文件,以同步方法。
- * @param src string 源文件的应用沙箱路径。
- * @param dest string 目的文件的应用沙箱路径。
- * @param mode number 移动模式。若mode为0,移动位置存在同名文件时,强制移动覆盖。若mode为1,移动位置存在同名文件时,抛出异常。默认为0。
- * @returns
- */
- static moveFileSync(src: string, dest: string, mode: number = 0) {
- fs.moveFileSync(src, dest, mode)
- }
- /**
- * 移动源文件夹至目标路径下,使用Promise异步返回。
- * @param src 源文件夹的应用沙箱路径
- * @param dest 目标文件夹的应用沙箱路径
- * @param mode 移动模式:
- * mode为0,文件夹级别抛异常。若目标文件夹下存在与源文件夹名冲突的非空文件夹,则抛出异常。
- * mode为1,文件级别抛异常。目标文件夹下存在与源文件夹名冲突的文件夹,若冲突文件夹下存在同名文件,则抛出异常。源文件夹下未冲突的文件全部移动至目标文件夹下,目标文件夹下未冲突文件将继续保留,且冲突文件信息将在抛出异常的data属性中以Array<ConflictFiles>形式提供。
- * mode为2,文件级别强制覆盖。目标文件夹下存在与源文件夹名冲突的文件夹,若冲突文件夹下存在同名文件,则强制覆盖冲突文件夹下所有同名文件,未冲突文件将继续保留。
- * mode为3,文件夹级别强制覆盖。移动源文件夹至目标文件夹下,目标文件夹下移动的文件夹内容与源文件夹完全一致。若目标文件夹下存在与源文件夹名冲突的文件夹,该文件夹下所有原始文件将不会保留。
- * @returns
- */
- static moveDir(src: string, dest: string, mode: number = 3): Promise<void> {
- return fs.moveDir(src, dest, mode);
- }
- /**
- * 以同步方法移动源文件夹至目标路径下。
- * @param src 源文件夹的应用沙箱路径
- * @param dest 目标文件夹的应用沙箱路径
- * @param mode 移动模式:
- * mode为0,文件夹级别抛异常。若目标文件夹下存在与源文件夹名冲突的非空文件夹,则抛出异常。
- * mode为1,文件级别抛异常。目标文件夹下存在与源文件夹名冲突的文件夹,若冲突文件夹下存在同名文件,则抛出异常。源文件夹下未冲突的文件全部移动至目标文件夹下,目标文件夹下未冲突文件将继续保留,且冲突文件信息将在抛出异常的data属性中以Array<ConflictFiles>形式提供。
- * mode为2,文件级别强制覆盖。目标文件夹下存在与源文件夹名冲突的文件夹,若冲突文件夹下存在同名文件,则强制覆盖冲突文件夹下所有同名文件,未冲突文件将继续保留。
- * mode为3,文件夹级别强制覆盖。移动源文件夹至目标文件夹下,目标文件夹下移动的文件夹内容与源文件夹完全一致。若目标文件夹下存在与源文件夹名冲突的文件夹,该文件夹下所有原始文件将不会保留。
- * @returns
- */
- static moveDirSync(src: string, dest: string, mode: number = 3) {
- return fs.moveDirSync(src, dest, mode);
- }
- /**
- * 截断文件,使用Promise异步回调。
- * @param file string|number 文件的应用沙箱路径或已打开的文件描述符fd。
- * @param len number 文件截断后的长度,以字节为单位。默认为0。
- * @returns
- */
- static truncate(file: string | number, len: number = 0): Promise<void> {
- return fs.truncate(file, len)
- }
- /**
- * 截断文件,以同步方法。
- * @param file string|number 文件的应用沙箱路径或已打开的文件描述符fd。
- * @param len number 文件截断后的长度,以字节为单位。默认为0。
- * @returns
- */
- static truncateSync(file: string | number, len: number = 0) {
- fs.truncateSync(file, len)
- }
- /**
- * 获取链接文件信息,使用Promise异步回调。
- * @param path string 文件的应用沙箱路径。
- * @returns
- */
- static lstat(path: string): Promise<fs.Stat> {
- return fs.lstat(path);
- }
- /**
- * 获取链接文件信息,以同步方法。
- * @param path string 文件的应用沙箱路径。
- * @returns
- */
- static lstatSync(path: string): fs.Stat {
- return fs.lstatSync(path);
- }
- /**
- * 同步文件数据,使用Promise异步回调。
- * @param fd number 已打开的文件描述符。
- * @returns
- */
- static fsync(fd: number): Promise<void> {
- return fs.fsync(fd);
- }
- /**
- * 同步文件数据,以同步方法。
- * @param fd number 已打开的文件描述符。
- */
- static fsyncSync(fd: number) {
- fs.fsyncSync(fd);
- }
- /**
- * 实现文件内容数据同步,使用Promise异步回调。
- * @param fd number 已打开的文件描述符。
- * @returns
- */
- static fdatasync(fd: number): Promise<void> {
- return fs.fdatasync(fd);
- }
- /**
- * 实现文件内容数据同步,以同步方法。
- * @param fd number 已打开的文件描述符。
- */
- static fdatasyncSync(fd: number) {
- fs.fdatasyncSync(fd);
- }
- /**
- * 基于文件路径打开文件流,使用Promise异步回调。
- * @param path string 文件的应用沙箱路径。
- * @param mode string 文件打开类型
- * r:打开只读文件,该文件必须存在。
- * r+:打开可读写的文件,该文件必须存在。
- * w:打开只写文件,若文件存在则文件长度清0,即该文件内容会消失。若文件不存在则建立该文件。
- * w+:打开可读写文件,若文件存在则文件长度清0,即该文件内容会消失。若文件不存在则建立该文件。
- * a:以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
- * a+:以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
- * @returns
- */
- static createStream(path: string, mode: string = 'r'): Promise<fs.Stream> {
- return fs.createStream(path, mode)
- }
- /**
- * 基于文件路径打开文件流,以同步方法。
- * @param path string 文件的应用沙箱路径。
- * @param mode string 文件打开类型
- * r:打开只读文件,该文件必须存在。
- * r+:打开可读写的文件,该文件必须存在。
- * w:打开只写文件,若文件存在则文件长度清0,即该文件内容会消失。若文件不存在则建立该文件。
- * w+:打开可读写文件,若文件存在则文件长度清0,即该文件内容会消失。若文件不存在则建立该文件。
- * a:以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
- * a+:以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
- * @returns
- */
- static createStreamSync(path: string, mode: string = 'r'): fs.Stream {
- return fs.createStreamSync(path, mode);
- }
- /**
- * 基于文件描述符打开文件流,使用Promise异步回调。
- * @param fd number 已打开的文件描述符。
- * @param mode string 文件打开类型
- * r:打开只读文件,该文件必须存在。
- * r+:打开可读写的文件,该文件必须存在。
- * w:打开只写文件,若文件存在则文件长度清0,即该文件内容会消失。若文件不存在则建立该文件。
- * w+:打开可读写文件,若文件存在则文件长度清0,即该文件内容会消失。若文件不存在则建立该文件。
- * a:以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
- * a+:以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
- * @returns
- */
- static fdopenStream(fd: number, mode: string = 'r'): Promise<fs.Stream> {
- return fs.fdopenStream(fd, mode)
- }
- /**
- * 基于文件描述符打开文件流,以同步方法。
- * @param fd number 已打开的文件描述符。
- * @param mode string 文件打开类型
- * r:打开只读文件,该文件必须存在。
- * r+:打开可读写的文件,该文件必须存在。
- * w:打开只写文件,若文件存在则文件长度清0,即该文件内容会消失。若文件不存在则建立该文件。
- * w+:打开可读写文件,若文件存在则文件长度清0,即该文件内容会消失。若文件不存在则建立该文件。
- * a:以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
- * a+:以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
- * @returns
- */
- static fdopenStreamSync(fd: number, mode: string = 'r'): fs.Stream {
- return fs.fdopenStreamSync(fd, mode)
- }
- /**
- * 创建临时目录,使用Promise异步回调。
- * @param prefix string 用随机产生的字符串替换以“XXXXXX”结尾目录路径。
- * @returns
- */
- static mkdtemp(prefix: string): Promise<string> {
- return fs.mkdtemp(prefix);
- }
- /**
- * 创建临时目录,以同步的方法。
- * @param prefix string 用随机产生的字符串替换以“XXXXXX”结尾目录路径。
- * @returns
- */
- static mkdtempSync(prefix: string): string {
- return fs.mkdtempSync(prefix);
- }
- /**
- * 将文件描述符转化为File。
- * @param fd 文件描述符。
- * @returns
- */
- static dup(fd: number): fs.File {
- return fs.dup(fd);
- }
- /**
- * 修改文件最近访问时间属性。
- * path 文件的应用沙箱路径。
- * mtime 待更新的时间戳。自1970年1月1日起至目标时间的毫秒数。仅支持修改文件最近访问时间属性。
- * @returns
- */
- static utimes(path: string, mtime: number): void {
- fs.utimes(path, mtime);
- }
- /**
- * 格式化文件大小
- * @param fileSize
- * @returns
- */
- static getFormatFileSize(fileSize: number): string {
- if (fileSize < 1024) {
- return fileSize + "B";
- } else if (fileSize < 1024 * 1024) {
- return (fileSize / 1024).toFixed(1) + "KB";
- } else if (fileSize < 1024 * 1024 * 1024) {
- return (fileSize / (1024 * 1024)).toFixed(1) + "MB";
- } else if (fileSize < 1024 * 1024 * 1024 * 1024) {
- return (fileSize / (1024 * 1024 * 1024)).toFixed(1) + "GB";
- } else {
- return (fileSize / (1024 * 1024 * 1024 * 1024)).toFixed(1) + "TB";
- }
- }
- }
|