Lua существует ли файл

Обновлено: 04.07.2024

Библиотека ввода-вывода предоставляет два разных стиля интерфейсов обработки файлов. Первый стиль использует неявные дескрипторы файлов; он обеспечивает операции для установки файлов ввода по умолчанию и файлов вывода по умолчанию, и все операции ввода и вывода направлены на эти файлы по умолчанию. Второй стиль использует явные дескрипторы файлов.

При использовании неявных дескрипторов файлов все операции выполняются таблицей io. Если используется явный дескриптор файла, io.open вернет дескриптор файла, и все операции обеспечиваются методами дескриптора файла.

Таблица io также предоставляет три предопределенных дескриптора файлов с тем же значением, что и в C: io.stdin io.stdout io.stderr. Библиотека ввода-вывода никогда не закроет эти файлы.

io:open(filename [, mode])

  • ** "r": ** Режим только для чтения, который также является режимом открытия по умолчанию для существующих файлов.
  • ** "w": ** Режим с возможностью записи, позволяющий изменять существующие файлы и создавать новые файлы (нечитаемые).
  • ** "a": ** Режим добавления. Разрешено добавлять новое содержимое к существующему файлу, но не изменять исходное содержимое, а также можно создавать новые файлы.
  • ** "r +": ** Открыть существующий файл в режиме чтения-записи.
  • ** "w +": ** Если файл уже существует, удалите данные в файле; если файл не существует, создайте новый файл. Включен режим чтения и записи.
  • ** "a +": ** Откройте существующий файл в удобном для чтения режиме добавления, если файл не существует, создайте новый файл.

Строка режима может содержать букву «b» в конце, что в некоторых системах открывает файл в двоичном режиме.

Когда файл не существует

Режимы «r», «r +», выдадут ошибку, эти два режима не составит труда создать автоматически.
режим "a", "a +", "w", "w +" создаст файлы

Когда файл существует
Исходный файл:

Для разных режимов вызовите операции чтения и записи отдельно

режим "r"

Файл доступен для чтения, но не для записи

режим "г +"

Содержимое файла сохраняется, новое содержимое вводится из заголовка файла
читаемый

режим "w"

Перезаписать содержимое файла вводом
При открытии файла в режиме «w» содержимое файла будет немедленно удалено, даже если содержимое не записано.
При чтении в режиме "w" вернуть nil

режим "w +"

Перезаписать содержимое файла вводом
При открытии файла в режиме "w +" содержимое файла будет немедленно удалено.
При чтении в режиме "w +" возвращается пустая строка.

режим "а"

Добавить режим записи
не читается

режим "а +"

Добавить режим записи
читаемый

io:input([file])

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

io:output([file])

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

io.popen (prog [, mode])

Эта функция связана с системой, не все платформы ее предоставляют.

Запустите программу программы с отдельным процессом, и возвращенный дескриптор файла можно использовать для чтения данных из этой программы (если режим "r", это значение по умолчанию) или записи ввода в эту программу (когда режим "w" ).

io.tmpfile()

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

io.type(obj)

Проверьте, является ли obj допустимым дескриптором файла. Если obj - дескриптор открытого файла, возвращается строка «файл». Если obj является дескриптором закрытого файла, возвращается строка «закрытый файл». Если obj не является дескриптором файла, вернитеnil 。

io.lines([filename])

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

Примечание: Lua 5.3 имеет изменения, добавляющие количество режимов

file:lines()

Возвращает функцию итератора, каждый раз, когда вызывается итератор, из файла берется строка данных.В отличие от io.lines, эта функция не закрывает файл после завершения цикла.
Примечание: Lua 5.3 имеет изменения, добавляющие количество режимов

file:read(. )

Прочтите файл file, указанный формат определяет, что читать. Для каждого формата функция возвращает строку или число, соответствующие прочитанному символу. Если данные не могут быть прочитаны в этом формате, вернитеnil. (В этом последнем случае функция не будет читать последующий формат.) При вызове без формата она будет использовать формат по умолчанию для чтения следующей строки.

  • *"n ": ** Считывает число из текущей позиции файла и возвращает nil, если позиция не является числом.
  • *"l ": ** Прочитать текущую строку.
  • *"a ": ** Прочитать все содержимое файла, начиная с текущей позиции указателя файла.
  • number: Прочитать содержимое указанного количества байтов.

Примечание. В Lua 5.3 внесены изменения, убран знак * и добавлен формат «i» и «L».

io:read(. )

file:write(. )

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

io:write(. )

file:close()

Закройте файл. Обратите внимание, что файл будет автоматически закрыт, когда дескриптор будет обработан сборщиком мусора, но как долго это произойдет позже, непредсказуемо.

io:close()

Эквивалент файла: close (). Если файл не указан, выходной файл по умолчанию будет закрыт.

file:flush()

Сохраните записанные данные в файл

io:flush()

Эквивалентно io.output (): flush ().

file:seek([whence [, offset]])

Установите и получите позицию, рассчитанную на основе начала файла. Установленное положение определяется базовой точкой, заданной смещением и строкой откуда. Базовая точка может быть:

  • ** "набор": ** Базовая точка - 0 (начало файла);
  • ** "cur": ** Базовая точка - это текущая позиция;
  • ** «конец»: ** Базовая точка - это конец файла;

Когда поиск завершается успешно, возвращается позиция файла, окончательно рассчитанная с начала файла. Когда поиск не удается, вернитесьnil Добавьте строку описания ошибки.

Значение по умолчанию для параметра whence - "cur", а значение смещения по умолчанию - 0. Следовательно, вызов file: seek () может вернуть текущую позицию файла, не изменяя ее; вызов file: seek ("set") установит позицию в начало файла (и вернет 0); вызывающий file: seek ("end") будет Установите позицию в конец файла и верните размер файла.

