node 操作文件流 fs 同步與異步 流式文件的寫入與讀取


fs

fs ( File System ) 文件系統

在node中通過fs模塊來和系統中的文件進行交互 通過fs模塊可以對磁盤中的文件做各種增刪改查的操作 寫入文件 1.同步寫入 2.異步寫入 3.簡單寫入 4.流式寫入 讀取文件 在fs模塊中所有的方法都有兩個版本 不帶sync的,異步方法 帶sync的,同步方法

1、同步寫入

**1.打開要寫入的文件**
    fs.openSync(path, flags[, mode])
    該方法用來打開一個文件
    參數:
    path:路徑,要打開文件的路徑
    flags:操作的類型,要對文件做什么操作
    需要字符串作為參數
    "w""r""a" 追加
    mode:可選參數,一般不傳,用來設置文件的權限

    返回值:
    fd 文件的描述符

2.寫入並保存
    fs.writeSync(fd, string[, position[, encoding]])
    該方法用於向文件中寫入內容
    參數:
    fd: 文件的描述符,需要指定要寫入文件的描述符
    string: 要寫入的內容
    position: 開始寫入的位置
    encoding: 寫入內容的字符編碼,默認utf-8


3.關閉文件
    fs.closeSync(fd):: 該方法用來關閉文件
    參數:
    fd 文件的描述符

實例
    //引入fs模塊
    var fs=require('fs');
    var fd=fs.openSync('gzl.txt','w');
    fs.writeSync(fd,'1111',10,'utf-8');
    fs.closeSync(fd);

2.簡單文件的寫入

簡單文件寫入
     fs.writeFile(file, data[, options], callback)
     fs.writeFileSync(file, data[, options])
 - 參數:
        file 要寫入的文件的路徑
        data 要寫入的內容
        options 配置對象(可選)
            encoding 編碼 默認 utf8
            flag  操作類型  默認 w
            mode  文件的權限 默認666,一般不需要傳
            callback 回調函數,寫入完成后會調用該函數

3.異步寫入

1.打開文件
    fs.open(path, flags[, mode], callback)
    參數:callback
    回調函數,會在文件打開以后執行
    回調函數中會有兩個參數:
    err: 錯誤信息,如果操作過程中出現了錯誤,則該對象存在,如果沒有出現錯誤,則該參數的值為null
    錯誤優先
    fd: 文件的描述符

2.寫入文件
    fs.write(fd, string[, position[, encoding]], callback)
    callback 回調函數會在寫入完畢以后執行
    參數:
    err 錯誤對象
    byte 寫入的字節數
    data 寫入的數據

3.關閉文件
    fs.close(fd, callback)


異步寫入的相關代碼:::
var fs=require('fs');
fs.open('gzl.txt','a',function (err,fd) {
    if (!err){
        fs.write(fd,'ffffff',10,function (err,bite,data) {
          if (!err){
              console.log('文件寫入成功');
          };
          fs.close(fd,function (err) {
            if (!err){
                console.log('文件已關閉');
            };
          });
        });
    };
});

4.流式文件的寫入與讀取

流式文件寫入
   其他的文件的寫入方式都是一次性將一個內容寫入到文件中的,
   如果文件太大了則會導致運行速度過慢,會嚴重影響程序的性能
   流式文件寫入適合較大的文件寫入,可以分多次將多個內容輸出到文件中
相關代碼:
//創建一個可寫流(WriteStream)
var ws = fs.createWriteStream("hello3.txt");

//為流綁定一個open和close事件,來監聽流是否打開和關閉
ws.once("open",function () {
    console.log("流打開了~~~");
});

ws.once("close",function () {
    console.log("流關閉了~~~");
});

//通過可寫流向文件中輸出內容
ws.write("O(∩_∩)O哈哈~");
ws.write("O(∩_∩)O~");

//關閉流
ws.end();

流式文件讀取 適合較大的文件讀取

相關代碼:
//創建一個可讀流
var rs = fs.createReadStream("C:\\Users\\lilichao\\Desktop\\筆記.mp3");
//創建一個可寫流
var ws = fs.createWriteStream("a.mp3");

//監聽流的狀態
rs.once("open",function () {
    console.log("可讀流已經打開");
});

rs.once("close",function () {
    console.log("可讀流已經關閉");
    //關閉可寫流
    ws.end();
});

ws.once("open",function () {
    console.log("~~~~可寫流已經打開");
});

ws.once("close",function () {
    console.log("~~~~可寫流已經關閉");
});

//要讀取一個可讀流中的數據,必須要給該流綁定一個data事件
//綁定data事件后,流會自動讀取數據,數據讀取完畢以后,流會自動關閉
//讀取到的數據會通過回調函數的參數的形式返回
rs.on("data",function (data) {
    //console.log(data.length);
    //將數據線寫入到可寫流中
    ws.write(data);

});


簡單方法::
//創建一個可讀流
var rs = fs.createReadStream("C:\\Users\\lilichao\\Desktop\\筆記.mp3");
//創建一個可寫流
var ws = fs.createWriteStream("b.mp3");
//將可讀流中的數據寫入到可寫流中
rs.pipe(ws);

5.其他讀取文件

相關代碼:
/*
 驗證路徑是否存在
     fs.existsSync(path)
 獲取文件信息
     fs.stat(path, callback)
     fs.statSync(path)
 刪除文件
     fs.unlink(path, callback)
     fs.unlinkSync(path)

 */

var result = fs.existsSync("ab.jpg");

//console.log(result);


fs.stat("a.jpg", function (err , stats) {
    if(!err){
        //stats 是一個對象,在該對象中保存了當前文件的狀態信息
        /*
            通過該對象可以獲取文件的狀態
                stats.size 獲取文件的大小
                stats.isFile() 是否是文件
                stats.isDirectory()是否是目錄
         */
        //console.log(stats.isDirectory());
    }
});

//刪除文件
//fs.unlinkSync("hello.txt");

/*
 列出文件
     fs.readdir(path[, options], callback)
     fs.readdirSync(path[, options])
 截斷文件
     fs.truncate(path, len, callback)
     fs.truncateSync(path, len)
 建立目錄
     fs.mkdir(path[, mode], callback)
     fs.mkdirSync(path[, mode])

 */

/*
fs.readdir(".",function (err , files) {
    if(!err){
        //files是一個保存了目錄下文件(夾)名字的string數組
        console.log(files[0]);
    }
});*/

//截斷文件 將文件截斷成指定的大小,會丟失數據
//fs.truncateSync("hello2.txt",10);

//創建目錄
//fs.mkdir("hello");

/*
刪除目錄
 fs.rmdir(path, callback)
 fs.rmdirSync(path)
重命名文件和目錄
 fs.rename(oldPath, newPath, callback)
 fs.renameSync(oldPath, newPath)
 - 通過該方法也可以實現剪切的功能

監視文件更改寫入
    fs.watchFile(filename[, options], listener)
        - 參數:
    filename 文件名
    options 配置對象
    listener 回調函數,當前文件發生變化時,該函數將會執行
        - curr 表示文件現在的狀態
        - prev 表示文件修改前的狀態
            - 這兩個對象都是stats對象

*/

//fs.rmdir("hello");

/*fs.rename("b.mp3","C:\\Users\\lilichao\\Desktop\\b.mp3",function (err) {
    if(!err){
        console.log("修改成功");
    }
});*/

fs.watchFile("hello2.txt",{interval:1000},function (curr,prev) {
    console.log("當前文件的大小為: "+curr.size);
    console.log("修改前文件的大小為: "+prev.size);
});

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM