文件

61 阅读5分钟
let applicationContext = getContext(this).getApplicationContext();
let pathDir = applicationContext.filesDir;
let filePath = pathDir + "/test.txt";
let dir = pathDir + "/temp1";


// 1. 获取文件详细属性信息
let stat = fs.statSync(filePath)
console.info("文件信息 " + stat.size + "---" + JSON.stringify(stat));

// 2. 获取链接文件信息。
let stat1 = fs.lstatSync(filePath)
console.info("文件信息 " + stat.size + "---" + JSON.stringify(stat1));

// 2. 检查文件是否存在
let exists = fs.accessSync(filePath);
console.info("是否存在 " + exists);

// 3. 已打开的File对象或已打开的文件描述符fd,关闭后file对象或文件描述符不再具备实际意义,不可再用于进行读写等操作。
let file = fs.openSync(filePath);
fs.closeSync(file);

let filePathNew = pathDir + "/test1.txt";
// 4 . 拷贝文件或者目录 和 copy 进度
fs.copy(filePath, filePathNew, {
  progressListener: (progress: fs.Progress) => {
    console.info("进度 " + progress);
  }
})
let filePathNew1 = pathDir + "/test2.txt";
// 4 . 拷贝文件或者目录 和 copy 进度
fs.copy(filePath, filePathNew1, (error) => {
  if (error) {
    console.info("copy  失败" + error.code);
  } else {
    console.info("copy  成功");
  }
})
// 5. 复制文件 完全覆盖
let filePathNew2 = pathDir + "/test3.txt";
fs.copyFileSync(filePath, filePathNew2)

// 6. 复制源文件夹至目标路径下,mode 是1 全覆盖
fs.copyDirSync(filePath, filePathNew2, 1)

// 7 。 将文件描述符转化为File
let filePath1 = pathDir + "/test.txt";
let file1 = fs.openSync(filePath1, fs.OpenMode.READ_WRITE);
let fd: number = file1.fd;
let file2 = fs.dup(fd);
console.info("The name of the file2 is " + file2.name);
fs.closeSync(file1);
fs.closeSync(file2);
// 8。创建目录 以同步方法创建目录 ,多级目录创建
fs.mkdirSync(dir)
fs.mkdirSync(dir, true)

// 9. 打开文件,使用Promise异步返回。支持使用URI打开文件。
// fs.OpenMode.READ_ONLY 只读
// fs.OpenMode.WRITE_ONLY 只写
// fs.OpenMode.READ_WRITE 读写
// OpenMode.CREATE:若文件不存在,则创建文件。
// OpenMode.TRUNC:如果文件存在且文件具有写权限,则将其长度裁剪为零。
// OpenMode.APPEND(0o2000):以追加方式打开,后续写将追加到文件末尾
let filePath4 = pathDir + "/test.txt";
let fileNew: fs.File = fs.openSync(filePath4, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)

// 读取文件
// 支持如下选项:
// - 读到 buffer 缓冲区
// - offset,number类型,表示期望读取文件的位置。可选,默认从当前位置开始读。
//
// - length,number类型,表示期望读取数据的长度。可选,默认缓冲区长度。
let buffer = new ArrayBuffer(1024)
fs.readSync(fileNew.fd, buffer, { offset: 1, length: 1000 })


