Node js имя файла без расширения

Обновлено: 03.07.2024

Доброго времени суток, друзья. Поговорим сегодня о работе с файлами в Node.js. Для работы с файлами используется модуль fs (сокращение от File System).

В этой статье мы рассмотрим следующие темы:

Для начала работы нам потребуется установленная Node.js. Подробную инструкцию по ее установке вы можете получить (тут).

Прежде чем начать работу с модулем, его следует импортировать в рабочем файле.

Пробежимся по основным методам этого модуля и посмотрим на примерах как с ними можно работать.

Работа с файловыми дескрипторами

Прежде чем двигаться дальше, давайте посмотрим на термины, о которых описано в статье ниже.

Файловый дескриптор — это неотрицательное целое число. Когда создается новый поток ввода-вывода, ядро возвращает процессу, создавшему поток ввода-вывода, его файловый дескриптор (Wikipedia).

Перейдем к примерам.

Ниже я приведу перечень флагов доступа к файлам

Следует помнить, что дескрипторы файлов необходимо закрывать для предотвращения переполнения памяти, а также проблем с производительностью. Выполним данную задачу с помощью метода close() и его синхронного аналога closeSync().

Работа с директориями

Для проверки существующей директории (файла) и доступов к нему в модуле fs применяется метод access

Вторым параметром устанавливается константа режима проверки:

Создание новой папки

Для создания каталогов присутствует асинхронный метод mkdir и синхронный mkdirSync.

Для создания в текущей директории нового каталога, перед путем следует указать переменную __dirname как вариант реализации абсолютного пути, либо воспользоваться метом resolve модуля path.

Чтение содержимого папки

Для получения содержимого директории используются два метода readdir и readdirSync. Первым параметром для методов передается путь директории, содержимое которой нужно получить.

Удаление папки

Удаление директории производится с помощью методов rmdir и rmdirSync. Первым параметром методов является путь удаляемой директории.

Получение системной информации о файле

Каждый файл, который мы загружаем, помимо данных хранит в себе системную информацию. Для получения этой информации можно воспользоваться методом stat() или выбрать синхронный вариант statSync()

Вся информация хранится в получаемом объекте stats. Данный объект хранит в себе методы для получения дополнительной полезной информации.

Перечислю некоторые из этих свойств:

stats.isDirectory() метод позволяет узнать, является ли файл директорией;

stats.isFile() метод возвращает true, если это файл;

stats.isSocket() метод возвращает true, если это сокет;

stats.isSymbolicLink() метод возвращает true, если файл является символьной ссылкой;

stats.size свойство, которое возвращает размер файла;

stats.birthtime возвращает время и дату, когда данный файл был создан.

Модуль path и путь к файлу Node.js

Основной проблемой при работе с файлами и папками в операционных системах является разный синтаксис написания путей их расположения. Для решения этой проблемы в Node.js есть модуль path c набором полезных методов.

Для началы работы с модулем его нужно импортировать.

Получение имени, пути и расширения файла

Предположим, что в папке /temp лежит файл template.txt. Воспользуемся методами модуля path для получения имени файла, пути к нему, а так же его расширения.

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

path.basename(file, ‘.txt’) // tempalate

Метод dirname возвращает весь путь директории, где лежит файл и имеет один параметр, в который передается путь к файлу.

Метод extname возвращает расширение переданного файла.

Работа с путями файла

В модуле path есть ряд методов для удобного формирования путей к нужному файлу или директории. Мы не будем рассматривать все методы, а только наиболее часто используемые. Рассмотрим их ниже.

Метод join принимает список параметров, объединяет их в одну строку, используя разделитель, подходящий к конкретной операционной системе, в которой будет исполнятся код.

Метод resolve используется для нахождения абсолютных путей к файлу.

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

Переименование файла или директории

Методы rename() и renameSync() первым параметром принимают путь к файлу, который нужно переименовать. Второй параметр отвечает за новое наименование файла.

Чтение файла

