Как использовать array_intersect, чтобы найти те же файлы? - PullRequest
1 голос
/ 02 апреля 2020

У меня проблема с удалением двух файлов (оба с одинаковым именем) в двух разных папках. Я попытался использовать функцию unlink для удаления. Как я могу удалить эти два файла в этих двух разных папках, используя функцию PHP unlink?

Может кто-нибудь подсказать мне, как использовать array_intersect для поиска файлов, pu sh те в массив и запустить a foreach l oop над этим массивом для удаления с использованием 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"]);
?>


Ниже мой вывод:

Output1

1 Ответ

0 голосов
/ 01 мая 2020

Для сравнения, если файл существует в двух каталогах, вам нужно базовое имя. Использование 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);
}
...