目录
Node.js中的fs和path模块:文件操作和路径处理
fs 模块:
path模块
代码
Node.js中的fs和path模块:文件操作和路径处理
简介: 在Node.js中,fs和path模块是常用的文件操作和路径处理工具。fs模块提供了读取和写入文件的方法,而path模块则用于处理文件路径。本文将介绍fs模块中的readFileSync、readdirSync和writeFileSync方法,以及path模块中的extname、join、basename和dirname方法,并提供使用示例。
fs 模块:
readFileSync(filePath, "utf8") readFileSync方法用于同步读取指定文件的内容,并以指定的字符编码返回。它会阻塞程序直到文件内容完全读取完毕。使用该方法可以方便地获取文件的内容。
const fs = require('fs');
const filePath = 'example.txt';
const content = fs.readFileSync(filePath, 'utf8');
console.log(content);
readdirSync(directory) readdirSync方法用于同步读取指定目录下的所有文件和子目录列表。通过该方法,我们可以快速获取目录下的所有文件和子目录的名称。
const fs = require('fs');
const directory = 'example';
const files = fs.readdirSync(directory);
console.log(files);
writeFileSync(filePath, content, { flag: "w" }) writeFileSync方法用于同步写入文件内容。该方法可以将指定的内容写入到指定的文件中。如果文件已存在,则会覆盖原有内容。
const fs = require('fs');
const filePath = 'example.txt';
const content = 'Hello, World!';
fs.writeFileSync(filePath, content, { flag: 'w' });
path模块
extname(file) extname方法用于获取文件名的扩展名部分。通过该方法,我们可以方便地获取文件的后缀名。
const path = require('path');
const file = 'example.txt';
const extname = path.extname(file);
console.log(extname);
join(directory, file) join方法用于将一个或多个路径片段拼接成一个完整的路径。通过该方法,我们可以方便地拼接路径,避免手动拼接路径字符串的麻烦。
const path = require('path');
const directory = 'example';
const file = 'example.txt';
const filePath = path.join(directory, file);
console.log(filePath);
basename(filePath, ".json") basename方法用于获取文件名,不包括扩展名部分。通过该方法,我们可以方便地获取文件的名称。
const path = require('path');
const filePath = 'example.json';
const basename = path.basename(filePath, '.json');
console.log(basename);
dirname(path) dirname方法用于获取路径中的目录部分。通过该方法,我们可以方便地获取路径中的目录名称。
const path = require('path');
const filePath = '/path/to/example.txt';
const directory = path.dirname(filePath);
console.log(directory);
结论: 在Node.js中,fs和path模块提供了丰富的文件操作和路径处理方法,使得我们能够轻松地读取和写入文件,处理文件路径。通过fs模块的readFileSync、readdirSync和writeFileSync方法,我们可以实现文件的读取和写入操作。而通过path模块的extname、join、basename和dirname方法,我们可以方便地处理文件路径。这些方法的灵活运用,可以大大提高我们在Node.js中的文件操作和路径处理的效率。
注意:本文所介绍的方法均为同步方法,会阻塞程序执行。在实际开发中,建议使用异步方法以提高程序的响应性能。
代码
工作目录新建Generate
执行命令
node Generate
这段代码包含多个JavaScript函数,包括读取JSON文件、查找目录下的JSON文件、获取导航栏标题文本、移除路径中的最后一个斜杠、获取页面名称及其路径、将页面名称写入文件等。通过调用这些函数,可以实现从JSON文件中读取数据、处理文件路径、获取页面名称等功能。最后,将页面名称写入文件中。
-
readJsonFile(filePath)
: 该函数用于读取指定路径的JSON文件,并将其内容解析为JavaScript对象。如果文件读取或解析过程中发生错误,函数将打印错误信息并返回null
。 -
findJsonFiles(directory)
: 此函数接收一个目录路径作为参数,它首先获取该目录下的所有文件列表,然后通过过滤器找出扩展名为.json的JSON文件。最后,返回包含这些JSON文件完整路径的数组。 -
getNavigationBarTitleText(filePath)
: 此函数用于从给定的JSON文件中提取导航栏标题文本。它首先调用readJsonFile()
函数读取JSON数据,然后检查JSON对象中是否存在navigationBarTitleText
属性,存在则返回其值,否则返回null
。 -
removeLastPath(path)
: 这个函数接收一个字符串类型的路径作为输入,移除路径末尾的斜杠(/)并返回处理后的路径。 -
getPageNames(pagePaths)
: 此函数遍历传入的页面路径集合,对每个路径进行一系列操作:移除末尾斜杠、查找目录下的JSON文件、从JSON文件中获取导航栏标题文本(或者使用文件名作为默认名称),并将结果以包含相对路径和页面名称的对象形式存入数组中。最终返回这个包含页面信息的对象数组。 -
writePageNamesToFile(pageNames, fileName = "page_names.txt")
: 该函数接收一个包含页面名称和路径的对象数组以及一个可选的文件名参数,默认为"page_names.txt"。它将页面名称和路径格式化后写入到指定文件中,每行一个记录。如果文件不存在,则创建新文件;如果已存在,则覆盖内容。如果写入过程中出现错误,会打印错误信息。
const fs = require("fs"); // 导入文件系统模块
const path = require("path"); // 导入路径模块
// 读取JSON文件函数
function readJsonFile(filePath) {
try {
const data = fs.readFileSync(filePath, "utf8"); // 读取文件内容
return JSON.parse(data); // 解析JSON数据并返回
} catch (error) {
console.error(`Error reading JSON file: ${filePath}`); // 打印错误信息
return null; // 返回空值
}
}
// 查找目录下的JSON文件函数
function findJsonFiles(directory) {
const files = fs.readdirSync(directory); // 获取目录下的文件列表
const jsonFiles = files.filter((file) => path.extname(file) === ".json"); // 过滤出JSON文件
return jsonFiles.map((file) => path.join(directory, file)); // 返回JSON文件的路径
}
// 获取导航栏标题文本函数
function getNavigationBarTitleText(filePath) {
const json = readJsonFile(filePath); // 读取JSON文件
if (json && json.navigationBarTitleText) {
return json.navigationBarTitleText; // 返回导航栏标题文本
}
return null; // 返回空值
}
/**
* @desc 移除路径中的最后斜杠
* @param {string} path - 要处理的路径
* @returns {string} - 移除最后斜杠之后的路径
*/
function removeLastPath(path) {
const lastIndex = path.lastIndexOf("/");
return path.substring(0, lastIndex);
}
// 获取页面名称及其路径函数,遍历指定页面路径集合,提取每个页面的相对路径与名称
function getPageNames(pagePaths) {
const pageNames = []; // 存储页面名称与相对路径的对象数组
// 移除所有路径末尾的斜杠,并确保唯一性
const uniqueFirstLevelPaths = pagePaths.map((path) => removeLastPath(path));
uniqueFirstLevelPaths.forEach((pagePath) => {
// 获取页面所在目录的绝对路径
const directory = path.join(__dirname, pagePath);
// 在页面目录下查找所有的JSON文件路径
const jsonFiles = findJsonFiles(directory);
jsonFiles.forEach((filePath) => {
// 获取JSON文件名(不含.json扩展名)
const fileNameWithoutExt = path.basename(filePath, ".json");
// 计算相对于项目根目录的相对路径
const relativePath = filePath
.replace(__dirname, "")
.replace(/\\/g, "/")
.substring(1)
.replace(fileNameWithoutExt + ".json", fileNameWithoutExt);
// 获取JSON文件中定义的导航栏标题文本
const titleText = getNavigationBarTitleText(filePath);
// 将页面相对路径、名称(优先使用导航栏标题文本)添加到结果数组中
pageNames.push({
path: relativePath,
name: titleText || fileNameWithoutExt,
});
});
});
// 返回存储页面名称与相对路径的对象数组
return pageNames;
}
function writePageNamesToFile(pageNames, fileName = "page_names.txt") {
const content = pageNames
.map((item) => `${item.path} - ${item.name}`)
.join("\n");
// 获取当前工作目录
const currentDir = process.cwd();
const filePath = path.join(currentDir, fileName);
try {
// 创建或打开文件,并以追加模式写入内容
fs.writeFileSync(filePath, content, { flag: "a" });
console.log(`Page names successfully written to file: ${filePath}`);
} catch (error) {
console.error(`Error writing page names to file: ${filePath}`, error);
}
}
const pagePaths = [
"pages/index/index",
"pages/bind/bind",
"pages/phone/phone",
"pages/shop/shop",
"pages/shop2/shop2",
"pages/kaihuHome/kaihuHome",
"pages/bindShop/bindShop",
"pages/kaihuMain/kaihuMain",
"pages/kaihu01/kaihu01",
"pages/kaihu02/kaihu02",
"pages/shopList/shopList",
"pages/shopList2/shopList2",
"pages/turnoverList/turnoverList",
"pages/search/search",
"pages/searchBankName/searchBankName",
"pages/searchList/searchList",
"pages/equipmentList/equipmentList",
"pages/equipmentForm/equipmentForm",
"pages/qrcode/qrcode",
"pages/dome/dome",
"pages/deviceDetail/deviceDetail",
"pages/cashDeviceList/cashDeviceList",
"pages/deviceList/deviceList",
"pages/authBoss/authBoss",
"pages/workOrders/workOrders",
"pages/workOrders2/workOrders2",
"pages/ordersList/ordersList",
"pages/changeShopNickName/changeShopNickName",
"pages/changeRate/changeRate",
"pages/changeWxPay/changeWxPay",
"pages/changeOther/changeOther",
"pages/workOrdersDetail/workOrdersDetail",
"pages/changeActivity/changeActivity",
"pages/shopDetail/shopDetail",
"pages/keeperList/keeperList",
"pages/shopDetailQrcode/shopDetailQrcode",
"pages/contract/contract",
"pages/hhrList/hhrList",
"pages/balance/balance",
"pages/addwifi/addwifi",
"pages/setCashierWiFi/setCashierWiFi",
"pages/addwifiqrcode/addwifiqrcode",
"pages/userHome/userHome",
"pages/loginPassword/loginPassword",
"pages/webview/index",
"pages/qywxList/qywxList",
"pages/bindShopQrcode/bindShopQrcode",
"pages/bindShopConfirm/bindShopConfirm",
"pages/bindShopSuccess/bindShopSuccess",
"pages/changeProcess/changeProcess",
"pages/changeList/changeList",
"pages/yunshanfuList/yunshanfuList",
"pages/yunshanfuUpdata/yunshanfuUpdata",
"pages/updateAlipay/updateAlipay",
"pages/huodongIndex/huodongIndex",
"pages/changeChannelList/changeChannelList",
"pages/changeChannelDetail/changeChannelDetail",
"pages/kaihuEnd/kaihuEnd",
"pages/ylbDetail/ylbDetail",
"pages/shopDetailRate/shopDetailRate",
"pages/shopChannelDetail/shopChannelDetail",
"pages/workorder/workorder",
"pages/counter/counter",
"pages/SelectLabel/SelectLabel",
"pages/taskmanage/taskmanage",
"pages/taskmanage/goInformation/goInformation",
"pages/taskmanage/additionalInfo/additionalInfo",
]; // 替换成你的页面路径数组
const pageNames = getPageNames(pagePaths);
console.log(pageNames);
console.log(pageNames.length, pagePaths.length);
writePageNamesToFile(pageNames);