OpenComputers/Filesystem API
Этот интерфейс предоставляет основной способ взаимодействия с файловой системой компьютера. Каждый компонент располагается в своей собственной "папке". Он может быть "смонтирован" в какое-нибудь место главного дерева каталогов, что позволяет очень просто взаимодействовать с файловой системой компонентов.



## Интерфейс

`filesystem.isAutorunEnabled(): boolean`


Проверяет, доступен ли автозапуск. Если `true`

, то подключенные файловые системы будут проверяться на наличие файла названного `autorun[.lua]`

в корневой директории. Если такой файл будет обнаружен, система его запустит.



`filesystem.setAutorunEnabled(value: boolean)`


Определяет, разрешен ли автозапуск.



`filesystem.canonical(path: string): string`


Возвращает "каноническую" форму заданного пути. Т. е. не содержащую относительных путей вроде `.`

или `..`

. К примеру, пути `/tmp/../bin/ls.lua`

и `/bin/./ls.lua`

эквивалентны, и их каноническая форма — `/bin/ls.lua`

.

Обратите внимание, что эта функция обрезает путь до самой последней известной корневой папки. Например `../bin/ls.lua`

превратится в `bin/ls.lua`

. Путь остается относительным, однако без ведущего слеша.



`filesystem.concat(pathA: string, pathB: string[, ...]): string`


Соединяет (конкатенация) два или несколько путей. Обратите внимание, что все пути, кроме первого, обрабатываются как относительные, даже если начинаются со слеша. Возвращается каноническая форма полученного пути. То есть, `fs.concat("a", "..")`

вернет пустую строку.



`filesystem.path(path: string): string`


Вырезает из заданной строки путь к файлу. Т.е. все *до* последнего слеша в канонической записи пути.



`filesystem.name(path: string): string`


Вырезает из заданной строки имя файла. Т.е. все *после* последнего слеша в канонической записи этого пути.



`filesystem.proxy(filter: string): table or nil, string`


Эта функция похожа на `component.proxy`

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

. Возвращает прокси заданной файловой системы, либо `nil`

и сообщение об ошибке.



`filesystem.mount(fs: table or string, path: string): boolean or nil, string`


"Монтирует" файловую систему по указанному пути. Первым аргументом может быть прокси файловой системы, её адрес или метка. Второй аргумент — адрес в глобальном дереве каталогов (куда монтируется). Возвращает `true`

или `nil`

и текст ошибки.



`filesystem.mounts(): function -> table, string`


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



`filesystem.umount(fsOrPath: table or string): boolean`


"Размонтирует" файловую систему. Первый аргумент — это прокси, или адрес (сокращенный адрес) файловой системы. Во втором случае система будет "размонтирована" по всем путям. Либо путь в в глобальном дереве каталогов.



`filesystem.get(path: string): table, string or nil, string`


Возвращает прокси файловой системы по указанному пути. Возвращает прокси и путь, по которому смонтирована система, либо `nil`

и текст ошибки.



`filesystem.exists(path: string): boolean`


Проверяет, существует ли файл или папка по указанному пути.



`filesystem.size(path: string): number`


Возвращает размер файла по указанному пути. Возвращает `0`

если путь не указывает на файл.



`filesystem.isDirectory(path: string): boolean`


Проверяет, указывает ли путь на каталог. Возвращает `false`

в противном случае (путь указывает на файл, или `file.exists(path)`

возвращает `false`

).



`filesystem.lastModified(path: string): number`


Возвращает *реальное* (не игровое) время модификации файла по указанному адресу в формате Unix timestamp. Для папки это обычно время ее создания.



`filesystem.list(path: string): function -> string or nil, string`


Возвращает итератор всех элементов в указанной директории. Возвращает `nil`

и текст ошибки, если список получить не удалось.

*Примечание*: названия каталогов обычно дополняются в конце слешем, для того чтобы их можно было идентифицировать без дополнительного вызова `fs.isDirectory`

.



`filesystem.makeDirectory(path: string): boolean or nil, string`


Создает новый каталог по указанному пути. Создает все необходимые вложенные каталоги, если их не существовало до этого. Возвращает `true`

в случае успеха или `nil`

и сообщение об ошибке.



`filesystem.remove(path: string): boolean or nil, string`


Удаляет файл или каталог. Если путь указывает на каталог, рекурсивно удаляет все файлы и подкаталоги в нем. Возвращает `true`

в случае успеха, или `nil`

и сообщение об ошибке.



`filesystem.rename(oldPath: string, newPath: string): boolean or nil, string`


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

в случае успеха, или `nil`

и сообщение об ошибке.



`filesystem.copy(fromPath: string, toPath: string): boolean or nil, string`


Копирует файл в указанную папку. Целевой путь должен содержать имя файла. Не поддерживает каталоги.(не работает на OpenOs 1.7.5)



`filesystem.open(path: string[, mode: string]): table or nil, string`


Открывает файл по указанному адресу для чтения или записи. Режим открытия по умолчанию — `r`

.

Возможные режимы: `r`

, `rb`

, `w`

, `wb`

, `a`

и `ab`

.

Возвращает файловый поток (см. ниже) в случае успеха, или `nil`

и сообщение об ошибке.

*Примечание*: вы можете открыть только ограниченное количество файлов в каждой файловой системе одновременно. Файлы автоматически закрываются сборщиком мусора (garbage collector), но будет лучше если вы вызовете функцию `close`

по завершению работы с файлом.

**Важно**: очень рекомендуется использовать `io.open`

вместо этой функции, чтобы получить "обертку" с буфером (buffered wrapper) для файлового потока.



## Файловый поток

Когда вы открываете файл при помощи **Filesystem API**, вы получаете файловый поток — таблицу с четырьмя функциями. Эти функции — тонкая обертка к вызовам прокси файловой системы. Это означает, что операции чтения/записи не буферизованы, и могут работать медленно при чтении нескольких байт. Рекомендуется использовать `io.open`

вместо этого.



`file:close()`


Закрывает файловый поток и освобождает указатель на соответствующую файловую систему.



`file:read(n: number): string or nil, string`


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

. При возникновении ошибки возвращает `nil`

и её текст.



`file:seek(whence: string[, offset: number]): number or nil, string`


Перемещает указатель на заданную позицию в потоке, если это возможно. Функция доступна только для потоков открытых в режиме чтения. Первый аргумент определяет точку относительно которой происходит перемещение. Он может иметь значение `cur`

— текущее положение в потоке, `set`

— начало потока, `end`

— конец потока. Второй аргумент — смещение на новую позицию. Возвращает новое положение указателя в потоке, или `nil`

и сообщение об ошибке.

Второй аргумент по умолчанию равен `0`

, поэтому вызов `f:seek("set")`

переместит указатель на начало потока, `f:seek("cur")`

вернет текущее положение указателя.



`file:write(str: value): boolean or nil, string`


Пишет указанные данные в поток. Возвращает `true`

в случае успеха, или `nil`

и сообщение об ошибке.