Lua модуль fio - tsafin/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()