Если вторым параметром не указана кодировка, то возвращается Buffer. Эти методы полностью загружают файлы в память компьютера, что может сильно отразиться на производительности. Если размер файла большой, то стоит воспользоваться потоками fs.createReadStream()

Запись файла

Чтобы перезаписать контент файлов, используются методы writeFile и writeFileSync. Важный момент! Если файла, контент которого нужно перезаписать, не существует, то он будет создан автоматически.

Копирование файла

Методы copyFile() и copyFileSync() первым параметром принимают путь файла для копирования. Второй параметр принимает название пути и нового файла. Третьим параметром является колбэк функция, которая возвращает ошибку.

Удаление файла

Последнее, что мы рассмотрим в этой статье будут методы unlink() и unlinkSync(). Первым параметром методы принимают путь к удаляемому файлу. Второй параметр в методе unlink возвращает колбэк функцию с ошибкой.

Заключение

В данной статье мы разобрали работу Node.js с файлами, на примерах посмотрели основные полезные методы модулей fs и path. Исходный код вы сможете найти тут. Надеюсь данная статья была вам полезна. Учитесь, думайте, пишите код. Удачного кодинга, друзья!

Подписывайтесь на наш канал в Telegram и на YouTube для получения самой последней и актуальной информации.

Например, предполагая, что x = filename.jpg , я хочу получить filename , где filename может быть любым именем файла (Предположим, что имя файла содержит только [a-zA-Z0-9-_ ] чтобы упростить.).

Я видел x.substring(0, x.indexOf('.jpg')) на DZone Snippets, но не смог > выступать лучше? Потому что length является свойством и не выполняет проверку символов, тогда как indexOf() является функцией и выполняет проверку символов.

23 ответа

Если вы знаете длину расширения, вы можете использовать x.slice(0, -4) (где 4 - это три символа расширения и точка).

Если вы не знаете длину, регулярное выражение @John Hartsock было бы правильным подходом.

Если вы не хотите использовать регулярные выражения, вы можете попробовать это (менее производительно):

Обратите внимание, что это не удастся для файлов без расширения.

Еще один вкладыш:

Здесь регулярные выражения пригодятся! Метод .replace() Javascript будет принимать регулярное выражение, и вы можете использовать его для достижения желаемого:

Принятый ответ удаляет только последнюю часть расширения ( .jpg ), что может быть хорошим выбором в большинстве случаев.

Однажды мне пришлось удалить все расширения ( .tar.gz ), а имена файлов были ограничены, чтобы они не содержали точек (поэтому 2015-01-01.backup.tar не будет проблемой):

Вот еще одно решение на основе регулярных выражений:

Это должно только отрубить последний сегмент.

Вы можете использовать path для маневра.

x.length-4 учитывает только расширения из 3 символов. Что если у вас есть filename.jpg или filename.pl ?

Чтобы ответить . конечно, если у вас всегда есть расширение .jpg , x.length-4 будет работать нормально.

Однако, если вы не знаете длину своего расширения, любое из нескольких решений будет лучше / надежнее.

x = x.substring(0, x.lastIndexOf('.'));

ИЛИ (при условии, что имя файла имеет только одну точку)

ИЛИ (также только с одной точкой)

Это код, который я использую для удаления расширения из имени файла, без использования регулярных выражений или indexOf (indexOf не поддерживается в IE8). Предполагается, что расширением является любой текст после последнего '.' персонаж.

  • файлы без расширения: "myletter"
  • файлы с '.' в названии: "my.letter.txt"
  • неизвестная длина расширения файла: "my.letter.html"

Это работает, даже если в строке нет разделителя.

Может также использоваться как однострочный:

РЕДАКТИРОВАТЬ: Это более эффективное решение:

Хотя уже довольно поздно, я добавлю другой подход, чтобы получить имя файла без расширения, используя старый добрый JS-

В node.js имя файла без расширения можно получить следующим образом.

Дальнейшие объяснения на странице документации Node.js .

Node.js удаляет расширение из каталога хранения полного пути

Также выводит каталог:

Протестировано в Node.js v10.15.2.

