Файловая система
- Как реализовать log файл или дописывать строчку в файл?
- Как получить текущий путь к программе?
- Как записать текст в файл?
- Как проверить папку или файл на существование?
- Как удалить файл?
- Как получить расширение файла?
- Как получить имя файла с расширением и без?
- Как создать папку?
- Как узнать размер файла?
- Как получить хеш MD5 или SHA1 для файла?
- Как получить список директорий и файлов?
- Как получить список корневых дисков и рутовых директорий?
- Как получить crc32 сумму файла?
- Как очистить папку от всех файлов и под-папок?
- Как полностью удалить всю папку?
- Как прочитать текстовый файл построчно?
Как реализовать 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.