需要扫描目录并仅删除特定类型的文件

时间:2019-02-08 07:24:23

标签: php html

我需要有一个php脚本,该脚本允许我扫描目录,然后从其中删除文件,我的代码工作正常,它列出了我需要的所有内容,但是,我的问题是我只需要删除特定的该目录中的文件,此脚本将扫描所有内容,在这种情况下,我试图仅删除创建的.sql文件。但是,此脚本列出了所有类型的文件。

我将代码留在下面:

    <?php
$fid= $_POST['fid'];
if (("submit")&&($fid != "")) {
foreach($fid as $rfn) {
$remove = "$dire/$rfn";
unlink($remove);
}
}
$handle=opendir($dire);
while (($file = readdir($handle))!== false){
if ($file != "." && $file != "..") {
$size = filesize("$dire/$file");
$list .= '<table class="table table-bordered table-dark table-hover" cellspacing="0" width="100%">';
$list .= '<tbody>';
$list .= '<tr style="text-transform:uppercase;">';
$list .= '<td><small>'.$file.'</small></td>';
$list .= '<td align="center"><small><input type="checkbox" class="form-control" name="fid[]" value="'.$file.'"></small></td>';
$list .= '</tr>';
$list .= '</tbody>';
$list .= '</table>';
}
}
closedir($handle);
echo $list;
?>

如您所见,这段代码可以正常工作,虽然我不知道,但是我需要一种方法仅显示我的SQL文件,而不显示其他类型的文件。

2 个答案:

答案 0 :(得分:1)

前段时间,我遇到了PHP的RecursiveDirectoryIterator。该内置类可让您迭代目录及其子目录,并对目录中的文件执行所需的任何操作。

看看下面的示例如何实现此目的:

if ($_SERVER['REQUEST_METHOD'] == 'POST') {

    // The directory to remove files from
    $directory = $_POST['directory'];

    // The extension se are looking for
    $extension = $_POST['extension'];

    // Construct the iterator
    $it = new RecursiveDirectoryIterator($directory);

    // Loop through files
    foreach(new RecursiveIteratorIterator($it) as $file) {
        if ($file->getExtension() == $extension) {
            echo 'Removing ' . $file . "\n";
            unlink($file);
        }
    }
}

实施

您可以使用以下脚本替换您的代码。请注意,在这种情况下,我使用了DirectoryIterator,因为您只想遍历单个目录。

<?php
/**
 * Directory overview
 */
// The directory to remove files from
$directory = '/path/to/directory';

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    foreach ($_POST['fid'] as $filePath) {
        unlink $filePath;
    }
}
?>


<table class="table table-bordered table-dark table-hover" cellspacing="0" width="100%">
    <thead>
        <tr>
            <th>File</th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        <?php foreach (new DirectoryIterator($directory) as $file): ?>
        <?php if ($file->isDot() || !$file->isFile()) continue; ?>
}        <tr style="text-transform:uppercase;">
            <td><small><?= $file; ?></small></td>
            <td align="center"><small><input type="checkbox" class="form-control" name="fid[]" value="<?= $file->getPathName(); ?>"></small></td>
        </tr>
    </tbody>
</table>

资源

答案 1 :(得分:1)

如果您只想在删除前检查文件扩展名:

<?php
    foreach ($fids as $fid) {
        if (pathinfo($dire . '/' . $fid)['extension'] == 'sql') {
            unlink($dire . '/' . $fid); 
        }
    }
?>

否则,您可以使用GLOB()扫描目录中仅.sql

<?php
    $dire = 'my_dir';

    if (!empty($_POST['fid'])) {
        $fids = $_POST['fid'];
        foreach ($fids as $fid) {
            unlink($dire . '/' . $fid);
        }
    }
?>

http://php.net/manual/en/function.glob.php

<?php
    $files = GLOB($dire . '/*{.sql}', GLOB_BRACE);
?>

<?php if ($files): ?>
    <?php foreach($files as $file): ?>

        <table class="table table-bordered table-dark table-hover" cellspacing="0" width="100%">
            <tbody>
                <tr style="text-transform:uppercase;">
                    <td><small><?= basename($file); ?></small></td>
                    <td align="center"><small><input type="checkbox" class="form-control" name="fid[]" value="<?= basename($file); ?>"></small></td>
                </tr>
            </tbody>
        </table>

    <?php endforeach; ?>
<?php endif; ?>