Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Как узнать наличие файла, зная только часть его имени? (https://javascript.ru/forum/node-js-io-js/84787-kak-uznat-nalichie-fajjla-znaya-tolko-chast-ego-imeni.html)

webgraph 20.12.2022 17:56

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

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

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

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


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

Nexus 20.12.2022 19:24

Цитата:

Сообщение от 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();


Часовой пояс GMT +3, время: 14:32.