Перейти к основному содержимому

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

Введение​

В полиглотном backend-коде платформы Netuno мы можем работать с любым файлом или папкой.

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

В платформе Netuno есть возможности low-code программирования, которые позволяют работать с папками и файлами внутри приложения, а также с любыми файлами и папками системы в целом, то есть вне приложения.

Это полезно, когда нам нужно автоматизировать какой-либо процесс, который должен работать с каким-либо файлом; давайте посмотрим как.

Возможности полиглотного low-code программирования, которые позволяют работать с файлами:

Через эти ресурсы у нас есть методы для:

  • .file - Существующий файл.
  • .folder - Существующая папка.
  • .path - Общий путь, который может быть как файлом, так и папкой, существующим или несуществующим.

С помощью этих методов мы получаем объект типа File, который предоставляет все средства для работы с файлами, папками и путями в целом, что позволяет выполнять такие операции, как:

  • Создавать файлы и папки.
  • Удалять файлы и папки.
  • Выводить список содержимого папок.
  • Переименовывать файлы и папки.
  • Читать и записывать данные в файлы.
  • Рекурсивно удалять папки и их соответствующие подпапки и файлы.

Приложение​

Чтобы выполнить основные операции работы с файлами и папками внутри структуры приложения, используем ресурс _app:

Папки в приложении​

Гарантирует получение существующей папки, например:

const мояПапка = _app.folder("моя/папка")

Файлы в приложении​

Гарантирует получение существующего файла, например:

const мойФайл = _app.file("моя/папка/файл.txt")

Пути в приложении​

Получает путь файла или папки независимо от того, существует он или нет, например:

const новыйФайл = _app.path("моя/папка/новый-файл.txt")

Storage​

Чтобы выполнить основные операции работы с файлами и папками внутри папки 📁 storage приложения, используем ресурс _storage:

Папки в Storage​

Гарантирует получение существующей папки, например:

// Реальный путь папки будет:
// storage/filesystem/server/моя/папка
const storageМояПапка = _storage.filesystem("server", "моя/папка")
const мояПапка = storageМояПапка.folder()

Файлы в Storage​

Гарантирует получение существующего файла, например:

// Реальный путь файла будет:
// storage/filesystem/server/моя/папка/файл.txt
const storageФайл = _storage.filesystem("server", "моя/папка", "файл.txt")
const файл = storageФайл.file()

Пути в Storage​

Получает путь файла или папки независимо от того, существует он или нет, например:

// Реальный путь новой папки будет:
// storage/filesystem/server/моя/новая-папка
const storageПапка = _storage.filesystem("server", "моя/новая-папка")
const папка = storageПапка.path()

// Реальный путь нового файла будет:
// storage/filesystem/server/моя/папка/новый-файл.txt
const storageФайл = _storage.filesystem("server", "моя/папка", "новый-файл.txt")
const файл = storageФайл.path()

Операционная система​

Чтобы выполнить основные операции работы с файлами и папками в любом месте операционной системы, используем ресурс _os:

Папки в операционной системе​

Гарантирует получение существующей папки, например:

const мояПапка = _os.folder("/tmp/моя/папка")

Файлы в операционной системе​

Гарантирует получение существующего файла, например:

const мойФайл = _os.file("/tmp/моя/папка/файл.txt")

Пути в операционной системе​

Получает путь файла или папки независимо от того, существует он или нет, например:

const новыйФайл = _os.path("/tmp/моя/папка/новый-файл.txt")

Создание папок​

Метод mkdir создаёт папку.

В следующем примере создаётся указанная папка в корне приложения:

const папка = _app.path("временная")
папка.mkdir()

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

const подпапка = _app.path("временная/другая")
подпапка.mkdir()

А mkdirs создаёт предыдущие папки и/или подпапки, если они не существуют, поэтому позволяет создать структуру папок в приложении, например:

const путьПапок = _app.path("временная/a/b/c")
путьПапок.mkdirs()

У ресурса _storage есть метод ensurePath, который проверяет, существует ли путь, и если нет, то создаёт:

const файл = _storage.filesystem(
"public",
"временная/подпапка",
"файл.txt"
)
// Создаёт структуру папок, если она не существует:
файл.ensurePath()

Таким образом, ensurePath гарантирует, что структура папок существует.

Удаление файлов и папок​

С помощью метода delete мы можем удалять как папки, так и файлы, при этом папки должны быть пустыми, смотрите пример:

// Удаляет пустую папку:
const пустаяПапка = _app.folder("папка/пустая")
пустаяПапка.delete()

// Удаляет файл:
const файл = _app.file("папка/файл.txt")
файл.delete()

// Удаляет путь, пустую папку или файл:
const путь = _app.path("папка1/файл-или-пустая-папка")
путь.delete()

С помощью deleteAll можно удалить всё, то есть все файлы, папки и подпапки рекурсивно:

// Удаляет папку и всё содержимое рекурсивно:
const пустаяПапка = _app.folder("папка/пример")
пустаяПапка.deleteAll()

// Удаляет путь папки и всё её внутреннее содержимое,
// включая подпапки и файлы:
const путь = _app.path("путь/папка")
путь.deleteAll()

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

