php - 文件和文件夹属性 - 编程 API

标签 php file operating-system directory file-recovery

我知道PHP能够通过不同的方式读取文件内容,例如:fread、file_get_contents、file、readfile等。

目前,我正在寻找一个API,可以读取特定分区或文件夹中文件和文件夹的真实索引,例如: Windows 中的驱动器 d:\包含三个文件夹(folder1、folder2、folder3),每个文件夹包含一些文件,我们可以使用 PHP 获取这些目录结构(opendir、scandir、readdir 等)并按我想要的方式列出它们,但是, Windows 在硬盘中保存文件和文件夹名称及其属性(大小、上次修改时间、创建时间等)。

如何使用 PHP 读取硬盘并检索特定路径的所有文件和文件夹属性? 例如,如果我们考虑最后修改时间,我们可以使用 (filemtime()) 函数,但该属性不保存在文件内,它保存在硬盘驱动器内的其他位置,其他属性也保存在文件内的其他位置。

当Windows用户将文件从闪存驱动器复制到本地硬盘时,Windows将复制所有文件和文件夹属性并将它们保存在本地硬盘驱动器中。当使用 PHP 复制文件时,它取决于操作系统来处理这项工作,它不是对文件和文件夹操作的 native 支持(正如我认为的)。

你有什么想法吗? 有很多恢复程序使用这种技术来读取硬盘驱动器索引,但是,对于 PHP:我找不到此问题的任何来源。

如果我得到正确答案,则申请: 我可以检查此类文件是否已从我的硬盘驱动器中安全删除?我可以使用 PHP 创建安全删除应用程序,或清除给定文件的硬盘驱动器索引。

感谢您的帮助。

最佳答案

提案存在问题

文件的属性,例如时间戳、权限标志等,存储在文件系统(FAT、NTFS、Ext3 等)中。正如你所说,其中一些可以使用 PHP 的不同文件和目录方法读取,但它们都通过操作系统文件系统抽象来操作,并且无法访问磁盘上的 block 级信息,例如磁盘上的哪个精确字节存储存档标志对于文件 X。操作系统和文件系统的全部意义在于从用户/客户端程序中抽象出这些信息。

正如所建议的,有一些用 c 或类似语言编写的外部工具,确实具有此访问权限,并且您可以从 PHP 内部调用它们。如果您想要“ native ”PHP 方式来执行此操作,则必须编译 PHP 的 C 扩展来向您公开这些低级函数。

我想说,如果您想坚持使用 PHP,那么外部工具是最佳选择,但对于手头的任务,据我们从您的描述中可以看出,我会选择另一种具有更低级别的语言使用权。就像 C 或 C++ 一样。 PHP 是一种用于 HTML 预处理的高级语言,因此对于低级系统编程来说不是一个好的选择。

实用建议

查看 PHP 文档和各种第三方库后:

PHP 不存在用于在文件分配表级别读取文件系统信息的现成解决方案。您获得的最低级别是 fstat()功能,这离你想要的并不远。

外部工具

无论您到底想做什么,都可能有一个小的二进制文件可以做到这一点。正如其他地方所建议的,PHP 可以通过 exec() 函数与这些程序集成。这对您来说可能是最简单的方法,除非您有大量的时间和/或开发资源来解决这个问题。

包装库

libraries它为您解决了这个问题,用低级语言编写。开源库可以是 wrapped with SWIG将其公开给 PHP。这将使您能够访问所需的低级方法,但这是一项不简单的任务。此类库通常还需要在使用设备时单独访问设备,这在大多数正常操作环境中很难实现。

另请注意,每个文件系统可能需要一个库。 Microsoft 对 FAT12/16/32 的 VFAT 扩展需要许可证才能使用。因此,如果您想使用 FAT 并拥有长名称的文件(不是 8.3 格式),您将不得不花一些钱才能合法。

低级实现

最后一个中间立场是编写您自己的 CLI 工具,该工具使用外部库来访问低级 FS 函数。然后,您可以在 PHP 内部使用 exec() 与您自己的实现进行交互。

如果您无法找到解决您问题的现有工具并且您不愿意花时间包装库,那么这可能是一条合理的路径。

结束时

您给出的问题描述非常狭窄,几乎没有说明该应用程序的内容。更广泛的讨论(在另一个论坛中)可能会产生更好的结果,因为问题可能完全以另一种方式得到更好的解决。

关于php - 文件和文件夹属性 - 编程 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14546850/

相关文章:

php - 即使在页面加载后也更改数字?

c - 为什么将 wchar 字符串写入文件在 C 中不起作用

operating-system - 读取 k 字节 block 的时间(以毫秒为单位)

c - 在 wait(&status) 系统调用的各种情况下状态变量会发生什么变化?

linux - 哪些段受写时复制影响?

php - Echo PHP Swift NSDictionary 对象数组

php - 如何整合我的代码?基于 JavaScript 和 PHP 的问题

java - 如何创建一个初始大小为 4KB 并用零填充的文件?

python - 将 4 个 numpy 数组中的坐标写入文件 Python

php - 显示所有页面的 Wordpress 自定义菜单