navcon/file

此包包含用于访问、更改、复制、删除、移动、重命名文件和目录的PHP类。

1.0.1 2018-03-09 14:09 UTC

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

特此授予任何获得本软件及其相关文档副本(“软件”)的人免费使用软件的权利,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许软件的提供者执行上述操作,前提是必须遵守以下条件

上述版权声明和本许可声明应包含在软件的副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论这些索赔、损害或其他责任是基于合同、侵权或其他方式引起的,以及与软件或软件的使用或其他交易有关。