NodeJs FS模塊(5)

目錄

/*
1. fs.stat 檢測是文件仍是目錄
2. fs.mkdir 建立目錄
3. fs.writeFile 建立寫入文件
4. fs.appendFile 追加文件
5.fs.readFile 讀取文件
6.fs.readdir讀取目錄
7.fs.rename 重命名
8. fs.rmdir 刪除目錄
9. fs.unlink刪除文件
*/

1. fs.stat 檢測是文件仍是目錄

fs.stat('css',function (err,stats) {
    if (err){
        console.log(err);
        return false
    }else{
        console.log('文件',stats.isFile());
        console.log('文件',stats.isDirectory());
    }
});

 

2. fs.mkdir 建立目錄

fs.mkdir('js',function (err) {
    if (err){
        console.log(err);
        return false
    }else{
        console.log('建立文件夾成功');
    }
});

 

3. fs.writeFile 建立寫入文件

fs.writeFile('t.txt','hello nodejs',function (err) {
    if (err){
        console.log(err);
        return false
    }else{
        console.log('寫入文件成功');
    }
});

 

4. fs.appendFile 追加文件

fs.appendFile('t.txt','hello nodejs\n',function (err) {
    if (err){
        console.log(err);
        return false
    }else{
        console.log('追加寫入文件成功');
    }
});

 

5.fs.readFile 讀取文件

fs.readFile('t.txt',function (err,data) {
    if (err){
        console.log(err);
        return false
    }else{
        console.log(data.toString());
    }
});

 

6.fs.readdir 讀取目錄

fs.readdir('./',function (err,data) {
    if (err){
        console.log(err);
        return false
    }else{
        console.log(data);
    }
});

 

7.fs.rename 重命名

fs.rename('1.txt','tt',function (err) {
    if (err){
        console.log(err)
        return false
    }else{
        console.log('成功修改文件');
    }
});

 

8. fs.rmdir 刪除目錄

fs.rmdir('tt',function (err) {
    if (err) {
        console.log(err);
        return false
    }else{
        console.log('刪除目錄成功');
    }
});

 

9. fs.unlink 刪除文件

fs.unlink('t.txt',function (err) {
    if(err) {
        console.log(err);
        return false
    }else{
        console.log('刪除文件成功');
    }
});

 

文件操做demo

1.判斷服務器上面有沒有upload目錄。沒有建立這個目錄。 (圖片上傳)

fs.stat('upload',function (err,stats) {
    if (err){ // 不存在目錄
        fs.mkdir('upload',function (err) {
            if (err){
                console.log(err);
                return false
            }
        });
        console.log('文件不存在')
    }else{
        console.log('文件已經存在');
        console.log(stats.isDirectory());
    }

});

 

2. 找出html目錄下面的全部的目錄,而後打印出來

*** 錯誤寫法css

fs.readdir('html',function (err,files) {
    if (err){
        console.log(err);
        return false
    }else{
        // console.log(files) # 打印全部的文件和文件夾
        for (var i= 0 ; i<files.length;i++){
            // console.log(files[i]); //此處也能夠打印出全部的目錄名和文件名'
            //檢測是否目錄仍是文件  錯誤寫法
            fs.stat('html'+files[i],function (err,stats) {
                console.log(files[i]); // 此處不能打印出目錄名和文件名
            })
        }
    }
});

 

執行結果html

 

 

錯誤緣由:node

1 fs.stat 檢測目錄和文件是屬於異步方法,所以在fs.stat中是無法獲取到準確的files[i];數據庫

 

使用setTimeout(異步函數)執行錯誤現象服務器

for (let i = 0; i <3; i++) {
    setTimeout(function (i) {
        console.log(i);
    },100)
}

 

 

題目的正確解法app

 

var filesArr =[];
fs.readdir('html',function (err,files) {
    if (err){
        console.log(err);
    }else{
        // console.log(files) //此處也能夠打印出全部的目錄名和文件名'
        //檢測是否目錄仍是文件
        (function getFile(i) { //自執行函數
            if (i===files.length){ //遞歸結束條件
                console.log('目錄文件以下:');
                console.log(filesArr);
                return false
            }
            fs.stat('html/'+files[i],function (err,stats) {
                // console.log(files[i]); // 此處不能打印出目錄名和文件名
                if (stats.isDirectory()){
                    filesArr.push(files[i]);
                }
                // 函數回調 
                // *** 必須放在此處,須要等待異步fs.stat方法執行完畢,才能回調
                getFile(i+1)
            });
            
            })(0)
        }
});

 

11 fs.createReadStream 從文件流中讀取數據

const fs = require('fs');

// 流的方式 讀取input.txt文件
var readStream = fs.createReadStream('input.txt');

var str =''; //保存數據
var count = 0; // 統計讀取流的次數

// 讀取數據事件 data
readStream.on('data',function (chunk) {
    str += chunk;
    count++;
});

// 讀取完成事件 on
readStream.on('end',function (chunk) {
    console.log(count);
    console.log(str);
});

// 讀取失敗事件 error
readStream.on('error',function (err) {
    console.log(err);
});

 

12 fs.createWriteStream 寫入文件

const fs = require('fs');
var data = '我是從數據庫獲取的數據,我要保存起來11\n';
// 流的方式 寫入output.txt文件
var writeStream = fs.createWriteStream('output.txt');

// 循環寫入
for (let i = 0; i <100 ; i++) {
    writeStream.write(data,'utf8')
}

// 標記寫入完成
writeStream.end();

// 寫入完成事件 finish
writeStream.on('finish',function () {
    console.log('寫入文件完成');
});

// 寫入錯誤事件 error
writeStream.on('error',function () {
    console.log('寫入失敗');
});

 

13 管道流

  管道提供了一個輸出流到輸入流的機制。一般咱們用於從一個流中獲取數據並將數據傳
遞到另一個流中。
異步

 

 


  如上面的圖片所示,咱們把文件比做裝水的桶,而水就是文件裏的內容,咱們用一根管子(pipe)鏈接兩個桶使得水從一個
  桶流入另外一個桶,這樣就慢慢的實現了大文件的複製過程。
如下實例咱們經過讀取一個文件內容並將內容寫入到另一個文件中。
函數

var fs =require('fs');

// 建立一個可讀流
var readStream = fs.createReadStream('input.txt');

// 建立一個可寫流
var writeStream = fs.createWriteStream('output.txt');

// 管道操做
// 讀取input.txt文件中的內容,並將內容存入到output.txt文件中
readStream.pipe(writeStream);

console.log('程序執行完畢');
相關文章
相關標籤/搜索