Проверить существует ли файл js

Обновлено: 03.07.2024

Я хочу проверить, существует ли файл локально, где находится файл HTML. Это должен быть JavaScript. JavaScript никогда не будет отключен. JQuery это не хорошо, но может сделать.

Кстати, я делаю титановое приложение для Mac, поэтому я ищу способ защитить свои файлы от людей, которые нажимают «показать содержимое пакета».

Если вы разрабатываете, как я предполагаю, настольное приложение, использующее Titanium, то вы можете использовать getFile модуля FileSystem, чтобы получить объект file, а затем проверить, существует ли он, используя метод существующие.

Вот пример, взятый с веб-сайта Appcelerator:

Для тех, кто думал, что он спрашивает об обычной ситуации веб-разработки, вот два ответа, которые я бы дал:

1) вы хотите проверить, существует ли файл на стороне сервера. В этом случае вы можете использовать ajax-запрос, попытаться получить файл и отреагировать на полученный ответ. Хотя имейте в виду, что вы можете проверять только те файлы, которые доступны вашему веб-серверу. Лучшим подходом было бы написать сценарий на стороне сервера (например, php), который будет выполнять проверку для вас, учитывая имя файла и вызывая этот сценарий через ajax. Также имейте в виду, что вы можете очень легко создать дыру в безопасности вашего приложения/сервера, если не будете достаточно осторожны.

2) вы хотите проверить, существует ли файл на стороне клиента. В этом случае, как указали другие, это не разрешено по соображениям безопасности (хотя IE допускал это в прошлом через ActiveX и класс Scripting.FileSystemObject), и это нормально (никто не хочет, чтобы вы чтобы иметь возможность просматривать их файлы), так что забудьте об этом.

Так как «Kranu» предупреждает: «Единственное взаимодействие с файловой системой - загрузка файлов js. , . ', который предлагает сделать это с проверкой ошибок, по крайней мере скажет вам, существует ли файл not - что может быть достаточно для ваших целей?

Из local machine вы можете проверить, существует ли файлне существует, попытавшись загрузить его как внешний скрипт и затем проверить на наличие ошибок. Например:

  • добавьте некоторые случайные данные к имени файла (url + = "?" + новая дата и т. д.), чтобы кэш браузера не служил старому результату.
  • установите уникальный идентификатор элемента (el.id =), если вы используете это в цикле, чтобы функция get_error могла ссылаться на правильный элемент.
  • установка строки onerror (el.onerror = function) немного сложнее, потому что нужно вызвать функцию get_error и передать el.id - если была установлена ​​только нормальная ссылка на функцию (например, el.onerror = get_error), тогда параметр el.id не может быть передан.
  • помните, что это только проверяет, существует ли файл .

Вы можете использовать это

Javascript не может получить доступ к файловой системе и проверить наличие. Единственное взаимодействие с файловой системой - это загрузка js-файлов и изображений (png/gif/etc).

Javascript не является задачей для этого

Если вы хотите проверить, существует ли файл с использованием javascript, то нет, насколько я знаю, javascript не имеет доступа к файловой системе по соображениям безопасности .. Но для меня не совсем понятно, что вы пытаетесь сделать ..

К счастью, по соображениям безопасности невозможно получить доступ к клиентской файловой системе со стандартным JS. Однако существуют некоторые проприетарные решения (например, компонент Microsoft ActiveX только для IE).

Альтернатива: Вы можете использовать «скрытый» элемент апплета, который реализует эту проверку с использованием привилегированного объекта действия и переопределяет ваш метод run с помощью:

Один из способов сделать это - создать тег img и установить атрибут src для файла, который вы ищете. Onload или onerror элемента img будут срабатывать в зависимости от того, существует ли файл. Вы не можете загрузить какие-либо данные, используя этот метод, но вы можете определить, существует ли конкретный файл или нет.

Вы можете безопасно использовать typeof оператор на неопределенных переменных.

если ему присвоено любое значение, включая null, typeof вернет что-то другое, кроме undefined. typeof всегда возвращает строку.

здесь много полуправды, поэтому я подумал, что кое-что проясню.

на самом деле вы не можете точно сказать, существует ли переменная (если вы не хотите обернуть каждую вторую строку в блок try-catch).

причина в том, что Javascript имеет это пресловутое значение undefined что поразительно, не означает, что переменная не определена, или не существует undefined !== not defined

Итак, как переменная, которая существует, так и другая, которая не может сообщить вам undefined тип.

