Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.12.2022, 17:56
Аватар для webgraph
Профессор
Отправить личное сообщение для webgraph Посмотреть профиль Найти все сообщения от webgraph
 
Регистрация: 14.11.2014
Сообщений: 186

Как узнать наличие файла, зная только часть его имени?
Привет! Как в Node.js найти файл(ы) (или проверить его/их существование), зная только часть его имени?

Н-р, мы хотим узнать существует ли в директории "/path/" файл(ы) с именем, в котором присутствует строка "298AA5B8".

В зависимости от ситуации требуется вывести либо только самый последний файл, либо список всех файлов в названии которых есть указанная строка (отсортированный по времени).

Допустим, в директории "/path/" имеются следующие файлы:
  • AJSDA484_LFK4883G_20049562.txt
  • AJSDA484_LFK4883G_20037853.txt
  • LFK4883G_AJSDA484_20037853.txt
  • 298AA5B8_AJSDA484_18477588.txt
  • LFK4883G_298AA5B8_93874223.txt
... может быть оооооочень много файлов


Предполагаемая реализация:
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'];

    }
});




В настоящий момент удалось найти только поиск по конкретному названию файла:

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 функциональность, чтобы найти файл/ы (или проверить их существование), зная только часть их имени?


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";
Ответить с цитированием
  #2 (permalink)  
Старый 20.12.2022, 19:24
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,790

Сообщение от webgraph
Существует ли в Node.js функциональность, чтобы найти файл/ы (или проверить их существование), зная только часть их имени?
Найдите все файлы в директории и ищите среди них те, которые вам нужны.

Я бы сделал как-то так (код накидал на коленке и не проверял вовсе):
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();
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массивы. Как узнать ключ, зная значение? jsuse Общие вопросы Javascript 4 24.11.2011 19:03
Как перезагрузить окно зная его имя? Olga25 Events/DOM/Window 3 19.09.2011 15:53
Узнать наличие скрола и его ширину. Dorian_bs Общие вопросы Javascript 6 31.07.2011 02:56
Надо узнать наличие скролла и его ширину Snipe Элементы интерфейса 1 26.11.2010 15:00
Как получить имя файла и изменить его? nedosalivan Общие вопросы Javascript 5 29.03.2010 17:51