获取文件信息
每个文件都有一组细节,我们可以使用Node.js进行复查。特别是使用fs模块提供的stat()方法。
const fs = require('fs');
fs.stat('/Users/joe/test.txt', (err, stats) => {
if (err) {
console.error(err);
}
console.error();
// we have access to the file stats in `stats`
});
返回的stats对象
Stats {
dev: 2114, // 包含文件的设备的数字标识符。
ino: 48064969, // 文件的特定于文件系统的“Inode”编号。
mode: 33188, // 描述文件类型和模式的位字段。
nlink: 1, // 该文件存在的硬链接数。
uid: 85, // 拥有文件(POSIX)的用户的数字用户标识符。
gid: 100, // 拥有文件(POSIX)的组的数字组标识符。
rdev: 0, // 如果文件表示设备,则为数字设备标识符。
size: 527, // 文件的大小(以字节为单位)。
blksize: 4096, // 用于i/o操作的文件系统块大小。
blocks: 8, // 为此文件分配的块数。
atimeMs: 1318289051000.1, // 最后一次访问此文件的时间戳(以毫秒为单位)。
mtimeMs: 1318289051000.1,
ctimeMs: 1318289051000.1,
birthtimeMs: 1318289051000.1,
atime: Mon, 10 Oct 2011 23:24:11 GMT, // 指示上次访问此文件的时间戳。
mtime: Mon, 10 Oct 2011 23:24:11 GMT,
ctime: Mon, 10 Oct 2011 23:24:11 GMT,
birthtime: Mon, 10 Oct 2011 23:24:11 GMT
}
Node.js还提供了一个sync方式,它会阻塞线程,直到文件统计数据打算好:
const fs = require('fs');
try {
const stats = fs.statSync('/Users/joe/test.txt');
} catch (err) {
console.error(err);
}
文件信息包含在stats变量中。我们可以使用统计数据提取什么样的信息?
const fs = require('fs');
fs.stat('/Users/joe/test.txt', (err, stats) => {
if (err) {
console.error(err);
return;
}
console.log(stats.isFile()); // true
console.log(stats.isDirectory()); // false
console.log(stats.isSymbolicLink()); // false
console.log( stats.size) // 1024000 //= 1MB
});
如果您乐意,也可以使用fs/promises 模块提供的基于promise的fsPromises.stat()方法:
const fs = require('fs/promises');
async function example() {
try {
const stats = await fs.stat('/Users/joe/test.txt');
stats.isFile(); // true
stats.isDirectory(); // false
stats.isSymbolicLink(); // false
stats.size; // 1024000 //= 1MB
} catch (err) {
console.log(err);
}
}
example();
文件路径
系统中的每位文件都有一个路径。在Linux和macOS上,路径可能看起来像:/users/joe/file.txt,而Windows计算机不同,并且具有如下结构:C:\users\joe \file.txt
在应用程序中使用路径时须要注意,因为必须考虑到这一差别。
您可以使用const-path=require('path')将此模块包含在文件中;你可以开始使用它的技巧。
从路径中获取信息:
给定一条路径,您可以使用以下方式从中提取信息:
const notes = '/users/joe/notes.txt';
path.dirname(notes); // /users/joe
path.basename(notes); // notes.txt
path.extname(notes); // .txt
通过为basename指定第二个参数,可以获得不带扩展名的文件名:
path.basename(notes, path.extname(notes)); // notes
使用路径:
您可以使用path.join()连接路径的两个或多个部份:
const name = 'joe';
path.join('/', 'users', name, 'notes.txt'); // '/users/joe/notes.txt'
您可以使用path.resolve()获得相对路径的绝对路径估算:
path.resolve('joe.txt'); // '/Users/joe/joe.txt' if run from my home folder
Node.js将/joe.txt附加到当前工作目录中。如果指定第二个参数文件夹,resolve将使用第一个作为第二个的基础:
path.resolve('tmp', 'joe.txt'); // '/Users/joe/tmp/joe.txt' if run from my home folder
如果第一个参数以斜线开头,则意味着它是一个绝对路径:
path.resolve('/etc', 'joe.txt'); // '/etc/joe.txt'
path.normalize()是另一个有用的函数,当它包含这样的相对修饰符时,它将尝试估算实际路径。或者 .. 或者 //:
../ 实际上就是返回上级目录
path.normalize('/users/joe/..//test.txt'); // '/users/test.txt'