Lua модуль fio - AnaNek/tarantool GitHub Wiki
Для работы с файловой системы из тарантула в него включен модуль fio
local fio = require 'fio'
local fh = fio.open(path, 'O_RDONLY')
local data = fh:read(1024)
fh:close()
Все операции выполняются асинхронно. API практически полностю соответствует семантике POSIX/syscalls:
Общие функции
Работа с именами файлов
pathjoin
local path = fio.pathjoin('/etc', 'default', 'myfile')
Собирает путь к файлу из частей.
basename
local name = fio.basename('/path/to/my.lua', '.lua')
Выделяет из пути базовое имя точки и удаляет из нее суффикс (если таковой передан).
Работа с файловой системой
umask
umask(tonumber('755', 8))
Изменяет дефолтные права текущего процесса.
Подробности см в man 2 umask
lstat, stat
local stat = fio.lstat('/path/to/file')
Возвращает информацию о файловом объекте. Возвращается в виде таблицы
с полями: dev
, inode
, mode
, nlink
, uid
, gid
, rdev
, size
,
blksize
, blocks
, ctime
, mtime
, atime
.
Подробнее см man 2 lstat
и man 2 stat
.
mkdir
, rmdir
if fio.mkdir('/path/to/dir', tonumber('0755', 8)) then
...
else
error(errno.strerror())
end
if fio.rmdir('/path/to/dir') then
...
else
error(errno.strerror())
end
Создание или удаление директории. Функции возвращают true
или false
в
зависимости от успешности.
Подробнее смотри в man 2 mkdir
, man 2 rmdir
.
glob
local list = fio.glob('/etc/*')
Читает список файлов из директории по маске. Подробнее см. в man 3 glob
.
Список строится с единственным флагом, управляющим поведением функции:
GLOB_NOESCAPE
.
Возвращает список файлов или nil
в случае неудачи.
link, symlink, readlink, unlink
Функции для работы с файловыми ссылками.
if fio.link('file1', 'newpath') then
...
end
fio.symlink('file1', 'newpath2')
local object = fio.readlink('file1')
fio.unlink('file1')
Функции создания и удаления ссылок возвращают true
, false
в
зависимости от успеха.
readlink
возвращает прочитанную ссылку или nil
в случае неудачи.
Подробнее см. в man 2 readlink
, man 2 link
, man 2 symlink
, man 2 unlink
.
rename
Функция переименования объекта в файловой системе.
if fio.rename('file1', 'newname') then
...
end
Подробнее см. man 2 rename
. Возвращает true
или false
в зависимости
от успешности операции.
chown, chmod
Управление правами на файловые объекты, а так же изменение владельца объекта.
Возвращают true
или false
в зависимости от успеха.
Подробнее смотри в man 2 chown
и man 2 chmod
.
Важно: chown
в качестве аргумента может принимать как числа (uid
, gid
),
так и названия групп или имена пользователей. Например:
fio.chmod(path, tonumber('0755', 8))
fio.chown(path, 'root', 'admin')
truncate
Обрезание файла до заданной величины.
fio.truncate(path, size)
Возвращает true
, false
в зависимости от успешности.
Подробнее см. в man 2 truncate
.
sync
Синхронизация дисковых изменений. Подробнее см. man 2 sync
.
fio.sync()
Работа с файлами
Файл открывается при помощи функции open
.
local fh = fio.open(path, flags, mode)
Где flags
- это флаги с которыми нужно открыть файл. Это могут быть
как непосредственно переданное число, так и один или несколько текстовых
констант: O_RDONLY
, O_WRONLY
, O_RDWR
и так далее.
Если нужно указать более одного флага - они объединяются в таблицу:
local fh = fio.open(path, { 'O_RDWR', 'O_APPEND' })
Функция возвращает файловый объект, либо nil
в случае ошибки.
Методы файлового объекта
close
Закрытие объекта.
fh:close()
Возвращает true
, false
в зависимости от успешности.
Подробнее см. man 2 close
.
pread, pwrite
Чтение/запись с произвольным доступом (не влияет на текущую позицию
seek
в файле).
local data = fh1:pread(len, offset)
fh2:pwrite(data, offset)
pwrite
возвращает true
, false
в зависимости от успешности.
pread
возвращает прочитанные данные или nil
в случае неудачи.
Подробнее см. man 2 pread
, man 2 pwrite
.
read, write
Обычные чтение и запись. Подробности см. в man 2 read
и man 2 write
.
local header = fh1:read(10)
local body = fh1:read(20)
fh3:write(header .. subheader .. body)
read
возвращает прочитанные данные или nil
в случае неудачи.
write
возвращает true
или false
в зависимости от успешности.
Важно: поскольку эти методы влияют на позицию seek
внутри файла, то
следовательно при работе с одним файлом из множества разных файберов
Вам необходимо это учитывать. При необходимости используйте fiber.ipc
для
ограничения одновременного доступа к одному файлу из разных файберов.
truncate
Изменение размера открытого файла. Подробности см. в man 2 ftruncate
.
Возвращает true
, false
в зависимости от успешности.
fh1:truncate()
fh2:truncate(10)
seek
Сдвиг позиции в файле к указанной.
fh1:seek(0, 'SEEK_END')
fh2:seek(123, 'SEEK_SET')
fh3:seek(123) -- the same
fh4:seek(123, 'SEEK_CUR')
Подробнее см. man 2 lseek
.
Возвращает итоговую позицию внутри файла или nil
в случае неудачи.
stat
То же что и fio.stat
только на открытом файле.
Возвращает таблицу, описывающую параметры открытого файла.
Подробнее см. man 2 fstat
.
local stat = fh:stat()
fsync, fdatasync
Синхронизация содержимого кешей файла с диском.
Подробнее см. man 2 fsync
и man 2 fdatasync
.
fh:fsync()
fh:fdatasync()