1. 程式人生 > >node.js-fs

node.js-fs

簡介

fs 模組是node.js中的檔案操作模組。

  • 匯入
const fs = require('fs');
  • 非同步
fs.readFile('file.txt', function(err, data){
    if(err){
        console.log('something was wrong : ', err.toString());
        return;
    }
    console.log('async read : ', data.toString());
})

readFile

:預設非同步方式處理,自定義回撥函式

callback:雙入參,第一個err錯誤資訊,後面的data是讀取的資料。

  • 同步
var content = fs.readFileSync('file.txt');
console.log('sync read : ', content);

readFileSync:常用方式,無非同步

開篇簡介到此為止,接下來深入詳解。

狀態

const fs = require('fs');
fs.stat('file.txt', function(err, status){
    if(err){
console.log('something was wrong : ', err.toString()); return; } console.log(status); })

執行一下就知道是啥東西了,還有相關的狀態判斷;

方法 描述
isFile 是檔案否
isDirectoty 是目錄否
isBlockDevice 塊裝置否
isCharacterDevice
字元裝置否
isSymbolicLink 軟連結否
isFIFO FIFO
isSocket SOCKET
const fs = require('fs');
fs.stat('file.txt', function(err, status){
    if(err){
        console.log('something was wrong : ', err.toString());
    }
    if(status.isFile()){
        console.log('this file is a file, not directory');
    }else if(status.isDirectory()){
        console.log('this file is a directory');
    }else{
        console.log('unknow file type');
    }
})

寫入

const fs = require('fs');
fs.writeFile('file.txt', 'new content', function(err){
    console.log('this is callback');
    if(err){
        console.log(err.toString());
        return;
    }
    console.log('write successful');
    
})

簡介的例子相對應,這個更容易理解。

不過其中的file.txt的位置,也可以是檔案描述符,後面會使用。

執行能夠發現,檔案內容每次都在覆蓋,這因為差了一些可選引數,{encoding, mode, flag}

encoding:指定編碼,預設utf-8

mode:指定模式,預設0666

flag:指定檔案模式,預設w

const fs = require('fs');
fs.writeFile('file.txt', 'append Conent', {'flag':'a'}, function(err){
    if(err){
        console.log(err);
        return;
    }
    console.log('write success');
});

可選引數可有可無,即使json指定了,也不用全部設定。

這下去看,應該是append的了。

開啟

前面都是文字檔案,接下來說一下檔案描述符。

const fs = require('fs');
fs.open('file.txt', 'r+', function(err, fd){
    if(err){
        console.log(err);
        return;
    }
    console.log('open success');
})

再詳細複述一下檔案的模式

模式 描述
r 只讀模式,無則報錯
r+ 讀寫模式,無則報錯
rs 只讀模式,同步讀取
rs+ 讀寫模式,同步操作
w 只寫模式,無則建立
wx 只寫模式,存在失敗
w+ 讀寫模式,無則建立
wx+ 讀寫模式,存在失敗
a 追加模式,無則建立
ax 追加模式,存在失敗
a+ 讀寫追加,無則建立
ax+ 讀寫追加,存在失敗
fs.open(path, flags[, mode], callback)

整體呼叫引數中,mode是可選引數,同linux

function callback(err, fd){
    ...
}

回撥函式兩個入參

err:老相識

fd:檔案描述符,後續加深

再讀

const fs = require('fs');
fs.open('file.txt', 'r', function(err, fd){
    if(err){
        console.log('something was wrong : ', err);
        return;
    }
    fs.readFile(fd, function(err, data){
        if(err){
            console.log('fd error : ', err);
            return;
        }
        console.log('content : ', data.toString());
    })
})

隨便可以試,filename的地方都可以更換為fd

但是,再操作的時候,讀寫屬性關鍵看fd的。

const fs = require('fs');
fs.open('file.txt', 'w', function(err, fd){
    if(err){
        console.log('something was wrong : ', err);
        return;
    }
    fs.readFile(fd, function(err, data){
        if(err){
            console.log('fd error : ', err);
            return;
        }
        console.log('content : ', data.toString());
    })
})

如果模式不對,就會報錯,這個時候就多關注一下fd的模式。

再寫

其實沒啥變化,就是filename替換為了fd,不必再說。

非同步

  • 讀取
const fs = require('fs');
var buffer = Buffer.alloc(1024);
fs.open('file.txt', 'r', function(err, fd){
    if(err){
        return;
    }
    fs.read(fd, buffer, 0, buffer.length, 0, function(err, readLength){
        if(err){
            return;
        }
        console.log('read bytes length : ', readLength);
        console.log('read file content : ', buffer.slice(0, readLength).toString());
    })
});

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

offsetbuffer的寫起始位置

length:想要讀取的長度

position:檔案開始讀取位置

callback:回撥函式

callback(err, length, buffer)

err:老東西

length:已經讀取的長度

buffer:讀取的buffer

  • 擷取
const fs = require('fs');
var buffer = Buffer.alloc(1024);
fs.open('file.txt', 'r+', function(err, fd){
    if(err){
        return;
    };
    fs.ftruncate(fd, 5, function(err)){
    	if(err){
        	return;
    	};
    	fs.read(fd, buffer, 0, buffer.length, 0, function(err, length, buf){
            if(err){
                return;
            }
            console.log('read content : ', buffer.slice(0, length).toString());
    	});
    }
})

擷取是真實的檔案修改,不是部分讀取,檔案內容會被截斷。

  • 關閉
fs.close(fd, function(err){
    if(err){
        console.log('something was wrong : ', err);
        return;
    }
    console.log('file was closed !');
})

刪除

const fs = require('fs');
fs.unlink('file.txt', function(err){
    if(err){
        console.log('something was wrong : ', err);
        return;
    }
    console.log('file was deleted !');
})

目錄

  • 建立
const fs = require('fs');
fs.mkdir('./newDir', function(err){
    if(err){
        return;
    }
    console.log('mkdir over');
})
  • 讀取
const fs = require('fs');
fs.readdir('.', function(err, files){
    files.forEach(function(file){
        console.log(file);
    });
});
  • 刪除
const fs = require('fs');
fs.rmdir('./dir', function(){
    console.log('remove over');
});

更多

更多更全請參看官方文件