что касается заблуждения @Kevin, null == undefined . Это связано с принуждением типа, и это главная причина, по которой Крокфорд продолжает говорить всем, кто не уверен в этом, всегда использовать оператор строгого равенства === для проверки возможных ложных значений. null !== undefined дает вам то, что вы могли бы ожидать. Обратите внимание, что foo != null может быть эффективным способом проверить, является ли переменная ни undefined , ни null . Конечно, вы можете быть явными, потому что это может помочь удобочитаемости.

если вы ограничиваете вопрос, чтобы проверить, существует ли объект, typeof o == "object" может быть хорошей идеей, за исключением случаев, когда вы не рассматриваете объекты массивов, так как это также будет сообщаться как тип object который может оставить вас немного смущенным. Не говоря уже о том, что typeof null также даст вам object это просто неправильно.

первичная область, где вы действительно должны быть осторожны typeof , undefined , null , unknown и другие тайны размещения объектов. Им нельзя доверять. Они вольны делать почти все, что им заблагорассудится. Поэтому будьте осторожны с ними, проверьте функциональность, если можете, потому что это единственный безопасный способ использовать функцию, которая может даже не существовать.

Проверка на существование файла (картинки)
Помогите средствами JavaScript проверить, существует даная картинка или нет! Спасибо большое. С.

Проверка на существование переменной
Всем доброго времени суток! Подскажи существует ли в JS аналог проверки на существование.

Проверка на существование каталога
Пользователь пишет в поле путь например c: emp а программа проверяет существует ли он на диске.

Проверка элемента на существование в цикле
Здравствуйте так я проверяю существование элемента на странице: <script type="text/javascript">.

javascript - это встраиваемый язык для программного доступа к объектам разных приложений

здешний форум является подразделом форума WEB -программирования и здесь рассматриваются вопросы javascript'a, встроенного в браузеры

ваша же задача касается работы с файловой системой конкретного локального компьютера - это немного другой javascript, встроенный в систему Windows - ссылку на соответствующий подфорум я вам выше дал

вы, наверно, удивитесь, но есть, например, javascript'ы, встроенные в приложения Adobe Acrobat, Adobe Photoshop, Adobe Dreamweaver, Adobe Illustrator и Adobe InDesign - и всё это немного разные javascript'ы, ибо работают они с разными объектами разных приложений

Система Windows тут вообще ни причём — не пользуюсь. Я спрашиваю про JavaScript встроенный в HTML, который в конечном итоге будет работать на сервере и проверять существование текстового файла на сервере. -- javascript встроен в браузер, а не в HTML
-- javascript работает в браузере, а не на сервере
-- вам, по невежству вашему, полагается "молчать и слушать" (с) Есть файл HTML, который лежит на сервере.
В нём есть JS-скрипт.
JS-скрипт должен проверить наличие рядом с собой НА СЕРВЕРЕ файла, и в соответствии с этим принять решение.

повторяю для тех, кто "в бронетранспортёре":
-- что, где и как лежит на сервере - знает только сервер

-- сервер получает запрос на выдачу в браузер цифровой копии определённого файла (того, который вы указали в адресной строке браузера)

-- сервер эти "цифры" по сети интернет отдаёт браузеру -- ВНИМАНИЕ! С ЭТОГО МОМЕНТА ДЛЯ БРАУЗЕРА СЕРВЕРА БОЛЕЕ НЕ СУЩЕСТВУЕТ! , ибо сервер свою задачу полностью исполнил

-- браузер получает определённое количество байт "цифр" -- ВНИМАНИЕ! С ЭТОГО МОМЕНТА СЕТЬ ИНТЕРНЕТ ДЛЯ БРАУЗЕРА ТОЖЕ БОЛЕЕ НЕ СУЩЕСТВУЕТ! , ибо сеть интернет свою задачу по доставке цифровой копии файла в браузер уже исполнила

-- браузер начинает преобразовывать полученные байты в строки HTML+CSS+JS-кода; по мере преобразования начинает эти строки кода исполнять - отражать на экране браузера какие-то теги и производить с ними какие-то действия

-- добравшись до строки, где ваш JS-код попросит проверить чего-то на сервере, браузер, будь у него руки, покрутил бы пальцем у виска и спросил бы у вас - "Какой сервер, дорогой? Вы чего, белены объелись?"

Сегодня, в девятой части перевода руководства по Node.js, мы поговорим о работе с файлами. В частности, речь пойдёт о модулях fs и path — о файловых дескрипторах, о путях к файлам, о получении информации о файлах, об их чтении и записи, о работе с директориями.


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

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

Дескриптор можно получить, воспользовавшись для открытия файла асинхронным методом open() из модуля fs :


