Node.Js之FS檔案操作篇

edithfang發表於2014-10-30
寫檔案

googog寫檔案的意思感覺是寫一個檔案,準確來說,這裡的寫檔案是把資料寫入到一個檔案中,當檔案不存在時會建立一個檔案。那麼細化來看,過程應該是先開啟一個檔案,如果檔案不存在就建立一個新的檔案,然後把資料寫入這個檔案。look

this開啟檔案使用fs.open方法,寫入資料使用fs.write方法,先做個例子。fuck
var fs = require("fs");
fs.open("new.txt","w",function(err,fd){
    var buf = new Buffer("你好啊");
    fs.write(fd,buf,0,buf.length,0,function(err,written,buffer){});
})
look首先開啟檔案new.txt,然後寫入“你好啊”資料。說起來容易,同時發現這裡有很多引數。下面將詳細介紹open和write方法。yellow

fs.open(path, flags, callback)

lookfs.openSync(path,flags) 是同步方法,return fd,如果有錯誤直接throw丟擲錯誤。googog

fuckpath 引數,表示要開啟檔案的路徑,flags標誌引數,它限制開啟的檔案是可讀、可寫或可讀寫等方式,callback(err,fd)回撥方法中fd表示開啟檔案的檔案描述符。這裡不好理解的是flags標誌引數。sex

bookflags 引數可使用標誌:god

book"r" 表示,開啟檔案進行讀取。如果該檔案不存在,將發生異常。sex

god"r+" 表示,開啟檔案進行讀取和寫入。如果該檔案不存在,將發生異常。book

god"rs" 與 "r" 一樣,但採用同步方式,這個方式很消耗效能,一般情況下不會用到。fuck

god"rs+" 與 "r+" 一樣,但採用同步方式,這個方式很消耗效能,一般情況下不會用到。fuck

yellow"w" 表示,開啟檔案進行寫入。如果檔案不存在會建立一個檔案,這種寫入方式會全部刪除舊有的資料,然後再寫入資料。sex

god"w+" 表示,開啟檔案進行讀取和寫入。如果檔案不存在會建立一個檔案,這種寫入方式會全部刪除舊有的資料,然後再寫入資料。fuck

look"wx" 和 "w" 相同,不同的是它是獨佔模式。yellow

fuck"wx+" 和 "w+" 相同,不同的是它是獨佔模式。book

googog"a" 表示,開啟檔案進行追加,如果檔案不存在會建立一個檔案,這個模式不同於"w",它不會刪除舊有的資料,而是會在後面追加資料。this

look"a+" 表示,開啟檔案進行追加和讀取,如果檔案不存在會建立一個檔案,這個模式不同於"w",它不會刪除舊有的資料,而是會在後面追加資料。googog

googog"ax" 和 "a" 相同,不同的是它是獨佔模式。book

god"ax+" 和 "ax" 相同,不同的是它是獨佔模式。googog

godOK!看起來好多,還是做一些例子吧。god
var fs = require("fs");
fs.open("new.txt","r",function(err,fd){
    var buf = new Buffer("你好啊");
    var c = fs.writeSync(fd,buf,0,buf.length,0);
    console.log(c)
})
look上面的例子,只是把"w"改成"r",前提是new.txt檔案存在,執行後,會出現錯誤提示,大概意思是無權寫入。yellow
Error: EPERM, operation not permitted
this原因不言而喻,"r"表示只能被讀,而不能寫入。god

god下面這個例子用於說明"a"追加 和 "w"寫入模式的差異,這個例子前提是,有一個已存在的new.txt檔案,檔案內有“你好啊”資料。googog

sex"w"模式god
var fs = require("fs");
fs.open("new.txt","w",function(err,fd){
    var buf = new Buffer("1234");
    fs.writeSync(fd,buf,0,buf.length,0);
})
good執行後,開啟new.txt內容是“1234”而舊有的資料消失了。yellow

good我們在把new.txt檔案內容改成“你好啊”,然後把"w"改成"a",執行!this
var fs = require("fs");
fs.open("new.txt","a",function(err,fd){
    var buf = new Buffer("1234");
    fs.writeSync(fd,buf,0,buf.length,0);
})
god執行後,開啟檔案new.txt檔案,內容是“你好啊1234”。look

fs.write(fd, buffer, offset, length, position, callback)

