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目录下面的所有的目录,然后打印出来

*** 错误写法

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]); // 此处不能打印出目录名和文件名
            })
        }
    }
});

执行结果

错误原因:

1 fs.stat 检测目录和文件是属于异步方法,因此在fs.stat中是没法获取到准确的files[i];

使用setTimeout(异步函数)执行错误现象

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

题目的正确解法

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('程序执行完毕');



 

猜你喜欢

转载自www.cnblogs.com/angle6-liu/p/11717876.html