// Удаляет файлы только внутри папки:
const папка = _app.folder("папка/пример")
папка.deleteFiles()

// Удаляет файлы с расширением JPG только внутри папки:
const путь = _app.path("путь/папка")
путь.deleteFiles("jpg")

Чтобы удалить только файлы рекурсивно и сохранить структуру папок, есть deleteAllFiles, который также позволяет передать расширение, если нужно удалить только определённый тип файлов, смотрите эти два примера:

// Удаляет все файлы внутри папки и подпапок:
const папка = _app.folder("папка/пример")
папка.deleteAllFiles()

// Удаляет все файлы с расширением JPG внутри папки и подпапок:
const путь = _app.path("путь/папка")
путь.deleteAllFiles("jpg")

Переименование или перемещение​

Чтобы переместить папку, это то же самое, что переименовать её:

const папка = _app.folder("временная")
папка.renameTo("тест")

Чтобы переименовать папку и изменить её уровень в иерархии папок, это то же самое, что переместить папку:

const папка = _app.folder("временная/a/b")
папка.renameTo("тест/z")

А чтобы переместить подпапку без изменения её имени, достаточно указать новый путь в методе renameTo:

const папка = _app.folder("тест/другая")
папка.renameTo("новая")

Сохранение содержимого в файлы​

Генерация содержимого в файлах выполняется через метод output, который предоставляет объект типа OutputStream.

Чтобы записать данные в output, используем метод printAndClose, который записывает содержимое в файл и закрывает файл, сохраняя содержимое.

Запись текстового файла​

Смотрите пример того, как создать файл с текстовым содержимым:

_app.path("временная").mkdir()
const запись = _app.path("временная/файл.txt").output()
запись.printAndClose("Мой текст здесь...")

Всякий раз, когда мы используем output, создаётся новый файл, поэтому если выполнить код снова, файл будет создан заново.

Запись файла JSON​

Смотрите, как можно сохранять данные JSON в файлы:

_app.path("временная").mkdir()
const запись = _app.path("временная/клиент.json").output()
запись.printAndClose(
_val.map()
.set("имя", "Мария Иоакина")
.set(
"записи",
_val.list()
.add(1).add(2).add(3)
)
.toJSON()
)

Чтобы сгенерировать JSON с отступами, то есть отформатированный в несколько строк и с табуляцией, можно передать количество пробелов, которые будут использоваться для табуляции, например .toJSON(4).

Подробнее о методе toJSON в Values.

Чтение содержимого из файлов​

Получение содержимого файлов выполняется через метод input, который предоставляет объект типа InputStream.

Чтобы прочитать данные в input, используем метод readAllAndClose, который обрабатывает чтение содержимого файла и закрывает файл.

Чтение текстового файла​

Смотрите пример того, как прочитать файл и получить текстовое содержимое:

const файл = _app.file("временная/файл.txt")
const чтение = файл.input()
_log.info(чтение.readAllAndClose())

Чтение файла JSON​

Смотрите, как можно обрабатывать данные JSON, полученные из файлов:

const файл = _app.file("временная/файл.txt")
const чтение = файл.input()
const данные = _val.fromJSON(чтение.readAllAndClose())
_log.info("Данные файла:", данные)

Подробнее о методе fromJSON ресурса Val.

Особенности Storage​

У ресурса storage есть несколько методов для прямого использования.

Например, мы можем получить через storage:

Это означает, что нам не нужно получать file или path, чтобы работать с input или output.

Запись текстового файла в Storage​

При инициализации storage для файла мы можем выполнять запись с помощью метода output, который получает экземпляр объекта OutputStream, позволяющий обрабатывать и читать данные.

Тогда с OutputStream метод printAndClose записывает текст (string) в файл и закрывает его.

Смотрите этот пример:

const текст = _storage.filesystem("server", "временная", "файл.txt")
текст.ensurePath()
текст.output().printAndClose("Мой текст здесь...")

Чтение текстового файла в Storage​

При инициализации storage для файла мы можем выполнять чтение с помощью метода input, который получает экземпляр объекта InputStream, позволяющий обрабатывать и читать данные.

Тогда с InputStream метод readAllAndClose читает весь файл и закрывает его, возвращая данные как текст (string).

Смотрите этот пример:

const текст = _storage.filesystem("server", "временная", "файл.txt")
_log.info(текст.input().readAllAndClose())

Создание случайного файла в Storage​

Ресурс _storage позволяет генерировать случайные имена файлов с помощью метода newRandomFile.

Нужно инициализировать storage для пути папки, и при выполнении метода newRandomFile передаётся расширение нужного файла.

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

Смотрите, как сгенерировать файл с расширением TXT со случайным именем:

const папка = _storage.filesystem("server", "временная")
const файл = папка.newRandomFile("txt")
файл.output().printAndClose("Мой текст здесь...")

Заключение​

С полиглотным low-code фреймворком Netuno мы можем выполнять все основные операции с папками и файлами напрямую.

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

  • _app - Приложение
  • _storage - Storage приложения
  • _os - Операционная система

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

Netuno обрабатывает автоматическое закрытие input и output в конце обработки сервисов, но по лучшим практикам мы должны стараться всегда закрывать их.