// 删除整个目录
fs.rmdirSync('')
// 删除单个文件
fs.unlinkSync('')
// 将数据写入文件 fd,buffer options
fs.writeSync(1, '1111111')
// 按行读
fs.readLinesSync('')
read() {

  // 读取所有的内容
  let applicationContext = getContext(this).getApplicationContext();
  let pathDir = applicationContext.filesDir;
  let filePath = pathDir + "/test.txt";
  let options: Options = {
    encoding: 'utf-8'
  };
  fs.readLines(filePath, options).then((readerIterator: fs.ReaderIterator) => {
    // done 表示是否读取完毕 readerIterator.next() 放到下一行
    for (let it = readerIterator.next();!it.done; it = readerIterator.next()) {
      console.info("content: " + it.value);
    }
  }).catch((err: BusinessError) => {
    console.error("readLines failed with error message: " + err.message + ", error code: " + err.code);
  });

  // 基于文本方式读取文件,可以选择offset
  fs.readTextSync('')

  // 重命名
  fs.renameSync("old", "new")

  // 将文件系统缓存数据写入磁盘
  let filePath11 = pathDir + "/test.txt";
  let file = fs.openSync(filePath11);
  fs.fsyncSync(file.fd);
  fs.closeSync(file);


  // 以同步方法实现文件内容数据同步
  let filePath2 = pathDir + "/test.txt";
  let file2 = fs.openSync(filePath2);
  fs.fdatasyncSync(file2.fd);
  fs.closeSync(file);

  // 基于文件路径创建符号链接
  let srcFile = pathDir + "/test.txt";
  let dstFile = pathDir + "/test";
  fs.symlinkSync(srcFile, dstFile);

  // 列出文件夹下所有文件名,支持递归列出所有文件名(包含子目录下),支持文件过滤
  // 文件过滤选项。默认不进行过滤。
  let listFileOption: ListFileOptions = {
    recursion: false,
    listNum: 0,
    filter: {
      suffix: [".png", ".jpg", ".jpeg"],
      displayName: ["*abc", "efg*"],
      fileSizeOver: 1024
    }
  };
  let filenames = fs.listFileSync('', listFileOption)
  for (let i = 0; i < filenames.length; i++) {
    console.info("filename: %s", filenames[i]);
  }

  // 移动源文件夹至目标路径下
  // 1. mode为0,文件夹级别抛异常
  // 2. mode为1文件级别抛异常。目标文件夹下存在与源文件夹名冲突的文件夹,若冲突文件夹下存在同名文件,则抛出异常。
  // 3. mode为2,文件级别强制覆盖。目标文件夹下存在与源文件夹名冲突的文件夹,若冲突文件夹下存在同名文件,则强制覆盖冲突文件夹下所有同名文件,未冲突文件将继续保留。
  fs.moveDirSync("srcPath", "destPath", 1);


  // 移动文件 移动模式。若mode为0,移动位置存在同名文件时,强制移动覆盖。若mode为1,移动位置存在同名文件时,抛出异常。默认为0。
  fs.moveFileSync('', '')


  // 以同步的方法创建临时目录
  fs.mkdtempSync('')

  // 基于文件路径或文件对象创建RandomAccessFile文件对象,
  let filePath111 = pathDir + "/test.txt";
  let file111 = fs.openSync(filePath111, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
  fs.createRandomAccessFileSync(file111)

  // 打开流
  // - r:打开只读文件,该文件必须存在。
  //
  // - r+:打开可读写的文件,该文件必须存在。
  //
  // - w:打开只写文件,若文件存在则文件长度清0,即该文件内容会消失。若文件不存在则建立该文件。
  //
  // - w+:打开可读写文件,若文件存在则文件长度清0,即该文件内容会消失。若文件不存在则建立该文件。
  //
  // - a:以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
  //
  // - a+:以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
  let stream = fs.createStreamSync('', 'r')
  stream.closeSync();

  // 基于文件描述符打开文件流
  let filePathfdop = pathDir + "/test.txt";
  let filefdop = fs.openSync(filePathfdop);
  let stream2 = fs.fdopenStreamSync(filefdop.fd, "r+")
  stream2.closeSync()




  // 监听变动的事件集,多个事件通过或(|)的方式进行集合。
  //
  // - 0x1: IN_ACCESS, 文件被访问。
  //
  // - 0x2: IN_MODIFY,文件内容被修改。
  //
  // - 0x4: IN_ATTRIB,文件元数据被修改。
  //
  // - 0x8: IN_CLOSE_WRITE,文件在打开时进行了写操作,然后被关闭。
  //
  // - 0x10: IN_CLOSE_NOWRITE,文件或目录在打开时未进行写操作,然后被关闭。
  //
  // - 0x20: IN_OPEN,文件或目录被打开。
  //
  // - 0x40: IN_MOVED_FROM,监听目录中文件被移动走。
  //
  // - 0x80: IN_MOVED_TO,监听目录中文件被移动过来。
  //
  // - 0x100: IN_CREATE,监听目录中文件或子目录被创建。
  //
  // - 0x200: IN_DELETE,监听目录中文件或子目录被删除。
  //
  // - 0x400: IN_DELETE_SELF,监听的目录被删除,删除后监听停止。
  //
  // - 0x800: IN_MOVE_SELF,监听的文件或目录被移动,移动后监听继续。
  //
  // - 0xfff: IN_ALL_EVENTS,监听以上所有事件。
  fs.createWatcher('path', 0x4, (event: WatchEvent) => {
  })


  // 是否是目录
  let isDirectory = fs.statSync("dirPath").isDirectory();
  // 是否是文件
  let isFile = fs.statSync("dirPath").isFile();



  let fileNew = fs.openSync("path");
  fs.closeSync(fileNew);
  fileNew.getParent()// 获取父亲

}