Если вам нужно обработать переменную, которая содержит полный путь (например, thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg" ), и вы хотите вернуть только «имя файла», вы можете использовать:

Результат будет theName == "filename" ;

Чтобы попробовать это, напишите следующую команду в окне консоли вашего отладчика Chrome: window.location.pathname.split("/").slice(-1).join().split(".").shift()

Если вам нужно обработать только имя файла и его расширение (например: theNameWithExt = "filename.jpg" ):

Результат будет theName == "filename" , такой же, как указано выше;

Примечания:

  1. Первый немного медленнее, потому что выполняет больше операций; но работает в обоих случаях, другими словами, он может извлечь имя файла без расширения из заданной строки, содержащей путь или имя файла с помощью ex. В то время как второй работает, только если данная переменная содержит имя файла с ext, например filename.ext, но немного быстрее.
  2. Оба решения работают как с локальными, так и с серверными файлами;

Но я не могу ничего сказать ни о сравнении производительности с другими ответами, ни о совместимости браузера или ОС.

например, предполагая, что x = filename.jpg , Я хочу filename , где filename может быть любое имя файла (предположим, что имя файла содержит только [a-zA-Z0-9-_] для упрощения.).

Я видел x.substring(0, x.indexOf('.jpg')) on DZone Фрагменты, а не x.substring(0, x.length-4) лучше? Потому что, length является свойством и не выполняет проверку символов, тогда как indexOf() - это функция, а не персонаж.

Если вы знаете длину расширения, вы можете использовать x.slice(0, -4) (где 4-это три символа расширения и точки).

Если вы не знаете длину @John hartsock regex будет правильным подходом.

Если вы не хотите использовать регулярные выражения, вы можете попробовать это (медленее):

обратите внимание, что он не будет работать на файлы без расширения.

не уверен, что будет работать быстрее, но это будет более надежным, когда дело доходит до расширения, как .jpg или .html

In узел.js, имя файла без расширения можно получить следующим образом.

дальнейшее объяснение в узел.jsдокументация страница.

x.length-4 учитывает только расширения из 3 символов. Что делать, если у вас есть filename.jpg или filename.pl ?

EDIT:

ответ. конечно, если у вас всегда есть продолжение .jpg , x.length-4 будет работать нормально.

однако, если вы не знаете длину вашего расширения, любое из ряда решений лучше/надежнее.

x = x.replace(/\..+$/, '');

или

x = x.substring(0, x.lastIndexOf('.'));

или

x = x.replace(/(.*)\.(.*?)$/, "");

или (с предположением, что имя файла имеет только одну точку)

или (также только с одной точкой)

В Узел.версии js до 0.12.x:

path.basename(filename, path.extname(filename))

конечно, это также работает в 0.12.х и позже.

это работает, даже если разделитель отсутствует в строке.

можно также использовать как ОДН-вкладыш как это:

EDIT: это более эффективное решение:

Мне нравится этот один, потому что это один лайнер, который не слишком трудно читать:

вот еще одно регулярное выражение на основе решения:

Это должно отрубить только последний сегмент.

Я не знаю, если это допустимый вариант, но я использую это:

Это не просто одна операция, которую я знаю, но, по крайней мере, он должен всегда работать!

принятый ответ удаляет только последнюю часть расширения ( .jpg ), что может быть хорошим выбором в большинстве случаев.

мне однажды пришлось снять все расширения ( .tar.gz ) и имена файлов были ограничены, чтобы не содержать точек (так 2015-01-01.backup.tar не было бы проблемой):

Если вам нужно обработать переменную, содержащую полный путь (например.: thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg" ) и вы хотите вернуть только "имя файла" вы можете использовать:

результат будет theName = = "filename";

чтобы попробовать, напишите следующую команду в окно консоли вашего отладчика chrome: window.location.pathname.split("/").slice(-1).join().split(".").shift()

если вы хотите обработать только имя файла и его расширение (например.: theNameWithExt = "filename.jpg" ):

в результат будет theName = = "filename", то же, что и выше;

Примечания:

  1. первый немного медленнее причина выполняет больше операций, но работает в обоих случаях, другими словами он может извлечь имя файла без расширения из заданной строки, содержащей путь или имя файла с ex. В то время как второй работает только в том случае, если данная переменная содержит имя файла с ext как filename.доб, но немного быстрее.
  2. оба решения работают как для локальных, так и для серверных файлов;

хотя это довольно поздно, я добавлю еще один подход, чтобы получить имя файла без расширения, используя старый добрый ИС-

path.replace(path.substr(path.lastIndexOf('.')), '')

вот где регулярные выражения пригодятся! Javascript-это .replace() метод будет принимать регулярное выражение, и вы можете использовать его для выполнения того, что вы хотите:

еще один лайнер-мы предполагаем, что наш файл представляет собой изображение jpg > > ex: var yourStr = 'test.jpg';

можно использовать path для маневра.

выход

Например, предполагая, что x = filename.jpg я хочу получить filename , где filename может быть любое имя файла (предположим, что имя файла содержит только [a-zA-Z0-9-_] для упрощения.).

Я видел x.substring(0, x.indexOf('.jpg')) на DZone Snippets , но не будет ли x.substring(0, x.length-4) лучше? Потому length что это свойство и не выполняет проверку символов, тогда как indexOf() является функцией и проверкой символов.

В эпоху ES6 см. Также модуль Path - в случае, если вы используете nodejs или правильную транспиляцию

Если вы знаете длину расширения, вы можете использовать его x.slice(0, -4) (где 4 - это три символа расширения и точка).

Если вы не знаете длину, регулярное выражение @John Hartsock будет правильным подходом.

Если вы не хотите использовать регулярные выражения, вы можете попробовать это (менее производительно):

Обратите внимание, что это не удастся для файлов без расширения.

Мне нравится это решение больше всего. Это чисто, и я могу использовать его, потому что я знаю, что расширение файла всегда .jpg . Я искал что-то вроде Ruby's x[0..-5] и x.slice(0, -4) отлично выглядит! Спасибо! И спасибо всем остальным за все другие надежные альтернативы! это не оптимальное решение, пожалуйста, проверьте другие решения ниже. И если вы не уверены на 100% в длине расширения, то не делайте этого: "picture.jpg".slice(0, -4) -> «картинка». Это опасное решение, потому что вы не знаете длину формата. «Если вы знаете длину расширения» Прошли десятилетия, так как это было приемлемое предположение. Не используйте это больше.

Не уверен, что будет работать быстрее, но это будет более надежно, когда речь идет о расширении, как .jpg или .html

Вы, вероятно, хотите также запретить / в качестве разделителя пути, поэтому регулярное выражение будет /\.[^/.]+$/ Это работает для любого расширения файла (.txt или .html или .htaccess), а также позволяет имени файла содержать дополнительные символы точки (.). Он не будет обрабатывать, например .tar.gz из-за самого расширения, содержащего точку. Обычно имя файла содержит дополнительные точки, а не расширение файла. Спасибо! @ Вик Есть разница между «правильным ответом» и принятым ответом. Принятый ответ - это просто ответ, который был полезен для того, кто задал вопрос. Я предполагаю, что могут быть проблемы с платформой Windows, потому что могут быть обратные косые черты. Поэтому регулярное выражение должно быть /\.[^/\\.]+$/.

В файле node.js имя файла без расширения можно получить следующим образом.

Дальнейшее объяснение на странице документации Node.js.

То, что вы говорите о @kaasdude . этот метод эффективно удаляет расширение на узле., Не уверен, что вы хотели выразить, но этот метод работает жемчужинами. Этот ответ довольно ограничен серверным узлом. Если вы попытаетесь использовать это в реагирующем коде, это не похоже на импорт. если вы хотите удалить расширение из пути, включая каталоги, вы можете сделать, var parsed = path.parse(filename) после чего path.join(parsed.dir, parsed.name) . Другая возможность есть let base = path.basename( file_path, path.extname( file_path ) ) .

x.length-4 учитывает только расширения 3 символов. Что делать, если у вас есть filename.jpg или filename.pl ?

Чтобы ответить . конечно, если у вас всегда есть расширение .jpg , x.length-4 будет работать просто отлично.

Однако, если вы не знаете длину своего расширения, любое из ряда решений будет лучше / надежнее.

x = x.substring(0, x.lastIndexOf('.'));

ИЛИ (при условии, что имя файла имеет только одну точку)

ИЛИ (также только с одной точкой)

?? Вы можете иметь имя файла ex: "summer.family.jpg", в этом случае split ('.') [0] вернет только частичное имя файла. Я бы убрал его из ответа или четко указал под вопросом для этого примера. @basarat . Что-то, что я часто делаю в отношении расщепления деталей: var parts = full_file.split("."); var ext = parts[parts.length-1]; var file = parts.splice(0,parts.length-1).join("."); x.split (".") даже не следует считать ответом. Я знаю, что использую «.» почти во всех моих соглашениях об именах файлов, например: survey.controller.js или my.family.jpg. @ Lee2808: Отсюда и предупреждение только об одной точке. Это просто означает, что существует несколько подходов, в зависимости от приложения. Я бы, конечно, использовал один из других методов почти во всех случаях. x = x.substr(0, x.lastIndexOf('.')); - ты наверное имел ввиду x = x.substring(0, x.lastIndexOf('.')); ?

Возможно, вы можете использовать предположение, что последняя точка будет разделителем расширения.

Предупреждение, это не удастся, если не будет никакого расширения имени файла. Вы остались с пустой строкой. Укороченная версия, в которой нет точек. var f = x.substr(0, x.lastIndexOf('.')) || x; Это работает, потому что пустая строка ложная, поэтому она возвращает x.

Мне нравится этот, потому что это один лайнер, который не слишком трудно читать:

В версиях Node.js до 0.12.x:

Конечно, это также работает в 0.12.x и позже.

Это работает, даже если в строке нет разделителя.

Может также использоваться как однострочный:

РЕДАКТИРОВАТЬ: Это более эффективное решение:

Я не знаю, если это правильный вариант, но я использую это:

Это не просто одна операция, которую я знаю, но, по крайней мере, она всегда должна работать!

ОБНОВЛЕНИЕ: Если вы хотите oneliner, вот вы:

Это должен быть не name.join (''), а name.join ('.'). Вы разделяете по точкам, но присоединяетесь через запятую, поэтому hello.name.txt возвращаетесь hello, name

Еще один вкладыш:

Вот еще одно решение на основе регулярных выражений:

Это должно только отрубить последний сегмент.

Принятый ответ удаляет только последнюю часть расширения ( .jpg ), что может быть хорошим выбором в большинстве случаев.

Однажды мне пришлось удалить все расширения ( .tar.gz ), а имена файлов были ограничены, чтобы не содержать точек (так 2015-01-01.backup.tar что это не будет проблемой):

Если вам нужно обработать переменную, которая содержит полный путь (например, thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg" ), и вы хотите вернуть только «имя файла», вы можете использовать:

результатом будет имя == "имя файла" ;

Чтобы попробовать это, напишите следующую команду в окне консоли вашего отладчика Chrome: window.location.pathname.split("/").slice(-1).join().split(".").shift()

Если вам нужно обработать только имя файла и его расширение (например:) theNameWithExt = "filename.jpg" :

результат будет theName == "filename" , такой же, как указано выше;

  1. Первый немного медленнее, потому что выполняет больше операций; но работает в обоих случаях, другими словами, он может извлечь имя файла без расширения из заданной строки, содержащей путь или имя файла с помощью ex. В то время как второй работает, только если данная переменная содержит имя файла с ext, например filename.ext, но немного быстрее.
  2. Оба решения работают как с локальными, так и с серверными файлами;

Но я не могу ничего сказать ни о сравнении производительности с другими ответами, ни о совместимости браузера или ОС.

Читайте также: