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



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

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

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

当Windows用户将文件

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

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

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

感谢您的帮助。

命题的问题

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

正如建议的那样,有一些用 c 或类似语言编写的外部工具确实具有此访问权限,您可以从 PHP 内部调用。如果你想要一个"原生"的PHP方式,你必须为PHP编译一个c扩展,向你公开这些低级函数。

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

实用建议

在浏览了 PHP 文档和各种第三方库之后:

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

外部工具

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

包装库

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

另请注意,每个文件系统可能需要一个库。微软对FAT12/16/32的VFAT扩展需要许可证才能使用。因此,如果您想使用 FAT 并拥有长名称(不是 8.3 格式)的文件,则必须分叉一些面团才能合法。

低级实现

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

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

结语中

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

我在 PHP.net 上发现了一些东西,它似乎可以做你想要的:

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

编辑:我误解了这个问题。上次修改时间、上次访问日期等属性存储在文件系统主文件表中。据我所知,这是PHP无法访问的,如果你要编写自己的方法来做到这一点,那么你还必须考虑不同的文件系统,因为它们都以自己独特的方式处理这些属性的存储。

可能是在不为 PHP 本身编写某种形式的扩展的情况下,使用 PHP 就不可能获得您正在寻找的所有信息。

编辑2:经过更多的研究...

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

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

好吧,

如果我理解正确,您只想安全地删除文件。你可以叫[切碎][1]

[1]:如果您使用的是 Linux,请通过系统或 exec http://linux.die.net/man/1/shred,并且一切顺利

相关内容

  • 没有找到相关文章

最新更新