国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

淺談Node.js:fs文件系統模塊

2019-11-19 18:37:36
字體:
來源:轉載
供稿:網友

fs文件系統模塊,這是一個非常重要的模塊,對文件的操作都基于它。該模塊的所有方法都有同步和異步兩種方式,下面便介紹一下該模塊的使用。

1、檢測當前進程對文件的權限

使用fs.access(path[, mode], callback)方法檢查權限,mode參數是一個整數,有以下常量值:

  • fs.constants.F_OK     path對調用進程是可見的,既存在
  • fs.constants.R_OK     path是可讀的
  • fs.constants.W_OK    path是可寫的
  • fs.constants.X_OK     path是可執行的

 使用如下所示:

fs.access('./note.txt',fs.constants.F_OK,(err)=>{console.log(err?'文件不存在':'文件已經存在');});

同步版本,如果發生異常,則直接拋出異常,否則什么也不做。同步版本可以利用try..catch來做,適用所有方法,如下所示:

try{fs.accessSync('./note.txt',fs.constants.F_OK);}catch(ex){console.log('文件不存在');}

2、獲取文件狀態

使用fs.stat(path, callback)fs.statSync(path)方法來獲取指定path的狀性,callback有(err, stats)兩個參數,stats是fs.stats對象,具有以下屬性:

{ dev: 638212, mode: 33206, nlink: 1, uid: 0, gid: 0, rdev: 0, blksize: undefined, ino: 105553116266564850, size: 1094, blocks: undefined, atime: 2016-11-22T08:45:43.505Z, mtime: 2016-11-22T09:33:13.535Z, ctime: 2016-11-22T09:33:13.535Z, birthtime: 2016-11-22T08:45:43.505Z }

還有以下方法:

stats.isFile() stats.isDirectory() stats.isBlockDevice() stats.isCharacterDevice() stats.isSymbolicLink() (only valid with fs.lstat()) stats.isFIFO() stats.isSocket()

使用如下所示:

fs.stat('./app.js',(err,stats)=>{  if(err) throw err;  console.log(stats);});var stats = fs.statSync('../test.txt');//同步版本

3、文件追加

使用fs.appendFile(file, data[, options], callback)方法向file寫入數據,如果file不存在,則創建file,data參數為字符串或buffer,options可選參數是對象或字符串,具有以下屬性:

  • encoding  |  default = 'utf8' 編碼
  • mode  default = 0o666 打開模式
  • flag  default = 'a'

使用如下所示:

fs.appendFile('./test.txt','hello world!/r/n',(err)=>{  if(err) throw err;  console.log('寫入成功');});//appendFile同步版本,返回值為undefinedfs.appendFileSync('./test.txt','hello nodejs!/r/n');

4、文件讀取和寫入

文件讀取使用fs.readFile(file[, options], callback)方法,參數含義如下:

  • file 文件名或文件描述符
  • options 對象或字符串,如果是對象,則包含encoding和flag,前者默認為null,后者為'r'
  • callback 參數為(err,data)

如果指定的文件不存在,則直接拋出錯誤。使用如下所示:

fs.readFile('./test4.txt',{encoding:'utf8',flag:'r'},(err,data)=>{if(err) throw err;console.log(data);});var data = fs.readFileSync('../test4.txt',{encoding:'utf8',flag:'r'});

文件寫入數據,使用fs.writeFile(file, data[, options], callback)方法,參數含義如下:

  • file 文件名或文件描述符
  • data 字符串或buffer
  • options 對象或字符串,如果是對象,則包含encoding、mode以及flag,依次默認為utf8,0o666,'w'
  • callback 參數err

如果指定的文件不存在,則創建該文件,相反則替換原來的文件。使用如下所示:

var data = "hello node!";fs.writeFile('./test1.txt',data,{flag:'w'},(err)=>{if(err) throw err;console.log('written ok.');});fs.writeFileSync('./test1.txt',data,{flag:'w'});

我們也可以利用fs的open,read,write,stat等方法來實現文件的讀取和寫入。

fs.open(path, flags[, mode], callback)方法打開一個文件獲取句柄,flags參數有以下這些:

  • 'r' - 以只讀方式打開文件,若文件不存在則報錯。
  • 'r+' - 以讀寫方式打開文件,若文件不存在則報錯。
  • 'rs+' 在同步模式下,以讀寫方式打開文件
  • 'w' - 以寫方式打開文件,若文件不存在則創建
  • 'wx' - 以寫方式打開文件,若文件不存在則拋出異常.
  • 'w+' - 以讀寫方式打開文件,若文件不存在則創建,相反則清空文件.
  • 'wx+' - 以讀寫方式打開文件,若文件不存在則拋出異常.
  • 'a' - 以追加方式打開文件,若文件不存則創建文件
  • 'ax' - 以追加方式打開文件,若文件不存則拋出異常.
  • 'a+' - 以追加和讀方式打開文件,若文件不存則創建文件
  • 'ax+' - 以追加和讀方式打開文件,若文件不存則失敗

callback回調函數有(err,fd)兩個參數。

fs.read(fd, buffer, offset, length, position, callback)方法,從一個文件中讀取數據存入buffer中,參數含義如下:

  • buffer Buffer對象,用來存儲讀取的數據
  • offset buffer開始寫的位置
  • length 需要讀取的長度
  • position 指定從文件的哪個位置開始讀取,若設置為null,則從文件當前位置開始讀取
  • callback 有三個參數(err, bytesRead, buffer) bytesRead為實際讀取字節數
  • fs.write(fd, buffer, offset, length[, position], callback)方法,將buffer數據寫如指定文件中,參數含義如下:
  • offset和length指定buffer的部分
  • position 指定文件的開始寫入的文件,若不為數字則從文件當前位置開始寫入

 下面是一個使用open,write,read,stat方法實現的文件內容復制的函數,如下所示:

