[редактировать]

Файловая система


Как реализовать log файл или дописывать строчку в файл?

Простой способ дописать в файл данные, например текст.

Используйте для этого класс php\io\Stream или функцию file_put_contents, например так:

use php\io\Stream;

Stream::putContents("app.log", "New text line\r\n", "a+");
// или 
file_put_contents('app.log', "New text line\r\n", FILE_APPEND);

Обратите внимание, что \r\n это символ переноса строки, а a+ это режим дописывания в файл, FILE_APPEND - это константа, которая указывает, что в файл нужно дописать данные, а не перезаписать все с нуля.


Как получить текущий путь к программе?

Простой способ получить полный путь к запущенной программе.

Используйте сочетание ./ в пути к файлам, это является рабочей папкой программы.

Если хотите все таки получить реально полный путь к программе, используйте следующий код:

use php\lib\fs;

alert(fs::abs('./'));

Метод fs::abs() возвращает абсолютный реальный путь.


Как записать текст в файл?

Простой способ записи любой текстовой информации в файл.

Для записи в файл вы можете использовать класс php\io\Stream или file_put_contents функцию.

use php\io\Stream;
use php\io\IOException;

try {
   Stream::putContents("data.txt", $this->edit->text);
} catch (IOException $e) {
   alert('Ошибка записи: ' . $e->getMessage());
}

Или вы можете воспользоваться старым апи для записи в файл:

$success = file_put_contents("data.txt", $this->edit->text);

if ($success === false) {
    alert('Ошибка записи');
}

Внимание, запись будет невозможна, если вы попытаетесь записать в новый файл в папку, которой еще не существует!


Как проверить папку или файл на существование?

Используйте класс php\lib\fs и его методы для проверки существования файлов и папок:

  • Существование файла и папки
use php\lib\fs;

if (fs::exists("readme.txt")) {
    alert('Файл/папка существует');
}
  • Это точно файл, а не папка?
use php\lib\fs;

if (fs::isFile("readme.txt")) {
    alert('Файл существует и это действительно файл, а не папка');
}
  • Это точно папка, а не файл?
use php\lib\fs;

if (fs::isDir("D:/skins/sample/directory")) {
    alert('Папка существует и это действительно папка, а не файл');
}

Как удалить файл?

Удаление файлов и пустых папок.

Используйте php\io\File или функцию unlink():

use php\io\File;

$file = new File("readme.txt");

if ($file->delete()) {
    alert('Файл успешно удален');
} else {
    alert('Ошибка удаления');
}

Также этот метод может удалить и папку, но только если в ней нет других папок и файлов!

Или через unlink без проверки на удаление:

unlink('readme.txt');

Как получить расширение файла?

Способ получения расширения файла по его названию.

Для этого используйте метод fs::ext().

use php\lib\fs;

$ext = fs::ext('file.txt');

Внимание, этот метод появился начиная с develnext alpha-4.

В результате в переменной $ext будет находится txt, т.е. расширение нашего файла.


Как получить имя файла с расширением и без?

Получение имени файла с расширением и без.

Для этого используйте класс fs:

use php\lib\fs;

$name = fs::name('C:/Files/foobar.txt');
$nameNoExt = fs::nameNoExt('C:/Files/foobar.txt');

В результате:

  • в $name будет строка foobar.txt.
  • в $nameNoExt будет строка foobar.

Как создать папку?

Используйте стандартный класс php\io\File:

use php\io\File;

$dir = new File("C:/my_directory/foobar");

if ($dir->mkdirs()) {
    alert('Папка была успешно создана');
} else {
    alert('Ошибка создания папки');
}

Коротко, без проверки на ошибки можно написать и так:

use php\io\File;

$dir = new File("C:/my_directory/foobar");
$dir->mkdirs();

Альтернативный способ

Используйте класс для работы с файловой системой fs:

use php\lib\fs;

fs::makeDir('C:/my_directory/foobar');

Как узнать размер файла?

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

Используйте класс php\io\File:

use php\io\File;

$file = new File("data.bin");

$size = $file->length();

