2

8. 对文件或目录执行的其他操作

8.1 修改文件名字或移动文件目录fs.rename

  • fs.rename(oldPath, newPath, callback(err))
  • 使用rename方法移动文件或目录,当移动后的路径与原路经为同一路径,则修改该文件的名字
  • 若移动后的文件名或目录名与原文件名或目录名不同时,则执行文件或目录的移动操作
const fs = require('fs');
let mkdir = './mkdir';
fs.rename('./one', './two', (err) => {
    if (err) {
        console.log(`fs.rename file one to two failed~`);
        return false;
    }
    console.log(`fs.rename file one to two success~`);
})

8.2 创建文件的硬链接fs.link

  • fs.link(oldPath, newPath)
  • srcPath参数用于指定需要被创建硬链接的文件的完整路径及文件名
  • dstPath参数用于指定被创建硬链接的完整路径及文件名,该硬连接与源文件必须位于同一卷中
  • 异步创建与删除文件的硬链接fs.linkSync(srcPath, dstPath)
const fs = require('fs');
let linkFile = 'link.txt';
let linkCopyFile = 'linkCopy.txt';
let data = '创建与删除文件的硬链接';
fs.writeFile('./link.txt', data, (err) => {
    if (err) {
        console.log(`write file failed`);
        return false;
    }
    fs.link(linkFile, linkCopyFile, (err) => {
        if (err) {
            console.log(`fs.link ${linkFile} file failed~`);
            return false;
        }
        console.log(`fs.link ${linkCopyFile} file success~`);
    });
});

8.3 删除文件的硬链接fs.unlink

  • fs.unlink(path, callback(err))
const fs = require('fs');
let linkFile = 'link.txt';
let linkCopyFile = 'linkCopy.txt';
let data = '创建与删除文件的硬链接';
fs.unlink(linkCopyFile, (err) => {
    if (err) {
        console.log(`fs.unlink ${linkFile} file failed~`);
        return false;
    }
    console.log(`fs.unlink ${linkCopyFile} file success~`);
})

8.4 创建与查看符号链接

符号链接,是一种特殊的文件,这个文件中仅包含了另一个文件或目录的路径及文件名或目录名。如果打开一个文件的符号链接文件进行编辑,操作系统将自动打开符号链接中所指向的原文件进行编辑,如果打开一个目录的符号链接文件进行文件的操作编辑或删除操作,则操作系统将西东打开符号链接中所指向的原目录并执行相应的操作。如果删除符号链接文件,不会删除原文件或目录,如果删除或移动原文件互哦目录,符号链接文件也不会被删除,这是会产生一种称为断链的现象
  • fs.symlink(srcPath, dstPath, [type], callback(err))
  • type--> file, dir(default,非windows只能使用dir), function(only windows)
  • 同步创建与查看符号链接fs.symlinkSync(srcPath, dstPath, [type])
const fs = require('fs');
fs.symlink('./one.js', './two.js', 'file', (err) =>{
    if(err) {
        console.log(`fs.symlink one.js to two.js failed~`, err);
        return false;
    } 
    console.log(`fs.symlink one.js to two.js success~`)
})

8.5 readlink读取符号链接

  • 同步读取符号链接fs.readlinkSync(path)path指定符号链接的路径及文件名
const fs = require('fs');
fs.symlink('./one.js', './two.js', 'file', (err) => {
    if (err) {
        console.log(`fs.symlink one.js to two.js failed~`, err);
        return false;
    }
    console.log(`fs.symlink one.js to two.js success~`);
    fs.readlink('./two.js', (err, linkString) => {
        if (err) {
            console.log(`fs.readlink file failed~`, err);
            return false;
        }
        console.log(linkString);
    })
});
/**
* fs.symlink one.js to two.js success~
* ./one.js
* **/

8.6 截断文件fs.truncate()

  • 所谓对文件进行截断操作,是指一种首先清除文件内容,然后修改文件尺寸的操作
  • 换句话说就是对文件内容进行修改
  • fs.truncate(filename, length, callback(err))
  • 同步截断文件fs.truncateSync(filename, length)
  • one.js原本内容
