105 lines
3.2 KiB
JavaScript
Raw Normal View History

2024-06-06 13:12:04 +08:00
import fs from "fs"
import path from "path";
const fspromises = fs.promises;
/**
* 判断文件或目录是否存在
* @param {*} path 文件或目录的路径
* @returns true表示存在false表示不存在
*/
export async function CheckFileOrDirExist(path) {
try {
await fspromises.access(path);
return true; // 文件或目录存在
} catch (error) {
return false; // 文件或目录不存在
}
}
/** *
* @param {*} path 输入的文件地址
* @returns true false 不是
*/
export async function IsDirectory(path) {
try {
const stat = await fspromises.stat(path);
return stat.isDirectory();
} catch (error) {
throw new Error(`获取文件夹信息失败: ${path}`);
}
}
/**
* 将文件或者是文件夹备份到指定的文职
* @param {*} source_path 源文件/文件夹地址
* @param {*} target_path 目标文件/文件夹地址
*/
export async function BackupFileOrFolder(source_path, target_path) {
try {
// 判断父文件夹是否存在,不存在创建
const parent_path = path.dirname(target_path);
if (!(await CheckFileOrDirExist(parent_path))) {
await fspromises.mkdir(parent_path, { recursive: true });
}
// 判断是不是文件夹
const isDirectory = await IsDirectory(source_path);
if (isDirectory) {
// 复制文件夹
await fspromises.rename(source_path, target_path);
} else {
// 复制文件
await fspromises.copyFile(source, target);
}
} catch (error) {
throw new Error(error);
}
}
/**
* 获取指定的文件夹下面的所有的指定的拓展名的文件
* @param {*} folderPath 文件夹地址
* @param {*} extensions 拓展地址
* @returns 返回文件中指定的后缀文件地址绝对地址
*/
export async function GetFilesWithExtensions(folderPath, extensions) {
try {
// 判断当前是不是文件夹
if (!(await IsDirectory(folderPath))) {
throw new Error("输入的不是有效的文件夹地址")
}
let entries = await fspromises.readdir(folderPath, { withFileTypes: true });
let files = [];
// 使用Promise.all来并行处理所有的stat调用
const fileStats = await Promise.all(entries.map(async (entry) => {
const entryPath = path.join(folderPath, entry.name);
if (entry.isFile()) {
return {
name: entry.name,
path: entryPath,
isFile: true,
};
} else {
return {
isFile: false,
};
}
}));
// 过滤出文件并且满足扩展名要求的文件
files = fileStats.filter(fileStat => fileStat.isFile && extensions.includes(path.extname(fileStat.name).toLowerCase()));
// 对files数组进行排序基于文件名
files.sort((a, b) => a.name.localeCompare(b.name));
// 返回文件名数组(完整的)
return files.map(fileStat => path.join(folderPath, fileStat.name));
} catch (error) {
throw new Error(error);
}
}