В переменной $size будет хранится число - размер файла в байтах, чтобы получить размер в килобайтах и выше, надо знать, что в 1 килобайте 1024 байт, в 1 мб - 1024 кб и т.д.

$sizeKb = $size / 1024; // в килобайтах.
$sizeMb = $size / 1024 / 1024; // в мегабайтах.
$sizeGb = $size / 1024 / 1024 / 1024; // в гигабайтах.

Вариант проще

Используйте класс fs:

use php\lib\fs;

$size = fs::size("data.bin");

В $size будет размер файла в байтах.


Как получить хеш MD5 или SHA1 для файла?

Используйте класс php\io\File, чтобы получить хеш файла:

use php\io\File;

$file = new File("data.bin");

$md5 = $file->hash('MD5');
$sha1 = $file->hash('SHA-1');
$sha256 = $file->hash('SHA-256');

Доступны следующие алгоритмы хеширования:

  • MD2
  • MD5
  • SHA-1
  • SHA-256
  • SHA-384
  • SHA-512

Как получить список директорий и файлов?

Для того, чтобы получить все файлы и папки по определенному пути, используйте класс php\io\File и его метод findFiles() или find():

use php\io\File;

$directory = new File('C:/Program Files/');

$list = $directory->findFiles();

Если хотите, чтобы в списке были только папки, используйте метод isDirectory или fs::isDir:

use php\io\File;
use php\lib\fs;

$directory = new File('C:/Program Files/');

$list = [];

foreach ($directory->findFiles() as $one) {
    if ($one->isDirectory()) { // или fs::isDir($one)
        $list[] = $one;
    }
}

В переменной $list будет массив папок и файлов.


Как получить список корневых дисков и рутовых директорий?

Описание способов получения списка локальных дисков в Windows или рутовых директорий в других ОС.

Для получения списка локальных дисков и рутовых директорий используйте метод listRoots() из класса php\io\File:

use php\io\File;

$list = File::listRoots();

В $list будет массив всех локальных дисков и рутовых директорий.
Обратите внимание, что не на всех ОС есть список рутовых директорий.


Как получить crc32 сумму файла?

Для этого используйте класс php\io\File и его метод crc32():

use php\io\File;

$file = new File('file.txt');
$crc = $file->crc32();

alert("Контрольная сумма file.txt = $crc");

Как очистить папку от всех файлов и под-папок?

Удаление всех файлов и папок внутри другой папки.

Для очищения всей папки используйте класс php\lib\fs и его метод clean:

use php\lib\fs;

fs::clean('D:/Files/MyDirectory');

Метод не удаляет саму папку, только все ее содержимое. Чтобы удалить саму папку, используйте дополнительно метод fs::delete().


Как полностью удалить всю папку?

Для удаления папки используйте класс php\lib\fs и его методы:

use php\lib\fs;

$dir = 'D:/Files/MyDirectory';

fs::clean($dir); // очищаем содержимое папки
fs::delete($dir); // удаляем саму папку

Как прочитать текстовый файл построчно?

Описание метода чтения файла строка за строкой, аналог функции file().

Для чтения строки построчно, используйте классы php\io\Stream и php\util\Scanner:

use php\io\Stream;
use php\util\Scanner;
use php\io\IOException;

try {
    $file = Stream::of('C:/file.txt');
    $scanner = new Scanner($file);

    $lines = [];

    while ($scanner->hasNextLine()) {
         $line = $scanner->nextLine();
         $lines[] = $line;
    }

    $file->close();
} catch (IOException $e) {
    alert('Ошибка чтения файла');
}

В данном примере мы читаем текст из file.txt построчно, занося каждую строку как элемент в массив $lines.

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

Более простой способ

Работает только начиная с DevelNext 16 RC-2!

$f = fopen('file.txt');
$f->eachLine(function ($line) {
    // каждая строка $line из file.txt
});
fclose($f);

Для всех классов Stream в DevelNext 16rc2 появился метод Stream::eachLine(), который представлен выше.

Функции f*() в JPHP оперируют не ресурсами, а объектами Stream, в отличии от оригинального PHP.