Node.js小白开路(一)-- fs篇
文件操作在我們的日常功能模塊之中是十分的常見的內容,nodeJS也不例外的為我們提供了之一操作內容,當時在我們了解文件操作的之前我們先來了解一下鏈接。
? 連接可以理解成為一個紙箱相關文件內容的地址,其主要分成兩種,如下:
1.符文連接內容:符文連接指向的文件其中的內容多半是指向另一個文件的鏈接,有點像是我們C語言中的指針的一個概念,指向的內容是指向另一處內容模塊的指向,不知道C的朋友也可以用window中的快捷方式來理解這樣只一個內容,桌面上面的快捷方式實際上其存儲的是實際開啟文件的位置。而我們打開相關的快捷方式的時候是需要獲取這一文件鏈接的的。
2.硬鏈接:硬鏈接和符文連接的本質不同就在于其指向的文件是有實際內容的,比如我當前的目錄下面有一個文件內容testing.txt,這指向這一文件的鏈接就是一個硬鏈接。當然沒一個文件期初是有一個硬鏈接。
接下來我們來具體的看一看文件操作模塊到底為我們帶來一些什么樣的便利操作:
一個文件有其自己的狀態,內容,權限等等,nodeJS之中為我們提供了很多針對文件這一系列數據的操作方法,讓我們更好的把控和操作文件內容。
#首先我們來說一說文件的狀態內容。
nodejs之中有專門的一個類內容用來描述我們的文件的具體的狀態內容,那就是fs.Stats類,這一個類對象及時一個文件狀態屬性對象。其中具體的相關信息如下:
Stats {dev: 2114, //硬件設備文件idino: 48064969, //節點編號mode: 33188, //操作權限nlink: 1, //硬鏈接數uid: 85, //文件擁有者的idgid: 100, //用戶組idrdev: 0, //設備IDsize: 527, //文件字節量大小blksize: 4096, //文件磁盤區塊大小blocks: 8, //分配的512B大小區塊數量atimeMs: 1318289051000.1,mtimeMs: 1318289051000.1,ctimeMs: 1318289051000.1,birthtimeMs: 1318289051000.1,atime: Mon, 10 Oct 2011 23:24:11 GMT, //上次訪問時間mtime: Mon, 10 Oct 2011 23:24:11 GMT, //文件修改事件ctime: Mon, 10 Oct 2011 23:24:11 GMT, //文件狀態變化時間birthtime: Mon, 10 Oct 2011 23:24:11 GMT } //文件創建時間上面可見我們可以從這一對象中獲取的內容,nodeJS中如何來獲取這一對象內容呢:我們可以通過fs.stat,fs.fstat等方法。
我們下面來具體的說明一下這兩個方法吧。
-- fs.stat(path, callback):函數獲取當前文件的狀態并檢測文件是否可以正確打開。兩個參數path表示文件路徑內容,callback為回調函數內容,我們在編寫回調函數的時候要為其提供一個參數內容err,系統自動傳遞參數,當發生錯誤的情況下則有error對象內容傳遞,如果正常則直接傳遞空對象或是null/undefined,下面看一段代碼:
fs.stat('../testing/test.txt', (err,stats) => {if(err){console.log(err.message); }else {console.dir(stats);} });
上面是對應的結果。
-- fs.fstat(fd, callback):這一個函數的功能和上一個函數相同,只是這一函數內容的第一個參數內容不再是路徑而是文件描述符,什么是描述符,我們通過nodeJS來打開文件內容的時候會返回一個特別的文件描述符內容,實際上它打印出來就是一個數字內容而已。下面來看一段代碼內容。
fs.open('../testing/test.txt', 'r' ,(err, fd) => { //打開相關文件內容獲取描述符fs.fstat(fd, (err, stats) => {if(err){console.log(err.message);}else {console.dir(stats);}}); });獲取結果與上一段代碼獲取的結果相同。
-- fs.lstat(path, callback):這一函數也是相關文件信息獲取函數,其傳遞的參數與stat函數的內容是相同的,但是兩個函數的功能差別就在于這一個函數在獲取的path是指向符號鏈接文件的時候,會獲取當前符號文件內容的stats信息,而stat方法會自動的去獲取當前的符號文件指向的文件內容。
?
下面我們來看看fs之中文件內容的操作有哪些我們是可以使用的。
首先我們可能會想到的是鏈接一下我們的文件試試看。
-- fs.access(path [, mode], callback):測試文件的權限內容。
#path:文件的路徑內容。
#mode:文件權限模式,默認是fs.constants.F_OK
#callback:文件的回調函數內容。
當我們檢測的可訪問性失敗了,則會報錯。否則正常。這屬于一個檢測性質的文件內容。但是nodeJS內容并不推薦這樣做,我們在異步的檢測文件內容之后,由于有一段時間的數據返回的空擋,我們的文件權限類型有可能發生變化,和我們所檢測到的相關內容不相同,所以在做文件的其他的操作之前進行檢測是不推薦的。我們可以直接使用open函數來進行文件的打開,它同時也是會進行相關的檢測的。
?
當我們需要打開以個文件的時候,我們可以通過nodeJS之中的open方法來實現我們的操作。(當沒有這一文件的時候,open會依據傳遞內容創建一個相應的文件內容。)
-- fs.open(path, flags [, mode], callback):這里重點說明一下flags參數內容,表示的是打開文件的模式,其中涵蓋了用戶對當前的額文榮的操作權限其具體的內容如下列表
'r' - 以讀取模式打開文件。如果文件不存在則發生異常。'r+' - 以讀寫模式打開文件。如果文件不存在則發生異常。'rs+' - 以同步讀寫模式打開文件。命令操作系統繞過本地文件系統緩存。這對 NFS 掛載模式下打開文件很有用,因為它可以讓你跳過潛在的舊本地緩存。 它對 I/O 的性能有明顯的影響,所以除非需要,否則不要使用此標志。 注意,這不會使 fs.open() 進入同步阻塞調用。 如果那是你想要的,則應該使用 fs.openSync()。'w' - 以寫入模式打開文件。文件會被創建(如果文件不存在)或截斷(如果文件存在)。'wx' - 類似 'w',但如果 path 存在,則失敗。'w+' - 以讀寫模式打開文件。文件會被創建(如果文件不存在)或截斷(如果文件存在)。'wx+' - 類似 'w+',但如果 path 存在,則失敗。'a' - 以追加模式打開文件。如果文件不存在,則會被創建。'ax' - 類似于 'a',但如果 path 存在,則失敗。'a+' - 以讀取和追加模式打開文件。如果文件不存在,則會被創建。'ax+' - 類似于 'a+',但如果 path 存在,則失敗。上面所說的是flags之中傳遞的參數內容,下面我們在來說明一下mode內容的,mode表示的是文件權限和文件類型信息。這么一說有沒有感覺flags和mode有些相像,其實可以這么理解,flags實際上使用戶的操作模式,其給定的一種操作模式,比如讀取模式,而當此次操作形式超出了讀取模式的權限的時候將不會成功,而當我們設置mode內容的時候,實際上是直接設置了文件本身的相關信息。所以兩者之間并不沖突。那么mode參數可以傳遞哪些值呢:
文件類型標志包括:S_IFBLK:文件是一個特殊的塊設備S_IFDIR:文件是一個目錄S_IFCHR:文件是一個特殊的字符設備S_IFIFO:文件是一個FIFO設備S_IFREG:文件是一個普通文件(REG即使regular啦)S_IFLNK:文件是一個符號鏈接其他模式標志包括:S_ISUID:文件設置了SUID位S_ISGID:文件設置了SGID位S_ISVTX:文件設置了sticky位用于解釋st_mode標志的掩碼包括:S_IFMT:文件類型S_IRWXU:屬主的讀/寫/執行權限,可以分成S_IXUSR, S_IRUSR, S_IWUSRS_IRWXG:屬組的讀/寫/執行權限,可以分成S_IXGRP, S_IRGRP, S_IWGRPS_IRWXO:其他用戶的讀/寫/執行權限,可以分為S_IXOTH, S_IROTH, S_IWOTH還有一些用于幫助確定文件類型的宏定義,這些和上面的宏不一樣,這些是帶有參數的宏,類似與函數的使用方法:S_ISBLK:測試是否是特殊的塊設備文件S_ISCHR:測試是否是特殊的字符設備文件S_ISDIR:測試是否是目錄(我估計find . -type d的源代碼實現中就用到了這個宏)S_ISFIFO:測試是否是FIFO設備S_ISREG:測試是否是普通文件S_ISLNK:測試是否是符號鏈接S_ISSOCK:測試是否是socket上面的一系列值我們稱之為宏定義,當我們需要傳值的情況下,我們需要傳遞的是多個宏定義的組合值,通俗的來說其實每一個宏定義是一個特殊的二進制內容變量。我們使用這些值與按位與(&)的形式來組合不同的內容。
之后我們來看一段代碼:
fs.open('../testing/test.txt', 'r' ,(err, fd) => {if(err){console.log(err.message);}else {console.dir(fd);} });//結果為3
當我們打開文件內容之后要對頁面內容進行操作。
文件讀取內容內容。在文編唄打開之后我們獲取了相關的文件描述符內容,之后我們就可以進行對這一針對性文件的操作內容。讀取文件內容I/O操作從磁盤之中將我們需要的內容存放到緩存之中。下面我們來了解一下讀取函數內容。
-- fs.read(fd, buffer, offset, length, position, callback):讀取文件中制定位置的內容到緩存對象之中。
#fd:表示的是相關的文件的描述符內容。
#buffer:是存放讀取到的數據的Buffer對象。
#offset:是Buffer之中開始寫入的偏移量。
#length:指定要讀取的字節數。
#position:指定從文件中開始讀取的位置。
#callback:回調函數內容其中有三個參數內容(err, bytesRead, buffer)
err表示是否有錯誤,如果有的這傳遞相關的錯誤信息。
bytesRead:讀取的文件內容的長度。
buffer:為最終獲取的字符串內容。
讓我們來看一段示例代碼內容吧:
var buf = Buffer.alloc(10); fs.open('../testing/test.txt', 'r', (err, fd) => {if(err){console.log(err.message); }else {fs.read(fd, buf, 1, 9, 0, (err, bytesRead, buffer) => {if(err){console.log(err.message); }else{console.dir(bytesRead);console.dir(buffer);}console.log(buf);}); } });我們可以從圖中看到的,Buffer的內容是不相同的,但是如果我們調用toString()方法的話,我們可以看到,實際上兩者展示出來的內容是相同的。這是應為返回來的內容第二個內容數據為10進制的,而之后展示出來的Buffer內容則為16進制的。
?
當然讀取方法不單單只有一個。
-- fs.readFile(path [,option], callback):這一函數用于讀取文件的全部內容,傳遞的參數內容內容如下:
#path:文件路徑或是文件描述符。
#option:傳遞的選填參數內容,可以傳遞string也可以是對象內容。
- encoding:編碼格式內容。
- flags:文件操作權限,默認為‘r’。
#callback:回調函數內容其中有兩個參數需要傳遞。
- err:錯誤信息。
- data:數據內容。
我們來看一段代碼。
fs.readFile('../testing/test.txt', (err, data) => {if(err){console.log(err.message);} else {console.dir(data); console.log(data.toString());} });其結果就是
當文件被打開之后我們可能不僅僅需要讀取,可能還需要對文件內容進行修改或者是寫入操作等,這樣我們要通過怎么樣的方式來進行操作呢。
-- write(fd, buffer [, position [, encoding]], callback):寫入Buffer文件內容到fd標識符之中。
#fd:表示的將要寫入的文件描述符內容。
#buffer:寫入文件之中的相關的緩存內容。
#position:文件錄入內容起始位置Bufffer的起始位置。
#encoding:文件編碼格式。
#callback:回掉函數內容
- err:錯誤相關信息。
- written:傳遞進入的參數內容長度(多少字節)。
- string:寫入的內容是什么。
下面看到一段代碼:
fs.open('../testing/test.txt', 'r+', (err, fd) => {fs.write(fd, Buffer.from(' something'), (err, written, buffer) => {console.log(written);console.dir(buffer);}); });?通過上面這一段代碼內容我們可以為test.txt文件添加內容‘ semothing’并且內容是將原本內容進行個替換,而不是進行插入添加。但是替換的內容只是在與其輸入的字符串長度等長度的部分內容。但是,當我們修改了open傳遞的flag信息的時候,當flags內容傳遞成為W或者是W+的情況之下我們在使用write函數的時候將會將整個文件內容替換掉。還有就是當我們在flags傳遞的內容是r的時候我們是不能進行寫操作的。
?
-- fs.writeFile(file, data [,options], callback):異步地寫入數據到文件,如果文件已經存在,則替代文件。
#file:可以是文件路徑或者是文件描述符。
#data:傳遞將要寫入的文件內容。
#options:可以傳遞一個字符串或者是一個對象內容。
-encoding:文件編碼格式。
-mode:文件權限模式設置。
-flag:文件操作權限。
#callback:回掉函數內容傳遞嘗試內容(err)。
我們來看一段代碼
fs.writeFile('../testing/test.txt', 'there is a something', (err) => {}); //結果就是文件內容被替換成為傳遞的內容。?
當然我們也可以使用流來進行文件的操作。 創建可讀流內容
-fs. createReadStream(path [,option]):?
#path:文件內容路徑。
#option:非必填,可以是string或是對象。
-flags:文件操作權限
-encoding:path的編碼格式
-fd:文件描述符文件,如果傳遞了fd則默認不適用path,
-mode:文件的操作模式
-autoClose:當有錯誤或是結束了當前流的時候會依據此參數來確定當前的fd是否會自動的關閉。如果不關閉的話代碼之中要注意自助關閉,否則可能會泄露
-start:文件開始讀取的偏移量。
-end:文件結束的偏移量。
我們來具體的看一段代碼吧。
?
var readS = fs.createReadStream('../testing/test.txt', {flags:'r+'}); console.dir(readS);.//獲取的相關結果是,一個閱讀流。??具體的流內容的操作我們可以在流篇章看見。
當然我們實際上也是可以創建一個可寫流的。
-- fs.createWriteStream(path [,option]):創建可寫流內容其中的傳遞的內容實際和創建可讀流的時候是相同的情況,所以當我們使用的也是需要注意的。
?
我們同時也可以追加相關的文件內容
-- fs.appendFile(file,data [,options], callback):一步的最佳數據到相關的文件內容,當我們的文件不存在的時候,則函數會自動的創建這一文件內容。
#path:文件路徑內容。
#data:想要追加的數據內容,String, Buffer
#options:可以是一個string或者是一個對象內容。
-encoding:編碼格式內容。
-mode:文件的權限格式類型。
-flag:用戶對文件的操作權限。
#callback:文件的回調函數內容。
上代碼。
fs.appendFile('../testing/test.txt', ', check appendFile', (err) => {});結果是,在文件的末尾添加了當前傳遞的data參數內容。
?
我們有的時候需要對文件內容進行拷貝操作這個時候我們就可以通過copyFile,
-- fs.copyFile(src, dest [,flags], callback):復制文件內容,到指定的路徑文件下。
#src:需要復制的文件路徑內容。
#dest:指定的文件路徑內容。
#flags:拷貝操作修飾符。
#callback:回調函數。
我們來看一段代碼。
fs.copyFile('../testing/test.txt', './test.txt', (err) => {});?
最后當我們操作完成之后我們需要關閉文件內容,這樣一面我們緩存之中的內容被泄露。
-- fs.close(fd, callback):文件關閉
#fd:文件描述符。
#callback:文件回調函數。
?
當然我們有時需要對于文件夾進行操作。
-- fs.mkdir(path [,mode], callback):創建一個文件路徑。
#path:創建文件夾的路徑
#mode:文件夾權限模式。
#callback:回調函數內容
-- fs.mkdtemp(prefix [,options], callback):創建一個唯一的臨時目錄
?#prefix:參數為創建臨時文件的路徑。創建臨時時會自動生成一個唯一序列?
#mode:文件夾的權限模式
#callback:回調函數內容。
?
當然我們也可以對于讀取文件夾之中的內容。
-- fs.readdir(path [,options] , callback): 讀取文件夾內容。
#path:為需要查詢的文件夾內容。
#callback:回調函數。其中有兩個參數內容,err為錯誤信息,第二個參數為file為當前文件夾之名稱不存在‘.’ '..'的文件名稱所組成的數組。
代碼示例
fs.readdir('../testing', (err,stats) => {console.dir(stats)});結果類似如下
文件內容操作之外,我們還可以針對文件權限或是狀態內容進行相關的修改或是操作。
-- fs.chomd(path, mode, callback):賦予當前path文件以mode之中的文件模式。
#path:文件路徑。
#mode:文件權限。
#callback:回調函數內容。
文件權限內容可以看上文之中的mode介紹內容。
-- fs.chown(path, uid, gid, callback):改變文件的所有組。
#path:文件路徑內容。
#uid:用戶ID。
#gid:組別ID。
#callback:回調函數。
-- fs.fsync(fd,callback):同步當前的內容到文件
#fd:文件描述符。
#callback:文件內容
-- fs.ftruncate(fd [,len], callback):文件截斷到指定的長度。
#fd:文件描述符。
#len:文件長度。
#callback:回調函數。
-- fs.futimes(fd, atime, mtime, callback):改變文件的系統時間戳。
#fd:文件描述符。
#atime:文件鏈接時間。
#mtime:文件修改時間。
#callback:回調函數。
當然FS模塊為我們提供的將不僅僅是上面這一些內容,當前只是比較基礎的內容的學習。參照的文本包括官方文檔和node權威指南內容。
?
?
轉載于:https://www.cnblogs.com/pingchuanxin/p/8092931.html
總結
以上是生活随笔為你收集整理的Node.js小白开路(一)-- fs篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ulua/tolua中timer.lua
- 下一篇: 03013_JDBC工具类