2

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

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

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

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

你有什么主意吗?有许多恢复程序使用这种技术来读取硬盘索引,但是,对于 PHP:我找不到这个问题的任何来源。

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

感谢您的帮助。

4

3 回答 3

2

提案的问题

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

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

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

实用建议

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

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

外部工具

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

包装一个库

有一些可以为您解决这个问题,它们是用低级语言编写的。可以使用 SWIG 包装一个开源库,以将其公开给 PHP。这将使您可以访问所需的低级方法,但这是一项非常重要的任务。这类库通常还需要在设备上工作时单独访问设备,这在大多数正常操作环境中很难实现。

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

低级实现

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

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

结束时

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

于 2013-01-29T12:25:02.343 回答
0

我在 PHP.net 上发现了一些似乎可以满足您要求的东西:

http://php.net/manual/en/function.readdir.php#103418

编辑:我误解了这个问题。最后修改时间、最后访问日期等属性存储在文件系统主文件表中。据我所知,这不能通过 PHP 访问,如果您要编写自己的方法来执行此操作,那么您还必须考虑不同的文件系统,因为它们都处理这些属性的存储在它们的自己独特的方式。

如果不为 PHP 本身编写某种形式的扩展,那么使用 PHP 可能无法获得您正在寻找的所有信息。

编辑2:在研究更多...

http://php.net/manual/en/function.fileinode.php

这个函数可能是一个有趣的函数。

于 2013-01-29T12:04:21.310 回答
0

好吧,如果我理解正确,您只想安全地删除文件。你可以调用 [shred][1]

[1]: http: //linux.die.net/man/1/shred通过系统或 exec,如果你在 linux 上,你很高兴

于 2013-01-30T21:29:03.713 回答