Как узнать наличие файла, зная только часть его имени?
Привет! Как в Node.js найти файл(ы) (или проверить его/их существование), зная только часть его имени? :help:
Н-р, мы хотим узнать существует ли в директории "/path/" файл(ы) с именем, в котором присутствует строка "298AA5B8". :yes: В зависимости от ситуации требуется вывести либо только самый последний файл, либо список всех файлов в названии которых есть указанная строка (отсортированный по времени). :thanks: Допустим, в директории "/path/" имеются следующие файлы:
Предполагаемая реализация:
const fs = require("fs");
const string = '298AA5B8';
fs.findFile('/path/', string, function(error, result){
if (error) {
console.log("Файл не найден");
} else {
console.log(result);
//298AA5B8_AJSDA484_18477588.txt — самый последний добавленный файл с разыскиваемой строкой в имени
}
});
Важно чтобы функция сразу заканчивала свою работу как найдёт первое вхождение. Если надо все файлы, где встречается строка в имени, то предполагаемая реализация такая:
const fs = require("fs");
const string = '298AA5B8';
fs.findFiles('/path/', string, function(error, result){
if (error) {
console.log("Файл не найден");
} else {
console.log(result);
//Выведет массив файлов
//['298AA5B8_AJSDA484_18477588.txt','LFK4883G_298AA5B8_93874223.txt'];
}
});
В настоящий момент удалось найти только поиск по конкретному названию файла: :no:
const fs = require("fs");
fs.access("filename.txt", function(error){
if (error) {
console.log("Файл не найден");
} else {
console.log("Файл найден");
}
});
или
const fs = require("fs");
fs.stat("filename.txt", function(err, stats) {
if (err) {
console.log("Файл не найден");
} else {
console.log("Файл найден");
}
});
Существует ли в Node.js функциональность, чтобы найти файл/ы (или проверить их существование), зная только часть их имени? :D P.S. аналогия здесь может быть с SQL: "SELECT * FROM files WHERE param1 = 'string' OR param2 = 'string' ORDER BY time DESC LIMIT 1"; или для массива файлов: "SELECT * FROM files WHERE param1 = 'string' OR param2 = 'string' ORDER BY time DESC"; |
Цитата:
Я бы сделал как-то так (код накидал на коленке и не проверял вовсе):
import {readdir} from 'node:fs/promises';
let index = {};
export function clearCache() {
index = {};
}
export async function findFiles(path, needle, amountOfFiles = null, shouldThrowAnError = false) {
let result = [];
try {
index[path] ??= await readdir(path);
if (index[path] instanceof Error) {
throw index[path];
}
for (const file of index[path]) {
if (file.includes(needle)) {
result.push(file);
}
if (amountOfFiles != null && result.length >= amountOfFiles) {
break;
}
}
} catch (err) {
index[path] = err;
if (shouldThrowAnError) {
throw err;
}
}
return result;
}
findFiles('/path', '298AA5B8');
// ['298AA5B8_AJSDA484_18477588.txt','LFK4883G_298AA5B8_93874223.txt']
findFiles('/path', '298AA5B8', 1);
// ['298AA5B8_AJSDA484_18477588.txt']
clearCache();
|
| Часовой пояс GMT +3, время: 00:42. |