擷取檔案資訊
每個檔案都有一組細節,我們可以使用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變量中。我們可以使用統計資料提取什麼樣的資訊?
- 如果檔案是目錄或檔案,請使用stats.isFile()和stats.isDirectory()
- 如果檔案是使用stats.isSymbolicLink()的符号連結
- 使用stats.size的檔案大小(以位元組為機關)。
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')将此子產品包含在檔案中;你可以開始使用它的方法。
從路徑中擷取資訊:
給定一條路徑,您可以使用以下方法從中提取資訊:
- dirname:擷取檔案的父檔案夾
- basename:擷取檔案名部分
- extname:擷取檔案擴充名
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'