【问题标题】:Remove files which have not filename duplicates删除没有文件名重复的文件
【发布时间】:2021-07-26 16:07:22
【问题描述】:

对于每个文档(.pdf、.txt、.docx ecc),我还有一个对应的具有相同文件名的 json 文件。

示例: 文件1.json, 文件1.pdf, 文件2.json, 文件2.txt, 文件x.json, 文件x.pdf,

但是我也得到了一些没有相应文档的json文件。

我想删除所有没有对应文件的json文件。我真的卡住了,因为我找不到合适的解决方案。

我知道如何 scandir() 从 pathinfo() ecc 获取文件名、扩展名。但问题是,对于我在目录中找到的每个 json 文件,我必须在该目录上执行另一个 foreach,不包括所有 json 文件,并查看是否存在相同的文件名,然后我可以决定删除它。 (这就是我认为的解决方法)。

这里的问题在于性能,因为有数百万个文件,对于每个 json,我必须对数百万个文件运行一个 foreach。

谁能指导我找到更好的解决方案?

谢谢!

编辑:因为没有人会在不先发布一段代码的情况下提供帮助(而stackoverflow中的这种方法肯定是错误的),这就是我正在尝试的方式。:

<?php

$dir = "2000/";

$files = scandir($dir);

foreach ($files as $file) {

    $fullName = pathinfo($file);

    if ($fullName['extension'] === 'json') {
        if (!in_array($fullName['filename'].'.pdf', $files)){
            unlink($dir.$file);
        }
    }
}

现在你可以看到我只能搜索一种类型的文档(在这种情况下为.pdf)。我想搜索除 .json 之外的每个扩展名,而且我不希望每个 json 文件都运行一个 foreach/in_array() 但只在一个 foreach 中实现所有这些。

【问题讨论】:

    标签: php json file scandir


    【解决方案1】:

    也许您应该换一种方式考虑?我的意思是,遍历所有文件,并尝试找到与json对应的文件,如果找不到则删除它。

    如下所示:

    $dir = "2000/";
    
    foreach (glob($dir . "*.json") as $file) {
        $file = new \SplFileInfo($dir . $file);
        if (count(glob($dir . $file->getBasename('.' . $file->getExtension()) . ".*")) === 1) {
            unlink($dir . $file->getFilename());
        }
    }
    

    手动

    PHP: SplFileInfo

    PHP: glob

    【讨论】:

    • 这是文档存在但 json 不存在的情况,这样我们可以只删除文档,因为我们删除了 $file 迭代,它不会有 .json 扩展名。我的情况是在没有对应文档的情况下删除json。
    • 我已经更新了我的答案 :) 它应该可以工作。我现在无法运行它,所以请检查我的语法是否有效,如果不是,请告诉我:)
    • 是的,感谢您向我展示了另一种解决问题的方法。我喜欢!
    • 谢谢 :) 很高兴能帮上忙。
    • 好的,现在我在我的电脑上尝试一下。请考虑对答案进行另一次编辑。由于$file 现在是一个新对象,我们不能直接取消链接它。所以应该是unlink($dir . $file-&gt;getFilename());
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2021-12-13
    • 2023-04-07
    • 2023-03-20
    • 2017-10-05
    • 1970-01-01
    相关资源
    最近更新 更多