Изменение значения файла повлияет на операцию чтения и операцию записи открытия файла в режиме "r +".

Как я могу проверить, существует ли файл с использованием Lua?

спросил(а) 2011-02-14T13:18:00+03:00 10 лет, 9 месяцев назад

но обратите внимание, что этот код проверяет, может ли файл быть открыт для чтения.

ответил(а) 2011-02-14T14:26:00+03:00 10 лет, 9 месяцев назад

Используя простой Lua, самое лучшее, что вы можете сделать, это посмотреть, можно ли открыть файл для чтения в соответствии с LHF. Это почти всегда достаточно хорошо. Но если вы хотите больше, загрузите Lua POSIX library и проверьте, возвращает ли posix.stat( путь ) не nil .

Я приведу себя из здесь

Я использую эти (но я действительно проверяю на ошибку):

os.rename(name1, name2) переименует имя1 в name2. Используйте одно и то же имя, и ничего не должно измениться (за исключением ошибки badass). Если все работает хорошо, оно возвращает true, иначе оно возвращает nil и errormessage. Если вы не хотите использовать lfs, вы не можете различать файлы и каталоги, не пытаясь открыть файл (который немного медленный, но нормально).

Итак, без LuaFileSystem

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

Получайте удовольствие от кодирования!

ответил(а) 2014-02-08T00:09:00+04:00 7 лет, 9 месяцев назад

Я использую LUA 5.3.4.

ответил(а) 2017-12-08T19:56:00+03:00 3 года, 11 месяцев назад

Если вы хотите использовать lfs , вы можете использовать lfs.attributes . Он вернет nil в случае ошибки:

Хотя он может возвращать nil для других ошибок, кроме несуществующего файла, если он не возвращает nil , файл, безусловно, существует.

Для полноты: вы также можете просто испытать удачу с помощью path.exists(filename) . Я не уверен, какие дистрибутивы Lua на самом деле имеют это пространство имен path (update: Penlight), но по крайней мере, он включен в факел:

debug.getinfo(path.exists) сообщает мне, что его источник находится в torch/install/share/lua/5.1/pl/path.lua , и он реализован следующим образом:

Ответ, который является только окнами, проверяет файлы и папки, а также не требует дополнительных пакетов. Он возвращает true или false .

Как проверить, существует ли каталог в lua, желательно без использования модуля LuaFileSystem, если это возможно?

попытка сделать что-то вроде этой строки python:

проблема в том, что дистрибутив Lua (почти) включает только функции, указанные в стандарте C. стандарт C не делает никаких предположений о том, что на самом деле существует файловая система любого конкретного вида (или даже операционная система, если на то пошло), поэтому os и io модули не предоставляют информацию о доступе, недоступную из стандартной библиотеки C.

Если бы вы пытались кодировать в чистом стандарте C, у вас было бы то же самое вопрос.

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

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

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

Это способ, который работает как на Unix, так и на Windows, без каких-либо внешних зависимостей:

Если вы специально заинтересованы в том, чтобы избежать библиотеки LFS,библиотека Lua Posix имеет интерфейс для stat ().

Ну, в справочном руководстве 5.1 ничего нет в ОС таблице, а если вы используете Nixstaller вы получаете os.fileexists именно то, что вы объяснили.

если вы можете позволить себе немного повозиться, или если вы знаете, на какой ОС вы будете работать, вам может сойти с рук стандартная библиотека ОС os.execute с некоторым системным вызовом, который определит, существует ли файл.

даже лучше, чем ОС.выполнение может быть ОС.переименовать:

os.rename(oldname, newname)

переименовывает по имени oldname to newname . Если эта функция не работает, она возвращает nil, плюс строка, описывающая ошибка.

вы можете попробовать установить oldname и newname то же самое-у вас может не быть прав на запись, поэтому он может потерпеть неудачу, потому что вы не можете писать, хотя вы can читать. В этом случае вам придется проанализировать возвращенную строку ошибки и вывести, есть ли у вас можно написать, или вам нужно просто попробовать выполнить свою функцию, которая нуждается в существующем файле, и обернуть ее в pcall .

Как я могу проверить, если файл существует через Луа?

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

Используя обычный Луа, лучшее, что вы можете сделать, это увидеть, если файл может быть открыт для чтения, как на ЛХФ. Это почти всегда достаточно хорош. Но если вы хотите больше, загрузить библиотека POSIX и Луа и проверить, если в POSIX.стат( путь ) возвращает номера- "ноль".

Я процитирую себя здесь

Я использую эти (но я на самом деле проверки на ошибки):

Так что без LuaFileSystem

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

Получайте удовольствие кодирование!

отладки.getinfo(путь.существует) - то подсказывает мне, что ее источник находится в факел/установка/доля/на Lua/5.1/ПЛ/путь.Луа и он реализуется следующим образом:

Если вы готовы использовать ОРС , можно использовать ОРС.атрибутов. Он будет возвращать Нил` в случае ошибки:

Ответ, который только проверяет Windows для файлов и папок, а также не требует дополнительных пакетов. Он возвращает true или false .

при наличии - cmd в команду, чтобы проверить, если объект существует

(Эхо-1) - печать 1 в stdout из командной строки

Затем в Lua сделать:

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

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

возвращать логическое значение, указывающее, является ли путь указывает на существующий файл.

возвращать логическое значение, указывающее, является ли путь указывает на существующий каталог.

Хотя названия немного странные, вы, конечно, можете использовать пути.филепа () , чтобы проверить, существует ли путь и файл. Используйте пути.dirp ()`, чтобы проверить, действительно ли она существует и является каталогом. Очень удобно.

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