如何使用array_intersect找到相同的文件?

问题描述 投票:0回答:1

我有一个关于删除两个不同文件夹中的两个文件(两个文件名相同)的问题。我试过使用取消链接功能来删除。我如何使用PHP的取消链接功能删除这两个不同文件夹中的两个文件?

谁能指导我如何使用 array_intersect 找到文件,把这些文件推送到数组中,然后在数组上运行一个foreach循环,使用unlink删除?

下面是我的代码。

<?php
$i = 1;
$files = scandir("upload_dms_file/uploads_meeting_document");
$files_2 = scandir("upload_dms_file/uploads_filing_file");
$date = $files[$a];
for ($a = 2; $a < count($files); $a++) {

    ?>

    <tr>
        <td> <?php echo $i++; ?></td>
        <td> <a href="upload_dms_file/uploads_meeting_document/<?php echo $files[$a]; ?>" target="_blank"> <?php echo $files[$a]; ?></a></td>
        <td>
            <button class="btn btn-sm btn-primary"><a href="upload_dms_file/uploads_meeting_document/<?php echo $files[$a]; ?>"
                                                      download="<?php echo $files[$a]; ?>" style="color: white;">
                    Download</a></button>
            &nbsp &nbsp
            <button class="btn btn-sm btn-primary"><a
                        href="upload_dms_file/delete_meeting_document.php?name=uploads_meeting_document/<?php echo $files[$a]; ?>" style="color: white;">
                    Delete
                </a></button>
        </td>
    </tr>

    <?php
} ?>

下面是我的删除代码 它成功删除了uploads_meeting_document文件夹中的文件 所以我的问题是如何删除位于uploads_filing_file(变量是$files_2)文件夹中的另一份文件?

<?php
unlink($_GET["name"]);

// Redirecting back
header("Location: " . $_SERVER["HTTP_REFERER"]);
?>


以下是我的输出。

输出1

php unlink array-intersect
1个回答
0
投票

要比较一个文件是否存在于两个目录中,你需要基名。使用scandir()不是最好的方法,因为你也会收到不能删除的目录,但是你可以尝试一下,因为'.'和'.'总是存在的(在*NIX系统中)。

正确的方法是一个迭代器,它不把所有的目录都读到内存中,这样可以节省速度和内存。

下面是一个如何删除存在于不同位置的文件的代码示例。

const PATH1 = 'upload_dms_file/uploads_meeting_document/';
const PATH2 = 'upload_dms_file/uploads_filing_file/';

$files1 = getFiles(PATH1);
$files2 = getFiles(PATH2);

$intersects = array_intersect($files1, $files2);

foreach($intersects as $filename) {
    deleteFile(PATH1, $filename);
    deleteFile(PATH2, $filename);
}

function getFiles(string $path): array
{
    $files = [];
    $iterator = new DirectoryIterator($path);
    foreach ($iterator as $fileInfo) {
        if ($fileInfo->isFile()) $files[] = $fileInfo->getFilename();
    }

    return $files;
}

function deleteFile($path, $filename) {
    $fullpath = $path . $filename;
    if(file_exists($fullpath)) unlink($fullpath);
}
© www.soinside.com 2019 - 2024. All rights reserved.