# Файлы и папки доменов

Чтобы управлять файлами и папками в пределах домена, используйте класс pm_FileManager. Этот класс позволяет создавать и удалять файлы и папки, проверять наличие файлов и папок, читать и записывать данные в файлы, а также изменять права файлов и папок (только в Linux).

Примечание

Из соображений безопасности мы настоятельно не рекомендуем вам использовать системные вызовы, такие как fopen или file_get_contents, в коде вашего расширения. Когда вы используете такие вызовы, расширение работает с файлами от имени пользователя `psaadm`. Если же вы используете класс pm_FileManager, действия выполняются от имени системного пользователя владельца домена.

Описания и примеры использования некоторых методов приведены ниже.

scanDir() – возвращает список файлов и папок внутри папки по указанному пути.

## Использование

    array scanDir(string $path [, bool $skipDots = false [, bool $showSystemFiles = true ]])

## Параметры

- path (тип: string)

  Папка, которая будет просканирована.

- skipDots (тип: boolean, значение по умолчанию: false)

  Если для необязательного параметра skipDots задано значение «true», корневые папки «..» и «.» будут исключены из результирующего массива, иначе они будут включены в него.

- showSystemFiles (тип: boolean, значение по умолчанию: true)

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

## Возвращаемые значения

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

## Примеры

Дерево папок

    $ ls -a var
    .  ..  config.json  .gitkeep

Пример

    $result = (new \pm_FileManager())->scanDir(\pm_Context::getVarDir()); // Default use
    // analogue:
    // $result = (new \pm_FileManager())->scanDir(\pm_Context::getVarDir(), false, true);
    var_dump($result);

Вывод

    array(4) {
      [0]=>
      string(1) "."
      [1]=>
      string(2) ".."
      [2]=>
      string(11) "config.json"
      [3]=>
      string(8) ".gitkeep"
    }

Пример

    $result = (new \pm_FileManager())->scanDir(\pm_Context::getVarDir(), true);
    // analogue:
    // $result = (new \pm_FileManager())->scanDir(\pm_Context::getVarDir(), true, true);
    var_dump($result);

Вывод

    array(2) {
      [0]=>
      string(11) "config.json"
      [1]=>
      string(8) ".gitkeep"
    }

Пример

    $result = (new \pm_FileManager())->scanDir(\pm_Context::getVarDir(), false, false);
    var_dump($result);

Вывод

    array(3) {
      [0]=>
      string(1) "."
      [1]=>
      string(2) ".."
      [2]=>
      string(11) "config.json"
    }

Пример

    $result = (new \pm_FileManager())->scanDir(\pm_Context::getVarDir(), true, false);
    var_dump($result);

Вывод

    array(1) {
      [0]=>
      string(11) "config.json"
    }

joinPath() – возвращает объединенные части пути.

## Использование

    string joinPath(string ...$pathParts)

## Параметры

- pathParts (тип: string, можно указать одно или больше значений)

## Возвращаемые значения

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

## Пример

    $result = (new \pm_FileManager())->joinPath('var', 'config', 'config.json');
    var_dump($result);

Вывод

    string(22) "var/config/config.json"

isSubpath() – проверяет, является ли папка по указанному пути подпапкой корневой папки веб-пространства.

## Использование

    bool isSubpath(string $path)

## Параметры

- path (тип: string)

## Возвращаемые значения

«True» – если папка находится внутри основной папки, иначе – «false».

## Примеры

Пример

    $result = (new \pm_FileManager())->isSubpath('/var/www/vhosts/a.a/httpdocs/qwe/qwe/ddd/wqecfds');
    var_dump($result);

Вывод

    bool(true)

Пример

    // assuming that the webspace document root is '/var/www/vhosts/a.a/'
    $result1 = (new \pm_FileManager(1))->isSubpath('/var/www/vhosts/a.a/httpdocs/qwe/qwe/ddd/wqecfds');
    $result2 = (new \pm_FileManager(1))->isSubpath('/var/www/vhosts/b.b/httpdocs/qwe/qwe/ddd/wqecfds');
    var_dump($result1);
    var_dump($result2);

Вывод

    bool(true)
    bool(false)

getRelativeFilePath() – возвращает путь относительно корневой папки веб-пространства для указанного абсолютного пути.

## Использование

    string getRelativeFilePath(string $path)

## Параметры

- path (тип: string, абсолютный путь)

## Возвращаемые значения

Относительный путь в корневой папке.

## Примеры

Пример

    $result = (new \pm_FileManager())->getRelativeFilePath('/var/www/vhosts/a.a/httpdocs/qwe/qwe/ddd/wqecfds');
    var_dump($result);

Вывод

    string(47) "var/www/vhosts/a.a/httpdocs/qwe/qwe/ddd/wqecfds"

Пример

    // assuming that webspace document root is '/var/www/vhosts/a.a/'
    $result1 = (new \pm_FileManager(1))->getRelativeFilePath('/var/www/vhosts/a.a/httpdocs/qwe/qwe/ddd/wqecfds');
    $result2 = (new \pm_FileManager(1))->getRelativeFilePath('/var/www/vhosts/b.b/httpdocs/qwe/qwe/ddd/wqecfds');
    var_dump($result1);
    var_dump($result2);

Вывод

    string(28) "httpdocs/qwe/qwe/ddd/wqecfds"
    string(35) "../b.b/httpdocs/qwe/qwe/ddd/wqecfds"

copyFile() – копирует объекты файловой системы (файлы и папки) из исходной папки в целевую. Папки копируются рекурсивно.

## Использование

    copyFile(string $source, string $destination)

## Параметры

- source (тип: string, полный путь к исходной папке)

- destination (тип: string, полный путь к целевой папке)

## Пример

    (new \pm_FileManager())->copyFile('/tmp/source', '/tmp/destination');

Ниже приводится пример работы с файлами домена. В этом примере выполняются некоторые действия с содержимым файла. Используются следующие методы:

- getFilePath()

- fileExists()

- fileGetContents()

- filePutContents()

Используйте следующий код:

    $fileManager = new pm_FileManager($domainId);
    $filePath = $fileManager->getFilePath("$currentDir/$file");
    if ($fileManager->fileExists($filePath)) {
        $fileData = $fileManager->fileGetContents($filePath);
        // Some manipulation with file data...
        $fileData = str_replace('foo', 'bar', $fileData);

        $fileManager->filePutContents($filePath, $fileData);
    }

Здесь `$filePath` – абсолютный путь. Он получен из относительного пути в папке домена `$currentDir` с помощью вызова метода getFilePath().