node(2)

node.js中fs模塊系統的使用:

Node.js 文件系統(fs 模塊)模塊中的方法均有異步和同步版本,例如讀取文件內容的函數有異步的 fs.readFile() 和同步的 fs.readFileSync()。
異步的方法函數最後一個參數爲回調函數,回調函數的第一個參數包含了錯誤信息(error)。
建議大家使用異步方法,比起同步,異步方法性能更高,速度更快,而且沒有阻塞

1.讀取文件:

讀取文件:readFile(filename,[options],callback);
filename, 必選參數,文件名
[options],可選參數,可指定flag 默認爲‘r’,encoding 默認爲null,在讀取的時候,需要手動指定
callback 讀取文件後的回調函數,參數默認第一個err,第二個data 數據

//文件流模塊 fs
//fs node 的內置模塊 文件模塊 文件讀取寫入之類的事情
//1.引入文件模塊
const fs=require("fs");
module.exports=()=>{
	//readFile 異步讀取
    fs.readFile("public/mongodb.txt",(err,data) => {
        if(err){
            throw err;
        }
        let buf=new Buffer(data);
       console.log(data.toString("utf-8"));
    });
    //同步讀取方法 readFileSync
    let a=fs.readFileSync("public/mongodb.txt","utf-8");
    console.log(a);
 }

2.打開文件

打開文件:fs.open(filename, flags, [mode], callback);
filename, 必選參數,文件名
flags, 操作標識,如"r",讀方式打開,r+可讀可寫
[mode],設置文件模式(權限),文件創建默認權限爲 0666(可讀,可寫)。
callback 打開文件後回調函數,參數默認第一個err,第二個fd爲一個整數,表示打開文件返回的文件描述符,window中又稱文件句柄

//異步打開文件夾
	fs.open("public","r+",(err,id)=>{
   	     if(err){
    	         console.log("打開文件失敗")
    	         throw err;
    	     }
         console.log("當前文件已經打開");
     });
     //同步打開文件
    let b=fs.openSync("public","r+")
    console.log(b);

3.獲取文件信息

.獲取文件信息:fs.stat(path, callback)
path - 文件路徑。
callback - 回調函數,帶有兩個參數如:(err, stats), stats 是 fs.Stats 對象

fs.stat("public",(err,stat)=>{
        if(err){
            throw err;
        }
        //console.log(stat)//輸出文件的相關信息
        //stat返回值裏面的方法
        //isFile 檢測當前文件是文件還是文件夾  true
        //isDirectory 檢測當前文件是文件還是文件夾 true
        console.log(stat.isFile());
        console.log(stat.isDirectory());
    });

4.寫入文件