Обратите внимание на второй параметр, r , использованный при вызове метода fs.open() . Это — флаг, который сообщает системе о том, что файл открывают для чтения. Вот ещё некоторые флаги, которые часто используются при работе с этим и некоторыми другими методами:

  • r+ — открыть файл для чтения и для записи.
  • w+ — открыть файл для чтения и для записи, установив указатель потока в начало файла. Если файл не существует — он создаётся.
  • a — открыть файл для записи, установив указатель потока в конец файла. Если файл не существует — он создаётся.
  • a+ — открыть файл для чтения и записи, установив указатель потока в конец файла. Если файл не существует — он создаётся.


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

Данные о файлах

С каждым файлом связан набор данных о нём, исследовать эти данные можно средствами Node.js. В частности, сделать это можно, используя метод stat() из модуля fs .

Вызывают этот метод, передавая ему путь к файлу, и, после того, как Node.js получит необходимые сведения о файле, он вызовет коллбэк, переданный методу stat() . Вот как это выглядит:


В Node.js имеется возможность синхронного получения сведений о файлах. При таком подходе главный поток блокируется до получения свойств файла:


Информация о файле попадёт в константу stats . Что это за информация? На самом деле, соответствующий объект предоставляет нам большое количество полезных свойств и методов:

  • Методы .isFile() и .isDirectory() позволяют, соответственно, узнать, является ли исследуемый файл обычным файлом или директорией.
  • Метод .isSymbolicLink() позволяет узнать, является ли файл символической ссылкой.
  • Размер файла можно узнать, воспользовавшись свойством .size .

Пути к файлам в Node.js и модуль path

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

В Linux и macOS путь может выглядеть так:


В Windows пути выглядят немного иначе:


На различия в форматах записи путей при использовании разных операционных систем следует обращать внимание, учитывая операционную систему, используемую для развёртывания Node.js-сервера.

В Node.js есть стандартный модуль path , предназначенный для работы с путями к файлам. Перед использованием этого модуля в программе его надо подключить:

▍Получение информации о пути к файлу

Если у вас есть путь к файлу, то, используя возможности модуля path , вы можете, в удобном для восприятия и дальнейшей обработки виде, узнать подробности об этом пути. Выглядит это так:


Здесь, в строке notes , хранится путь к файлу. Для разбора пути использованы следующие методы модуля path :

  • dirname() — возвращает родительскую директорию файла.
  • basename() — возвращает имя файла.
  • extname() — возвращает расширение файла.

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

Несколько частей пути можно объединить, используя метод path.join() :


Найти абсолютный путь к файлу на основе относительного пути к нему можно с использованием метода path.resolve() :


В данном случае Node.js просто добавляет /flavio.txt к пути, ведущем к текущей рабочей директории. Если при вызове этого метода передать ещё один параметр, представляющий путь к папке, метод использует его в качестве базы для определения абсолютного пути:


Если путь, переданный в качестве первого параметра, начинается с косой черты — это означает, что он представляет собой абсолютный путь.


Вот ещё один полезный метод — path.normalize() . Он позволяет найти реальный путь к файлу, используя путь, в котором содержатся спецификаторы относительного пути вроде точки ( . ), двух точек ( .. ), или двух косых черт:


Методы resolve() и normalize() не проверяют существование директории. Они просто находят путь, основываясь на переданным им данным.

Чтение файлов в Node.js

Самый простой способ чтения файлов в Node.js заключается в использовании метода fs.readFile() с передачей ему пути к файлу и коллбэка, который будет вызван с передачей ему данных файла (или объекта ошибки):


Если надо, можно воспользоваться синхронной версией этого метода — fs.readFileSync() :


По умолчанию при чтении файлов используется кодировка utf8 , но кодировку можно задать и самостоятельно, передав методу соответствующий параметр.

Методы fs.readFile() и fs.readFileSync() считывают в память всё содержимое файла. Это означает, что работа с большими файлами с применением этих методов серьёзно отразится на потреблении памяти вашим приложением и окажет влияние на его производительность. Если с такими файлами нужно работать, лучше всего воспользоваться потоками.

Запись файлов в Node.js

В Node.js легче всего записывать файлы с использованием метода fs.writeFile() :


Есть и синхронная версия того же метода — fs.writeFileSync() :


Эти методы, по умолчанию, заменяют содержимое существующих файлов. Изменить их стандартное поведение можно, воспользовавшись соответствующим флагом:


Тут могут использоваться флаги, которые мы уже перечисляли в разделе, посвящённом дескрипторам. Подробности о флагах можно узнать здесь.

Присоединение данных к файлу