function copy(src, dest) {const destFd = fs.openSync(dest, 'w+'),   srcStat = fs.statSync(src);const buffer = new Buffer(srcStat.size);console.log('復制開始...');console.log(src+'大小:'+srcStat.size)fs.open(src,'r',(err,fd)=>{  if(err) throw err;  fs.read(fd,buffer,0,srcStat.size,null,(err,bytesRead,buff)=>{    if(err) throw err;    console.log('實際讀取大小:'+bytesRead);    fs.close(fd,()=>{});    fs.write(destFd,buff,0,bytesRead,null,(err, written, buffer)=>{      if(err) throw err;      console.log('已完成復制,向'+dest+'寫入了'+written);      fs.close(destFd,()=>{});    });  });});}copy('./app.js','./appbak.js');

執行結果如下:

E:/developmentdocument/nodejsdemo>node fs-examples.js
復制開始...
 ./app.js大小:1094
實際讀取大小:1094
已完成復制,向./appbak.js寫入了1094

5、文件重命名、刪除

方法fs.rename(oldPath, newPath, callback)可以實現文件的重命名,還能實現文件的移動,如果oldPath與newPath在同一目錄下,則是重命名,否則是移動文件并重命名,使用如下所示:

fs.rename('../test4.txt','./test4.txt',(err)=>{  if(err) throw err;  console.log('rename success.');});fs.renameSync('../test2.txt','../test4.txt');

文件刪除需要用到fs.unlink(path, callback)方法,使用也很簡單,如下所示:

fs.unlink('./dir/11.txt',(err)=>{  if(err) throw err;  console.log('delete file success.');});fs.unlinkSync('./dir/11.txt');

6、創建、讀取、刪除目錄

創建目錄使用的是fs.mkdir(path[, mode], callback)方法,mode參數默認為0o777,但是該方法只能創建一級目錄,否則拋出異常,如下所示:

fs.mkdir('./a',0o777,(err)=>{  if(err) throw err;  console.log('mkdir success');});//mkdir的同步版本,返回值為undefinedfs.mkdirSync('./test',0o777);

為了能夠創建多級目錄,可以自己定義一個函數來實現,需要用到path模塊的dirname方法,如下所示:

function isFileExists(filePath){  var bool = !0;  try{    fs.accessSync(filePath,fs.F_OK);  }catch(err){    bool = !1;  }  return bool;}function mkdirp(dirpath,mode,cb){  if(isFileExists(dirpath)){    cb(dirpath);  }else{    mkdirp(path.dirname(dirpath),mode,function(){      fs.mkdir(dirpath,mode,cb);    });  }}

掃描目錄需要用到fs.readdir(path[, options], callback)方法,options參數為字符串或對象,callback回調函數有(err, files)兩個參數,files是一個文件名數組,該方法也是只能掃描一級目錄,使用如下所示:

fs.readdir('./',(err,files)=>{  if(err) throw err;  console.log(files);});

如果要實現可以遞歸掃描目錄,可以自己定義一個函數,如下所示:

function scandir(dirpath){  var filesArr = {};  if(!isFileExists(dirpath)) return !1;  function scan(filepath){    var statObj = fs.statSync(filepath);    if(!statObj.isDirectory()) return filesArr.push(filepath);    var files = fs.readdirSync(filepath);    files.forEach((file,idx,arr)=>{      scan(filepath+'/'+file);    });  }  scan(dirpath);  return filesArr;}

刪除目錄使用fs.rmdir(path, callback)方法,只能刪除一級目錄且目錄須為空,使用如下所示:

fs.rmdir('./dir',(err)=>{  if(err) throw err;  console.log('delete dir success.');});

要實現類似rm -rf的遞歸刪除效果,可以使用如下代碼:

function deldirs(dirpath){  var stat = null,    emptyFoldersArr = [];    function scan(spath){    var files = fs.readdirSync(spath);    emptyFoldersArr.push(spath);    if(files.length>0){      files.forEach((file,idx,arr)=>{        if(fs.statSync(spath+'/'+file).isDirectory()){          scan(spath+'/'+file);        }else{          return fs.unlinkSync(spath+'/'+file),!0;        }      });    }  }  scan(dirpath);  for(var l=emptyFoldersArr.length-1,i=l;i>=0;i--){    fs.rmdirSync(emptyFoldersArr[i]);  }}

7、獲取路徑的絕對路徑

使用fs.realpath(path[, options], callback)方法可以獲取path的絕對路徑,callback有(err, resolvedPath)兩個參數,使用如下所示:

fs.realpath('./test.txt',(err,resolvePath)=>{  if(err) throw err;  console.log(resolvePath);});console.log(fs.realpathSync('./test.txt'));

執行結果如下所示:

E:/developmentdocument/nodejsdemo>node fs-examples.js
E:/developmentdocument/nodejsdemo/test.txt

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 文登市| 安康市| 阜康市| 同江市| 龙门县| 井冈山市| 马尔康县| 石林| 鹰潭市| 土默特右旗| 禄劝| 确山县| 五寨县| 五莲县| 上高县| 监利县| 灵宝市| 闻喜县| 和静县| 九江县| 上虞市| 盐池县| 邳州市| 延庆县| 新蔡县| 团风县| 门源| 焦作市| 沂南县| 赤壁市| 石嘴山市| 阿克| 宿迁市| 嘉荫县| 资兴市| 新密市| 宝鸡市| 红河县| 绥棱县| 多伦县| 株洲市|