【问题标题】:PHP's DirectoryIterator is not reading file created with LinuxPHP 的 DirectoryIterator 不读取使用 Linux 创建的文件
【发布时间】: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


【解决方案1】:

嗯,所以我不确定问题是什么,但我认为这与$files->valid()有关

它似乎没有读取有效的文件。文档只是说“检查当前 DirectoryIterator 位置是否是有效文件”。我最终只是切换到使用 scandir() 并且它现在可以完美运行。很奇怪。

如果有人能对此有所了解,那就太好了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 2014-05-27
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多