Метод fs.appendFile() (и его синхронную версию — fs.appendFileSync() ) удобно использовать для присоединения данных к концу файла:

Об использовании потоков

Выше мы описывали методы, которые, выполняя запись в файл, пишут в него весь объём переданных им данных, после чего, если используются их синхронные версии, возвращают управление программе, а если применяются асинхронные версии — вызывают коллбэки. Если вас такое состояние дел не устраивает — лучше будет воспользоваться потоками.

Работа с директориями в Node.js

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

▍Проверка существования папки

Для того чтобы проверить, существует ли директория и может ли Node.js получить к ней доступ, учитывая разрешения, можно использовать метод fs.access() .

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

Для того чтобы создавать новые папки, можно воспользоваться методами fs.mkdir() и fs.mkdirSync() :

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

Для того чтобы прочесть содержимое папки, можно воспользоваться методами fs.readdir() и fs.readdirSync() . В этом примере осуществляется чтение содержимого папки — то есть — сведений о том, какие файлы и поддиректории в ней имеются, и возврат их относительных путей:


Вот так можно получить полный путь к файлу:


Результаты можно отфильтровать для того, чтобы получить только файлы и исключить из вывода директории:

▍Переименование папки

Для переименования папки можно воспользоваться методами fs.rename() и fs.renameSync() . Первый параметр — это текущий путь к папке, второй — новый:


Переименовать папку можно и с помощью синхронного метода fs.renameSync() :

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

Для того чтобы удалить папку, можно воспользоваться методами fs.rmdir() или fs.rmdirSync() . Надо отметить, что удаление папки, в которой что-то есть, задача несколько более сложная, чем удаление пустой папки. Если вам нужно удалять такие папки, воспользуйтесь пакетом fs-extra, который весьма популярен и хорошо поддерживается. Он представляет собой замену модуля fs , расширяющую его возможности.

Метод remove() из пакета fs-extra умеет удалять папки, в которых уже что-то есть.

Установить этот модуль можно так:


Вот пример его использования:


Его методами можно пользоваться в виде промисов:


Допустимо и применение конструкции async/await:

Модуль fs

Выше мы уже сталкивались с некоторыми методами модуля fs , применяемыми при работе с файловой системой. На самом деле, он содержит ещё много полезного. Напомним, что он не нуждается в установке, для того, чтобы воспользоваться им в программе, его достаточно подключить:


После этого у вас будет доступ к его методам, среди которых отметим следующие, некоторые из которых вам уже знакомы:

  • fs.rename()
  • fs.renameSync()
  • fs.write()
  • fs.writeSync()

В Node.js 10 имеется экспериментальная поддержка этих API, основанных на промисах.

Исследуем метод fs.rename() . Вот асинхронная версия этого метода, использующая коллбэки:


При использовании его синхронной версии для обработки ошибок используется конструкция try/catch :


Основное различие между этими вариантами использования данного метода заключается в том, что во втором случае выполнение скрипта будет заблокировано до завершения файловой операции.

Модуль path

Модуль path, о некоторых возможностях которого мы тоже уже говорили, содержит множество полезных инструментов, позволяющих взаимодействовать с файловой системой. Как уже было сказано, устанавливать его не нужно, так как он является частью Node.js. Для того чтобы пользоваться им, его достаточно подключить:


Свойство path.sep этого модуля предоставляет символ, использующийся для разделения сегментов пути ( \ в Windows и / в Linux и macOS), а свойство path.delimiter даёт символ, используемый для отделения друг от друга нескольких путей ( ; в Windows и : в Linux и macOS).

Рассмотрим и проиллюстрируем примерами некоторые методы модуля path .

▍path.basename()

Возвращает последний фрагмент пути. Передав второй параметр этому методу можно убрать расширение файла.

▍path.dirname()

Возвращает ту часть пути, которая представляет имя директории:

▍path.extname()

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

▍path.isAbsolute()

Возвращает истинное значение если путь является абсолютным:

▍path.join()

Соединяет несколько частей пути:

▍path.normalize()

Пытается выяснить реальный путь на основе пути, который содержит символы, использующиеся при построении относительных путей вроде . , .. и // :

▍path.parse()

Преобразует путь в объект, свойства которого представляют отдельные части пути:

  • root : корневая директория.
  • dir : путь к файлу, начиная от корневой директории
  • base : имя файла и расширение.
  • name : имя файла.
  • ext : расширение файла.


В результате его работы получается такой объект:

▍path.relative()

Принимает, в качестве аргументов, 2 пути. Возвращает относительный путь из первого пути ко второму, основываясь на текущей рабочей директории:

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