navcon / file
此包包含用于访问、更改、复制、删除、移动、重命名文件和目录的PHP类。
Requires
- php: >=5.3.0
- naucon/utility: ~1.0
Requires (Dev)
- phpunit/phpunit: 4.8.*
This package is auto-updated.
Last update: 2024-08-29 04:08:49 UTC
README
关于
此包包含用于访问、更改、复制、删除、移动、重命名文件和目录的PHP类。
功能
- File
- 扩展SplFileInfo
- 更改权限
- 创建文件或目录
- 复制文件和目录
- 移动文件和目录
- 删除文件和目录(递归)
- 迭代文件和目录
- FileReader
- 读取文件内容
- 迭代行
- FileWriter
- 写入文件内容
- 将行写入文件
- 删除文件内容(清除)
- 截断文件内容
- 锁(文件锁机制)
兼容性
- PHP5.3
安装
通过composer安装最新版本
composer require naucon/file
基本用法
File
File
类提供了访问和更改文件属性的方法,以及像复制、删除、移动、重命名到给定的绝对文件或目录路径这样的基本文件操作。由于PHP 5.1.2,标准PHP库(SPL)包含一个名为SplFileInfo
的类,可以访问文件属性,但不能更改或执行任何基本文件操作。File
类继承自SplFileInfo
类以确保兼容性。
使用绝对文件路径字符串创建File
类的实例。
$examplePath = __DIR__ . '/example.txt';
use Naucon\File\File;
$fileObject = new File($examplePath);
示例
echo 'File ' . $fileObject->getPathname() . ' do' . (($fileObject->exists()) ? '' : ' not') . ' exist.';
echo '<br/>';
echo 'File is' . (($fileObject->isReadable()) ? '' : ' not') . ' readable.';
echo '<br/>';
echo 'File is' . (($fileObject->isWritable()) ? '' : ' not') . ' writeable.';
echo '<br/>';
echo '<br/>';
echo 'File size: ' . $fileObject->getSize() . ' bytes';
echo '<br/>';
echo 'Access Time: ' . $fileObject->lastAccessed()->format('d.m.Y H:s');
echo '<br/>';
echo 'Change Time: ' . $fileObject->lastChanged()->format('d.m.Y H:s');
echo '<br/>';
echo 'Modification Time: ' . $fileObject->lastModified()->format('d.m.Y H:s');
echo '<br/>';
echo '<br/>';
echo 'File Owner: ' . $fileObject->getOwnerName() . ' (' . $fileObject->getOwner() . ')';
echo '<br/>';
echo 'File Group: ' . $fileObject->getGroupName() . ' (' . $fileObject->getGroup() . ')';
echo '<br/>';
echo 'File permission: ' . $fileObject->getPermission();
echo '<br/>';
echo '<br/>';
创建目录
要创建目录,创建一个包含新目录绝对路径的File
实例,并调用mkdir()
或mkdirs()
方法。
$newDirectoryPath = __DIR__ . '/tmp';
use Naucon\File\File;
$fileObject = new File($newDirectoryPath);
$fileObject->mkdir();
mkdirs()
方法不仅会创建给定的目录,还会递归地创建路径中的所有目录。
$newDirectoryPath = __DIR__ . '/tmp/foo/bar';
use Naucon\File\File;
$fileObject = new File($newDirectoryPath);
$fileObject->mkdirs();
重命名
要重命名文件或目录,首先创建一个包含文件或目录绝对路径的File
实例。之后,调用带有新文件或目录名称(带扩展名的文件)的rename()
方法。
$fileObject->rename('example_foo.txt');
复制
要复制文件或目录,首先创建一个包含源文件或目录绝对路径的File
实例。之后,调用带有目标目录绝对路径的copy()
方法。
$sourcePath = __DIR__ . '/example.txt';
$targetPath = __DIR__ . '/tmp/target/';
use Naucon\File\File;
$fileObject = new File($sourcePath);
$fileObject->copy($targetPath);
移动
要移动文件或目录,首先创建一个包含源文件或目录绝对路径的File
实例。之后,调用带有目标目录绝对路径的move()
方法。
$sourcePath = __DIR__ . '/example.txt';
$targetPath = __DIR__ . '/tmp/target/move/';
use Naucon\File\File;
$fileObject = new File($sourcePath);
$fileObject->move($targetPath);
删除
要删除文件或目录,首先创建一个包含文件或目录绝对路径的File
实例。之后,调用delete()
或deleteAll()
方法。
$sourcePath = __DIR__ . '/tmp/example.txt';
use Naucon\File\File;
$fileObject = new File($sourcePath);
$fileObject->delete();
delete()
方法将删除文件或目录。它只能删除空目录。要递归删除目录及其文件和子目录,请调用deleteAll()
。
$sourcePath = __DIR__ . '/tmp/';
use Naucon\File\File;
$fileObject = new File($sourcePath);
$fileObject->deleteAll();
迭代
File
类提供了listAll()
和listFiles()
方法来访问给定目录的文件和目录。这些方法返回一个FilesystemIterator
类(SPL)的实例。该实例可以通过foreach()
命令迭代以检索文件和目录。
$path = __DIR__ . '/ExampleDir';
use Naucon\File\File;
$fileObject = new File($path);
$iteratorObject = $fileObject->listAll();
foreach ($iteratorObject as $subFileObject) {
$subFileObject->getBasename() . '<br/>';
if ($subFileObject->isDir()) {
foreach ($subFileObject->listAll() as $subChildFileObject) {
echo $subChildFileObject->getBasename() . '<br/>';
}
}
}
listFiles()
方法将结果过滤为仅文件。因此,它实现了FileFilterType
过滤器类。
$iteratorObject = $fileObject->listFiles();
foreach ($iteratorObject as $subFileObject) {
echo $subFileObject->getBasename() . '<br/>';
}
要过滤结果,请使用FilterIterator
的实现。此包已包含用于根据文件类型(dir|file)过滤的过滤器类FileFilterType
。
$iterator = new FileFilterType($fileObject->listAll(), 'dir');
foreach ($iteratorObject as $subFileObject) {
echo $subFileObject->getBasename() . '<br/>';
}
FileReader
FileReader
类扩展了File
类,以不同方式读取给定文件的内容。
自PHP 5.1起,标准PHP库(SPL)包含一个名为SplFileObject
的类,它可以访问和更改文件内容。现在的FileReader
类使用SplFileObject
的一个实例来执行读取操作,但不从它继承,也不兼容。
使用绝对文件路径字符串创建FileReader
类的实例。
$filePath = __DIR__ . '/example_read.txt';
use Naucon\File\FileReader;
$fileObject = new FileReader($filePath, 'r', true);
迭代行
FileReader
类实现了迭代器接口。可以使用foreach()
命令迭代实例以检索文件内容行。
// iterate
foreach($fileObject as $line) {
echo $line . '<br/>';
}
要导航到行,提供了以下方法:isFirst()
、firstLine()
、isLast()
、nextLine()
、readLine($pointer)
// while
echo $fileObject->firstLine();
echo '<br/>';
while ( !$fileObject->isLast() ){
echo $fileObject->nextLine();
echo '<br/>';
}
echo $fileObject->firstLine();
echo '<br/>';
echo $fileObject->nextLine();
echo '<br/>';
echo $fileObject->nextLine();
echo '<br/>';
echo $fileObject->firstLine();
echo '<br/>';
echo $fileObject->readLine(3);
echo '<br/>';
echo $fileObject->readLine(7);
echo '<br/>';
调用read()
时,会一次性返回文件内容。
// read all
echo nl2br($fileObject->read());
echo '<br/>';
调用readLines()
时,会一次性以数组形式返回文件内容行。
$lines = $fileObject->readLines(); // return array
foreach ($lines as $line) {
echo $line . '<br/>';
}
FileWriter
FileWriter
类扩展了FileReader
类,以不同方式写入给定文件的内容。
自PHP 5.1起,标准PHP库(SPL)包含一个名为SplFileObject
的类,它可以访问和更改文件内容。现在的FileWriter
类使用SplFileObject
的一个实例来执行读取操作,但不从它继承,也不兼容。
使用绝对文件路径字符串创建FileWriter
类的实例。
$filePath = __DIR__ . '/example_write.txt';
use Naucon\File\FileWriter;
$fileObject = new FileWriter($filePath,'w+'); // file point at the beginning of the file, truncate existing content
之后,调用write($string)
或writeLine($string)
将给定字符串写入文件。
$string = 'Line01'.PHP_EOL;
$string.= 'Line02'.PHP_EOL;
$string.= 'Line03'.PHP_EOL;
$string.= 'Line04'.PHP_EOL;
$fileObject->write($string);
// iterate file lines
foreach($fileObject as $line) {
echo $line . '<br/>';
}
echo '<br/>';
//Output:
//Line01
//Line02
//Line03
//Line04
writeLine($string)
方法将在给定字符串后添加换行符。
$filePath = __DIR__ . '/example_write.txt';
$fileObject = new FileWriter($filePath,'a+'); // file point at the end of the file
$fileObject->writeLine("foo");
$fileObject->writeLine("bar");
foreach($fileObject as $line) {
echo $line . '<br/>';
}
echo '<br/>';
//Output:
//Line01
//Line02
//Line03
//Line04
//foo
//bar
调用clear()
时,将删除文件内容。
$fileObject->clear(); // remove all content
锁定
Lock
类是一种通过在进程开始时在文件开头写入一个锁定文件并在进程结束时删除它来锁定进程的机制。当进程执行且锁定文件已存在时,它将被终止。因此,不能同时执行多个进程。您可能在Windows上打开Word文档时见过。
首先,使用要写入锁定文件的绝对路径创建一个LockHandler
类的实例。然后,使用该LockHandler
实例创建一个LockManager
类的实例。《LockManager》实现了单例模式,因此可以在任何地方访问。
$lockPath = __DIR__ . '/lock/';
use Naucon\File\LockHandler;
use Naucon\File\LockManager;
LockManager::init(new LockHandler($lockPath));
要执行锁定,请使用唯一标识符创建一个Lock
实例。然后调用lock()
来写入锁定文件。
use Naucon\File\Lock;
$lockObject = new Lock('foo');
$lockObject->lock(); // create lock file "~foo.lock"
调用unlock()
时,将删除锁定文件;
$lockObject->unlock(); // delete lock file "~foo.lock"
要验证是否存在锁定文件,请调用isLocked()
。
if ($lockObject->isLocked()) {
$lockObject->unlock(); // make sure that file is not locked (deadlock)
}
示例
$lockObject1 = new Lock('foo');
$lockObject1->lock(); // create lock file "~foo.lock"
$lockObject2 = new Lock('foo');
try {
$lockObject2->lock(); // throw exception - lock file lock file "~foo.lock" already there
} catch (\Exception $e) {
echo 'Already Locked<br/>';
}
$lockObject1->unlock(); // delete lock file "~foo.lock"
$lockObject2->lock(); // create lock file "~foo.lock" again
$lockObject2->unlock(); // delete lock file "~foo.lock" again
示例
启动内置的Web服务器以查看示例操作
cd examples
php -S 127.0.0.1:3000
在浏览器中打开URL
http://127.0.0.1:3000/index.html
许可证
MIT许可证(MIT)
版权所有(c)2015 Sven Sanzenbacher
特此授予任何获得本软件及其相关文档副本(“软件”)的人免费使用软件的权利,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许软件的提供者执行上述操作,前提是必须遵守以下条件
上述版权声明和本许可声明应包含在软件的副本或主要部分中。
软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论这些索赔、损害或其他责任是基于合同、侵权或其他方式引起的,以及与软件或软件的使用或其他交易有关。