我需要有一个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文件,而不显示其他类型的文件。
答案 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; ?>