天天看點

Node.js 檔案寫入及檔案夾互動操作

作者:提拉米蘇TiLaMiSu

檔案寫入

在Node.js中寫入檔案最簡單的方法是使用fs.writeFile()API。

const fs = require('fs');
const content = 'Some content!';
fs.writeFile('/Users/joe/test.txt', content, err => {
  if (err) {
  	console.error(err);
  }
	// file written successfully
});           

同步寫入檔案

您可以使用同步版本fs.writeFileSync():

const fs = require('fs');
const content = 'Some content!';
try {
  fs.writeFileSync('/Users/joe/test.txt', content);
  // file written successfully
} catch (err) {
	console.error(err);
}           

您還可以使用fs/promises子產品提供的基于promise的fsPromises.writeFile()方法:

const fs = require('fs/promises');
async function example() {
  try {
    const content = 'Some content!';
    await fs.writeFile('/Users/joe/test.txt', content);
  } catch (err) {
    console.log(err);
  }
}
example();           

預設情況下,如果檔案已經存在,則此API将替換檔案的内容。

您可以通過指定标志來修改預設值:

fs.writeFile('/Users/joe/test.txt', content, { flag: 'a+' }, err => {});           
标志 描述 不存在則建立
r+ 此标志打開檔案進行讀取和寫入 X
w+ 此标志打開檔案進行讀取和寫入,并将流定位在檔案的開頭 v
a 這個标志打開檔案進行寫入,它還将流定位在檔案的末尾 v
a+ 這個标志打開檔案進行讀寫,它還将流定位在檔案的末尾 v

将内容追加到檔案:

将内容附加到檔案末尾的一個友善方法是fs.appendFile()(及其對應的fs.appentFileSync()):

const fs = require('fs');
const content = 'Some content!';
fs.appendFile('file.log', content, err => {
  if (err) {
  	console.error(err);
  }
// done!
});           

下面是一個fsPromises.appendFile()示例:

const fs = require('fs/promises');
async function example() {
  try {
  const content = 'Some content!';
  await fs.appendFile('/Users/joe/test.txt', content);
  } catch (err) {
  	console.log(err);
  }
}
example();           

檔案夾互動

檢查檔案夾是否存在:

使用fs.access()(及其基于promise的對應檔案fsPromises.access())檢查檔案夾是否存在,Node.js是否可以使用其權限通路該檔案夾。

标志 描述
F_OK 訓示檔案對調用程序可見的标志。這對于确定檔案是否存在很有用,但沒有說明rwx權限。如果未指定模式,則為預設值。
R_OK 訓示調用程序可以讀取檔案的标志。
W_OK 訓示調用程序可以寫入檔案的标志。
X_OK 訓示該檔案可以由調用程序執行的标志。這對Windows沒有影響(其行為類似于fs.constants.F_OK)。
import { access, constants } from 'node:fs';
const file = 'package.json';
// 檢查檔案,是否存在目前目錄
access(file, constants.F_OK, (err) => {
console.log(`${file} ${err ? 'does not exist' : 'exists'}`);
});
// 檢查檔案是否可讀.
access(file, constants.R_OK, (err) => {
console.log(`${file} ${err ? 'is not readable' : 'is readable'}`);
});
// 檢查檔案是否可寫.
access(file, constants.W_OK, (err) => {
console.log(`${file} ${err ? 'is not writable' : 'is writable'}`);
});
// 檢查檔案是否可讀并可寫.
access(file, constants.R_OK | constants.W_OK, (err) => {
console.log(`${file} ${err ? 'is not' : 'is'} readable and writable`);
});           

建立新檔案夾:

可使用fs.mkdir()、fs.mkdirSync()或fsPromises.mkdir()建立新檔案夾。

const fs = require('fs');
const folderName = '/Users/joe/test';
try {
  if (!fs.existsSync(folderName)) {
  	fs.mkdirSync(folderName);
  }
} catch (err) {
	console.error(err);
}           

讀取目錄内容

使用fs.readir()、fs.readirSync()或fsPromises.readdir()讀取目錄的内容。

這段代碼讀取檔案夾的内容,包括檔案和檔案夾:

const fs = require('fs');
const folderPath = '/Users/joe';
fs.readdirSync(folderPath);           

傳回它們的絕對路徑:

fs.readdirSync(folderPath).map(fileName => {
return path.join(folderPath, fileName);
});           

您也可以過濾結果以僅傳回檔案,并排除檔案夾:

const isFile = fileName => {
	return fs.lstatSync(fileName).isFile();
};
fs.readdirSync(folderPath)
  .map(fileName => {
  return path.join(folderPath, fileName);
})
	.filter(isFile);           

重命名檔案夾:

使用fs.rename()、fs.renameSync()或fsPromises.rename()重命名檔案夾。第一個參數是目前路徑,第二個參數是新路徑:

const fs = require('fs');
fs.rename('/Users/joe', '/Users/roger', err => {
  if (err) {
  	console.error(err);
  }
// done
});           

fs.renameSync()是同步版本:

const fs = require('fs');
try {
	fs.renameSync('/Users/joe', '/Users/roger');
} catch (err) {
	console.error(err);
}           

fsPromises.rename()是基于promise的版本:

const fs = require('fs/promises');
async function example() {
  try {
  	await fs.rename('/Users/joe', '/Users/roger');
  } catch (err) {
  	console.log(err);
  }
}
example();           

删除檔案夾:

使用fs.rmdir()、fs.rmdirSync()或fsPromises.rmdir()删除檔案夾。

const fs = require('fs');
fs.rmdir(dir, err => {
  if (err) {
  	throw err;
  }
console.log(`${dir} is deleted!`);
});           

要删除包含内容的檔案夾,請使用帶有選項{recursive:true}的fs.rm()以遞歸方式删除内容。

{recursive:true,force:true}使其在檔案夾不存在時忽略異常。

const fs = require('fs');
fs.rm(dir, { recursive: true, force: true }, err => {
  if (err) {
  	throw err;
  }
	console.log(`${dir} is deleted!`);
});           

#程式員##程式設計# #挑戰30天在頭條寫日記#