pendenga/file

文件工具

0.1.0 2020-03-25 19:40 UTC

This package is auto-updated.

Last update: 2024-09-26 07:44:29 UTC


README

我在处理文件和目录时使用的几个工具,尤其是在处理大量文件时。我为一个客户导出多年的数据时构建了这些工具,最终有超过165,000个文件分布在4,000多个目录中,总大小超过140GB。

安装

此软件包托管在packagist上,可通过 Composer 安装。

要求

  • PHP版本7.1或更高(推荐7.2+)
  • Composer(用于安装)

通过Composer安装

在您的仓库中运行以下命令行...

composer require pendenga/file

或者将以下行添加到您的composer.json文件...

"require": {
  "pendenga/file": "0.1.0",
},

然后运行以下命令

$ composer update

这将把 Pendenga File 设置为项目的依赖项并安装它。

在启动应用程序时,您需要包含 'vendor/autoload.php' 以设置自动加载。

可用的工具

所有日志记录都使用Psr\Log\LoggerInterface进行,以确保与其他包和日志记录器的兼容性。在我的示例中,我将仅使用 $logger 表示任何 LoggerInterface。

批量

批量工具可以将大量目录合并到子目录中,使其不超过特定的大小。用例是我有一个包含4,000多个文件夹的单个目录,总大小超过140GB,并将其上传到Box.com。Box.com不允许下载超过15GB的数据,因此客户无法一次性下载整个集合。此脚本将数百个文件夹分成15个批次文件夹,每个文件夹的大小小于10GB,以便可以下载。

$batch = new Batch(new Scan(), $logger);
$batch->setOption('max_batch_bytes', 10737418240); // 10 gb
$batches = $batch->evaluate($tmp_dir);
// print_r($batches); // review before executing
$batch->execute($batches);

列映射

ColumnMap用于Manifest将电子表格中的列映射到需要匹配的值。例如,如果用户定义的manifest电子表格有列(name, size, checksum)或(filename, bytes, md5),这两个都可能有效,我们需要将电子表格中的列映射到它们以便可以处理它们。

目录

目录提供了一些在创建目录和移动文件时非常有用的工具。

$dir = new Directory($logger);

// bool check if directory is empty
if ($dir->checkEmpty($tmp_dir)) { ... }

// array list of files
foreach ($dir->files($tmp_dir) as $file) { ... }

// delete all files in a directory (useful for unit tests)
$dir->deleteFiles($tmp_dir);

// delete all empty subdirectories in a directory (useful for unit tests)
$dir->deleteSubDirs($tmp_dir);

生成

生成一组随机文件。您可以配置随机目录数、每个目录中的文件数、每个文件中的行数、每行中的字符数等选项。可选地,您可以创建新文件集的manifest文件。

$gen = new Generate($logger);
$gen->setOption('file_base_dir', $tmp_dir)
    ->setManifest(new ManifestWriter($manifest))
    ->files();

Ini

Ini文件的简单包装,以便在安装到不同项目后,即使在包安装在不同的项目中,也能在根目录中找到它,并提供一行静态函数来访问ini。

$tmp_dir = Ini::get('TMP_DIRECTORY');

Manifest

使用包含相对文件名和零个或多个以下内容的电子表格manifest验证目录中的文件

  • 文件大小(以字节为单位)
  • 文件中的行数
  • md5校验和
$chk = new Manifest(new ColumnMap(), $logger);
$chk->load($path_to_manifest_file);
$results = $chk->validateFiles($path_to_files, new Scan());

ManifestWriter

用于在创建文件时创建manifest文件。您可以指定哪些列被创建,但以下是一些当前选项

  • 相对文件名(必需)
  • 文件大小(以字节为单位)
  • 文件中的行数
  • md5校验和

属性

一个简单的类,用于抽象manifest文件中执行的一些检查。

$prop = new Properties($path_to_file);
$prop->bytes();
$prop->checksum();
$prop->exists();
$prop->lines();

扫描

PHP文件扫描和GLOB工具的抽象。有助于搜索文件、获取文件和目录列表。

$scan = new Scan($logger);

// search directory for text files (recursive)
$scan->files($path_to_file_directory, '*.txt'))

// list subdirectories (not recursive)
$scan->directories($path_to_file_directory)