console.log('this is one.js');
  • one.js文件进行截断
const fs = require('fs');
fs.truncate('./one.js', 10, (err) => {
    if (err) {
        console.log(`对文件进行截断操作失败~, ${err}`);
        return false;
    }
    fs.stat('./one.js', (err, stats) => {
        if (err) {
            console.log(`fs.stat file one.js failed, ${err}`);
            return false;
        }
        console.log(`fs.stat file one.js success~`);
        console.log(`./one.js size: ${stats.size} bytes`);
    });
});
/**
* console.lo
* **/

8.7 删除空目录

  • 只能删除空目录,如果不是空目录,会删除失败
const fs = require('fs');
fs.rmdir('./dirOne', (err) => {
    if (err) {
        console.log(`fs.rmdir dir one failed~, ${err}`);
        return false;
    }
    console.log(`fs.rmdir dir one success~`);
});

8.8 监视文件或目录

  • 使用watchFile方法对文件进行监视,并且在监视到文件被修改时执行某些处理方法
  • fs.watchFile(filename, [options], listener)
  • options 是一个对象,persistent属性默认为true,所以当监视文件后,应用程序没有被立即退出,改为false就会立即退出。
  • options interval属性方法设置每隔多少毫秒检查一下该文件有没有发生变化
  • function(curr, prev);,currfs.Stats对象,代表被修改之后的当前文件
  • prev参数值也是一个fs.Stats对象,代表被修改之前的当前文件
const fs = require('fs');
let filename = './one.js'
fs.watchFile(filename, {
    persistent: true,
    interval: 100
}, (curr, prev) => {
    if (Date.parse(prev.ctime) === 0) {
        console.log(`${filename}文件被创建`);
    } else if (Date.parse(curr.ctime) === 0) {
        console.log(`${filename}文件被删除`);
    } else if (Date.parse(prev.mtime) !== Date.parse(curr.mtime)) {
        console.log(`${filename}文件被修改`);
    } else {
        console.log(`${filename}文件没有被操作`);
    }
    if (Date.parse(curr.ctime) !== 0) {
        console.log(`${filename}文件的大小为${curr.size}bytes`);
    }
})

8.9 取消监控

  • fs.unwatchFile(filename, [listener])
  • watch方法,对文件或目录进行监视,并且在监视到文件或目录被修改时执行某些处理
  • fs.watch(filename, [options], [listener])
var watcher = fs.watch('./file01.txt', function (event, filename) {
    console.log(event);//事件名
    console.log(filename);//文件名
    watcher.close();//关闭监视
});

8.10 遍历文件夹里所有的文件和目录,并判断某一个文件里是否有某一些内容

const fs = require('fs');

let filePath = path.resolve('/root/files/order');
fileDisplay(filePath);

function fileDisplay(filePath) {
    fs.readdir(filePath, (err, files) => {
        // 这里的files是根目录下的直接子文件和子目录
        if (err) {
            console.error(err);
            return false;
        }
        files.forEach((filename) => {
            // 对根目录下的直接子文件和子目录进行遍历
            // 利用path的拼接路径方法
            // 找到该文件的路径
            let fileDir = path.join(filePath, filename);
            console.log(fileDir);
            fs.stat(fileDir, (err, stats) => {
                // 利用fs的stat方法判断遍历的对象是文件还是目录
                if (err) {
                    console.error('get file stats info failed');
                    return false;
                }
                let isFile = stats.isFile();
                let isDir = stats.isDirectory();
                if (isFile) {
                    if (fileDir.indexOf('user.js') > 0) {
                        fs.readFile(fileDir, (err, targetFileData) => {
                            if (targetFileData.indexOf("var id = '") > 0) {
                                console.log('the user.js has id');
                            } else {
                                console.log('the user.js has not id', fileDir);
                            }
                        })
                    }
                } else {
                    fileDisplay(fileDir);
                }
            })
        })
    })
}

karuru
329 声望64 粉丝