天天看點

Node.js 擷取檔案資訊及路徑

作者:提拉米蘇TiLaMiSu

擷取檔案資訊

每個檔案都有一組細節,我們可以使用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'           

繼續閱讀