創建並寫入文件:fs.writeFile(filename,data,[options],callback);
filename, 必選參數,文件名
data, 寫入的數據,可以字符或一個Buffer對象
[options],flag 默認‘2’,mode(權限) 默認‘0o666’,encoding 默認‘utf8’
callback 回調函數,回調函數只包含錯誤信息參數(err),在寫入失敗時返回。

 fs.writeFile("public/mode.txt","我想學習","utf-8"(err)=>{
        if(err){
            throw err;
        }
    });
    //同步寫入
    fs.writeFileSync("public/mode.txt","我在學習中","utf-8"");
    //異步方法 appendFile 追加寫入
    fs.appendFile("public/mode.txt","我想學習a","utf-8",(err)=>{
        if(err){
            throw err;
        }
    })
    //同步追加appendFileSync

5.文件讀取

fs.read(fd, buffer, offset, length, position, callback); 讀取文件 ,讀取打開的文件內容到緩衝區中
fd, 使用fs.open打開成功後返回的文件描述符
buffer, 一個Buffer對象,v8引擎分配的一段內存
offset, 整數,向緩存區中寫入時的初始位置,以字節爲單位
length, 整數,讀取文件的長度
position, 整數,讀取文件初始位置;文件大小以字節爲單位
callback(err, bytesRead, buffer), 讀取執行完成後回調函數,bytesRead實際讀取字節數,被讀取的緩存區對象

let buffer=new Buffer(1024);
    fs.open("public/mongodb.txt","r+",(err,fd)=>{
        if(err){
            throw err;
        }
        fs.read(fd,buffer,0,buffer.length,buffer.length,(err,res)=>{
            if(err){
                throw err;
            }
            fs.appendFile("public/mode.txt",buffer.toString("utf-8"),(err)=>{
                if(err){
                    throw err;
                    console.log("寫入失敗");
                }
                console.log("寫入成功")
            })
            console.log(buffer.toString("utf-8"));
        });
    });

6.關閉文件

fs.open("public/mongodb.txt","r+",(err,fd)=>{
        if(err){
            throw err;
        }
        console.log("文件已經打開");
        //文件關閉代碼
        fs.close(fd,(error)=>{
            if(error){
                throw error;
            }
            console.log("文件關閉成功")
        });
    });

7.文件的截取

fs.ftruncate(fd, len, callback) 截取文件
fd - 通過 fs.open() 方法返回的文件描述符。
len - 文件內容截取的長度。
callback - 回調函數,沒有參數。

let databuff=new Buffer(1024);
    fs.open("public/mongodb.txt","r+",(err,fd)=>{
        if(err){
            throw err;
        }
        //ftruncate 截取文件
        fs.ftruncate(fd,1024,(error)=>{
            if(error){
                throw error;
            }
            console.log("文件截取成功");
            fs.read(fd,databuff,0,databuff.length/2,0,(error,byte)=>{
                if(error){
                    throw error;
                }
                console.log(databuff.toString("utf-8"));
                //文件關閉
                fs.close(fd,(er)=>{
                    if(er){
                        throw er;
                    }
                })
            });
        });
    });
    //fs.ftruncateSync同步截取 

8.刪除文件

fs.exists(path, callback); 判斷文件或目錄是否存在
path, 要查看目錄/文件的完整路徑及名;
[callback(exists)], 操作完成回調函數;exists true存在,false表示不存在

fs.unlink("public/stu.txt",(err)=>{
        if(err){
            throw err;
        }
        console.log("文件刪除成功")
    })

9.創建目錄+刪除目錄

fs.mkdir(path, [mode], callback)創建目錄
path是需要創建的目錄
[mode]是目錄的權限(默認值是0777)
callback 是回調函數。

 let nickname="王五";
    fs.exists(`public/${nickname}`,(exis)=>{
        console.log(exis);
        if(!exis){
            fs.mkdir(`public/${nickname}`,{
                mode:0777
            },(err)=>{
                if(err){
                    throw err;
                }
                console.log("文件創建成功");
                //rmdir 刪除目錄
                fs.rmdir(`public/${nickname}`,(error)=>{
                     if(error){
                         throw error;
                     }
                     console.log("刪除成功");
                 });
            });
        }
        else{
            console.log("該文件存在");
        }
        fs.appendFile(`public/${nickname}`+`/host.txt`,"我在嘗試study",(err)=>{
            if(err){
                throw err;
            }
            console.log("寫入成功");
        })
    }) 

10.讀取目錄(fs.readdir(path, callback))

//遞歸遍歷目錄裏面的每一層
 let pathinfo="public";
    let method=(path)=>{
    fs.readdir(path,(err,files)=>{
        if(err){
            throw err;
        }
        //[ 'data.txt', 'maodou', 'mark', 'mode.txt', 'mongodb.txt', '王五' ]
        //console.log(files);
        files.map((value,index)=>{
            //console.log(value);
            fs.stat(path+`/${value}`,(error,stats)=>{
                if(error){
                    throw error;
                }
                //開始判斷是否是目錄還是文件夾
                if(stats.isFile()){
                    console.log(value+"是文件");
                }
                else if(stats.isDirectory()){
                    console.log(value+"是目錄");
                    method(path+`/${value}`);
                }
            });
        });
    });
    }
    method(pathinfo);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章