Как узнать наличие файла, зная только часть его имени?
Привет! Как в 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, время: 09:04. |