【发布时间】:2021-07-30 05:21:29
【问题描述】:
我对 PHP 的 DirectoryIterator() 函数感到奇怪。我正在从一个目录中读取,并且可以查看我使用 Windows 保存的所有 .txt 文件(通过 SMB 共享)。但是,如果我使用 Linux(运行 PHP 的平台)创建一个 .txt 文件,它根本不会读取它。没有错误,就像它不存在一样。如果我在 Windows 中打开文件并重新保存而不做任何更改,则文件突然可以被读取。
我尝试过使用 PHP 内置的 Touch() 函数 fopen(),并使用 shell_exec() 并使用 Linux 内置的 touch 命令来创建它,但是这些都没有帮助。我尝试更改文件权限、所有者和组,甚至以 root 身份执行 PHP,只是为了看看它是否可以工作,但没有运气。我还查看了文件的编码,Linux 和 Windows 都使用 UTF8 对它们进行编码,所以不是这样。
有趣的是,如果我将不起作用的文件移出目录,然后将其移回原处,它就可以工作。所以这让我相信也许不是每个人说的文件,而是它的编写方式?没有线索。
有人可以帮我集思广益吗?我不知道为什么 DirectoryIterator() 无法读取 2 个看似相同的文件
我在 Arch Linux 上运行 PHP 8,并使用此代码从目录中读取:
$path = "threads/";
$files = new DirectoryIterator($path);
$files_array = array();
while($files->valid()) {
$key = $files->getMTime();
$data = $files->getFilename();
$files_array[$key] = $data;
$files->next();
}
rsort($files_array);
foreach ($files_array as $fileinfo) {
echo $fileinfo;
}
以及创建文本文件的代码:
touch ("../threads/" . $threadNumber . ".txt");
【问题讨论】:
-
您需要发布创建文件的代码,然后使用目录迭代器。
-
我已经添加了代码,很抱歉!
-
Q中有很多猜想。我们需要实际可测试的代码。
-
脚本的两部分是什么关系?您确定要在创建目录迭代器之前创建文件吗?
-
我发现了一些东西。我包含了整个代码,并且我相信当我执行下一步时它正在发生;以相反的字母顺序对它们进行排序。也许 while($files->valid()) 没有拿起它?如果我不排序并读取目录迭代器的原始输出,它就会显示出来。
标签: php linux encoding iterator touch