godfs.writeSync(fd, buffer, offset, length, position) 方法是同步寫入,它返回寫入多少bytes數量。good

thisfd引數,檔案描述符,通過fs.open得到。googog

godbuffer引數,是要寫入的資料,Buffer物件,buffer尺寸的大小設定最好是8的倍數,效率較高。sex

googogoffset引數,要寫入buffer的起始位置。god

booklength引數,要寫入buffer的長度。通過offset和length規定buffer中那些資料應該被寫入到檔案。god

yellowposition引數,寫入到檔案的什麼位置。good

thiscallback((err, written, buffer)回撥方法,當出現異常會丟擲err,written是寫入了多少bytes,buffer寫入的資料。googog

sexfs.open 開啟了檔案,當然使用後應該關閉close檔案,通過fs.close(fd, callback)和fs.closeSync(fd)方法可以關閉開啟的檔案,這個方法比較簡單,不再多說。good

book上面寫入方法是通過open得到fd(檔案描述符)然後再寫入檔案的方式,其實還有其他方法。googog

fs.writeFile(filename, data, [options], callback)

fuckfs.writeFileSync(filename, data, [options]) 同步方式。look

goodfilename String型別, 檔名稱。sex

lookdata String | Buffer型別,要寫入的資料。googog

googogoptions[可選] Objectl 型別,預設值 {encoding:"utf8",flag:"w"}sex

goodcallback(err) 回撥函式god
var fs = require("fs");
fs.writeFile("myfile.txt","Javascript很贊",function(err){
    if(!err)
    console.log("寫入成功!")
})
fs.appendFile(filename, data, [options], callback)

bookfs.appendFileSync(filename, data, [options]) 同步方式。this

googog參看 fs.writeFile 方法,差別就是 [options]的flag預設值是"a",所以它以追加方式寫入資料。book

讀檔案

good有了前面的寫檔案,讀檔案就好辦多了,還是老規矩,先寫程式碼再做說明,但這次結合之前學到的,開發一個判斷檔案是否是png格式圖片檔案的程式。googog

sex假設當前目錄下有個1.png檔案,我們來判斷這個檔案是png圖片。god
var fs = require("fs");
fs.open("1.png","r",function(err,fd){
    // PNG頭部 8 bytes是固定的,來判斷檔案前8bytes。
    var header = new Buffer([137,80,78,71,13,10,26,10]);
    var buf = new Buffer(8);
    fs.read(fd,buf,0,buf.length,0,function(err,bytesRead,buffer){
        if(header.toString() === buffer.toString()){
            console.log("是PNG格式圖片檔案");
        }
    })        
})
good分析這個程式,先是用fs.open開啟1.png檔案,然後header資料是PNG圖片標識資料,位於PNG圖片前8個bytes,只要讀取1.png檔案前8bytes資料,然後對比一下資料是否一致就可以了。fuck

fs.read(fd, buffer, offset, length, position, callback)

googogfs.read(fd, buffer, offset, length, position) 方法是同步寫入,它返回讀取了多少bytes數量。yellow

godfd引數,檔案描述符,通過fs.open得到。sex

godbuffer引數,是把讀取的資料寫入這個物件,是個Buffer物件。this

thisoffset引數,寫入buffer的起始位置。god

booklength引數,寫入buffer的長度。good

godposition引數,檔案的什麼位置開始讀。fuck

sexcallback(err,bytesRead, buffer)回撥方法,當出現異常會丟擲err,bytesRead是讀取了多少bytes,buffer讀取到的資料。yellow

yellow和寫檔案同樣的,除了fs.read方式讀取檔案外,還有一個讀取檔案的方式。yellow

fs.readFile(filename, [options], callback)

goodfs.readFileSync(filename,[options]) 同步方式,retur讀取到的資料。fuck

godfilename String型別,表示要讀取的檔名this

yellowoptions[可選] Object型別,預設值是 {encoding:null,flag:"r"}god

lookcallback(err,data) 回撥函式,data表示讀取的資料。god

god例book
var fs = require("fs");
var data = fs.readFileSync("myfile.txt");
console.log(data.toString());
小結一下

this 讀取和寫入都有兩種不同方式,一個是先open,然後操作讀寫,但需要手工呼叫fs.close關閉檔案,這種方式適合於多次寫入或讀取。還有一次性服務的,writeFile/appendFile/readFile方法只是寫入或讀取一次,內部自動呼叫了fs.close方法。look

good上面兩個小節內容稍微多了一點,以下幾節內容相對輕鬆了,現在可以稍微休息一下。this

截斷檔案

googog截斷檔案,說白了就是把整個檔案內容刪除了,然後再加入new Buffer(len)的空資料,這個方法多數情況沒什麼用。以下是方法。god

godfs.ftruncate(fd, len, callback)fuck

godfs.ftruncateSync(fd, len)god

lookfs.truncate(path, len, callback)look

goodfs.truncateSync(path, len)god

this這些方法很簡單,做個例子說明一下。googog
var fs = require("fs");
fs.open("myfile.txt","w",function(err,fd){
    fs.ftruncate(fd,5,function(err){
        console.log(err)
    })
})
fs.truncateSync("myfile.txt",5);

檔案連結

god檔案連結在“檔案系統概述”中用官方口氣介紹了一次。但通俗點更好理解,說白了就是為一個檔案建立一個特殊的連結,這個連結看起來像是一個檔案,和快捷方式很像,這樣理解就可了,熟悉linux ln命令的對檔案連結會很熟悉這個概念。this

googog還是先做例項,再說明。sex
var fs = require("fs");
fs.linkSync("file.txt","filelink.txt");
var fs = require("fs");
fs.link("file.txt","filelink.txt",function(err){
    console.log(err);
});
god上面程式碼是為file.txt檔案建立個“連結檔案”filelink.txt,建立成功後,如果更改其中任何一個檔案,相應的那個檔案都會改變。googog

更改檔案的檢視和更新時間

god這個很好理解,檢視檔案屬性時,會看到檔案的建立事件、更改時間、檢視事件。看以下程式碼。look
var fs = require("fs");
fs.utimes(
    "file.txt",
    new Date("1982-2-2"),
    new Date("1988-5-5"),
    function(err){}
);
good上面程式碼的意思是,把file.txt檔案的檢視時間改成1982/2/2,最新更改時間改成1988/5/5。book

fs.utimes(path, atime, mtime, callback)

thisfs.utimesSync(path, atime, mtime) 同步方式yellow

godpath:String 更改的檔名字路徑。look

googogatime:Date 檢視時間。look

bookmtime:Date 更改時間。sex

lookcallback(err) 回撥函式。fuck

fs.futimes(fd, atime, mtime, callback)

thisfs.futimesSync(fd, atime, mtime)good

googog和utimes方法一樣,只不過第一個引數是 fd 檔案描述符。good

監聽檔案

fuck參看:“資料夾操作”一節。look

god在“資料夾操作”一節介紹了一種監聽方式,下面還有一種專門監聽檔案的方法。look

fs.watchFile(filename, [options], listener)

googog這個方法新增檔案更改監聽器。fuck

googogfilename:String 要監聽的檔名。look

godoptions[可選]:Object,預設值是{ persistent: true, interval: 5007 } , persistent表示是否持久運作,這個意思是,true的時候當前process程式不會退出,如果是false,就不會阻止當前程式退出,不過可以使用 setInterval 方法模擬 persistent:true 。 interval 表示監聽間隔,以毫秒為單位。sex

godlistener(currentStat,previousStat),監聽器,一旦檔案有變化就會觸發這個回撥函式,currentStat是更改後當前的檔案狀態,previousStat表示更改前的狀態,這兩個引數是fs.Stats型別。(參看“資料夾操作”一節)。look

fs.unwatchFile(filename, [listener])

this這個方法是停止監聽的意思。yellow

godfilename 要停止監聽的檔名。fuck

godlistener[可選],表示要停止監聽的監聽器。如果不指定,那麼將會停止全部監聽檔案的監聽器。googog

this例yellow
var fs = require("fs");
var handle1 = function(event,filename){
    console.log("1")
}
var handle2 = function(event,filename){
    console.log("2")
}
fs.watchFile("file.txt",handle1);
fs.watchFile("file.txt",handle2);

setTimeout(function(){
     fs.unwatchFile("file.txt",handle1);
},20000)
god這裡有兩個監聽器 handle1和handle2,當更改file.txt內容時,終端會列印出1 2,當20秒之後,再次更改file.txt檔案,會發現終端只列印出 2 ,因為handle1已經被撤銷了。god
相關閱讀
評論(1)

相關文章