nodejs 之 file system 文件系统

时间:2022-09-05 16:03:59

var fs = require('fs');
/**
   先解释有函数如:unlink()和unlinkSync(),它们的功能是一样的
   只是unlink是同步类型,因为它最后那个参数是回调函数,而unlinkSync参数中是没有回调函数的
   两个方法运用比较如下:
   1,fs.unlink('/tmp/hello', function (err) {
         if (err) throw err;
         console.log('successfully deleted /tmp/hello');
       });
   2,fs.unlinkSync('/tmp/hello')
      console.log('successfully deleted /tmp/hello');
   
   同步类型的方法并没有固定的运行顺序,如下面的代码就可能出错:
    fs.rename('/tmp/hello', '/tmp/world', function (err) {
          if (err) throw err;
          console.log('renamed complete');
    });
        fs.stat('/tmp/world', function (err, stats) {
          if (err) throw err;
          console.log('stats: ' + JSON.stringify(stats));
        });
        fs.stat很可能在fs.rename之前被执行。下面是正确的方法:
        fs.rename('/tmp/hello', '/tmp/world', function (err) {
          if (err) throw err;
          fs.stat('/tmp/world', function (err, stats) {
            if (err) throw err;
            console.log('stats: ' + JSON.stringify(stats));
          });
        });
        在很繁忙进程中,强烈建议使用异步类型的函数。因同步的,在它没有运行完之前,将阻塞整个进程
        
*/


/** fs.rename(oldPath, newPath, [callback])
 
*/

/** fs.truncate(fd, len, [callback])
 
*/

/** fs.chown(path, uid, gid, [callback])
    fs.fchown(fd, uid, gid, [callback])
    fs.lchown(path, uid, gid, [callback])
 
*/

/** fs.chmod(path, mode, [callback])
    fs.fchmod(fd, mode, [callback])
    fs.lchmod(path, mode, [callback])
 
*/

/** fs.stat(path, [callback])
    fs.lstat(path, [callback])
    fs.fstat(fd, [callback]) fd file descriptor文件说明符
    它们的回调函数拥有两个参数(err,stats),stats为fs.Stats对象
     •stats.isFile()
         •stats.isDirectory()
         •stats.isBlockDevice()
         •stats.isCharacterDevice()
         •stats.isSymbolicLink() (only valid with fs.lstat())
         •stats.isFIFO()
         •stats.isSocket()

*/

/** fs.link(srcpath, dstpath, [callback])
    fs.symlink(srcpath, dstpath, [type], [callback])
        type参数值为dir、file或junction.只适用于Windows,其他平台type被忽略
        当用的是junctions时,dstpath(destination path目标路径)要为绝对路径
        dstpath将会被自动标准化(normalized)为绝对路径
    fs.readlink(path, [callback])
      回调函数拥有两个参数(err, linkString)
*/


/** fs.realpath(path, [cache], callback)
    回调函数拥有两个参数(err, resolvedPath)
*/
  var cache = {'/etc':'/private/etc'};
  fs.realpath(process.cwd() +'/etc/passwd', cache, function(err, resolvedPath){
      if(err) throw err;
      console.log(resolvedPath);
    });

/** fs.unlink(path, [callback])
*/


/** fs.rmdir(path, [callback])          删除目录
    fs.mkdir(path, [mode], [callback])  创建目录
    fs.readdir(path, [callback])
      回调函数拥有两个参数(err, files) files为path路径下文件名的数组
    
*/


/** fs.close(fd, [callback])
*/

/** fs.open(path, flags, [mode], [callback])
     回调函数拥有两个参数(err, fd)
*/

/** fs.write(fd, buffer, offset, length, position, [callback])
    回调函数拥有三个参数(err, written, buffer)
    buffer写到fd文件的内容,offset,length为从offset位置开始写length长的内容(buffer)
    position为从fd文件position位置开始把内容写进去
*/

/** fs.read(fd, buffer, offset, length, position, [callback])
     在buffer的offset位置开始写入fd文件中position位置开始的内容,内容长度为length
     回调函数拥有三个参数(err, bytesRead, buffer).

*/
/** fs.readFile(filename, [encoding], [callback])
     读取文件的全部内容
     回调函数拥有两个参数(err, data).data为文件的内容
*/
  fs.readFile('/etc/passwd', function (err, data) {
     if (err) throw err;
       console.log(data);
   });
/** fs.writeFile(filename, data, [encoding], [callback])
     将data数据写入到filename中
*/
  fs.writeFile('message.txt', 'Hello Node', function (err) {
     if (err) throw err;
     console.log('It\'s saved!');
  });
/** fs.appendFile(filename, data, encoding='utf8', [callback])
     将data数据添加到filename文件中,文件不存在会自动创建
     当data为buffer时,encoding忽略不写,data可以为string或buffer
*/
  fs.appendFile('message.txt', 'data to append', function (err) {
    if (err) throw err;
     console.log('The "data to append" was appended to file!');
  });
/** fs.watchFile(filename, [options], listener) //不稳定,如果可用,用fs.watch()
      监视文件,listener回调函数在每次文件被使用时触发
      options有两个选项:persistent 布尔值--文件被监视进程是否再继续,
                        interval 时间(单位毫秒)--文件被多长时间被查询一次
    fs.unwatchFile(filename, [listener])   //不稳定,如果可用,用fs.watch()
    fs.watch(filename, [options], [listener]) //不稳定,不是所有的平台都适用
*/
   fs.watchFile('message.text', function (curr, prev) {
          console.log('the current mtime is: ' + curr.mtime);
          console.log('the previous mtime was: ' + prev.mtime);
        });
        fs.watch('somedir', function (event, filename) { //目前只有linux和windows平台提供filename参数
          console.log('event is: ' + event);
          if (filename) {
            console.log('filename provided: ' + filename);
          } else {
            console.log('filename not provided');
          }
        });
        
/**  fs.exists(path, [callback])
     判断path是否存在
*/
 fs.exists('/etc/passwd', function (exists) {
  util.debug(exists ? "it's there" : "no passwd!");
});

/**  fs.createReadStream(path, [options])
      { flags: 'r',
        encoding: null, //'utf8', 'ascii', or 'base64'
        fd: null,
        mode: 0666,
        bufferSize: 64 * 1024
      } 也有start,end表示从什么位置开始读,到什么位置结束
*/
/**  fs.createWriteStream(path, [options])
      { flags: 'w',
              encoding: null,
              mode: 0666 }也包括start允许从什么位置开始写入数据
*/
/** fs.utimes(path, atime, mtime, [callback])
      更改path路径下的文件的文件时间戳
      fs.futimes(fd, atime, mtime, [callback])
      更改有关该文件说明符的文件的文件时间戳
*/


/** fs.fsync(fd, [callback])
*/