在PHP中,如果文件名已存在,则使用while循环无法将1添加到文件名。

3

我正在尝试创建一些代码,首先检查目录的内容以查看是否存在文件,如果存在,则在文件名后追加一个数字。不幸的是,目前我无法让它工作,php没有产生错误,但如果已存在文件,则不会创建新文件。这是我目前的代码:

$Scan_Name_Output =  "dirbuster_" . $workload["Scan_Name"] . "_output.txt"; 
$Check_Output = exec("ls " . $Output_Directory . " | grep -w " . $Scan_Name_Output);
$j = 1;

while (!empty($Check_Output))
{
    $Scan_Name_Output = $Scan_Name_Output . $j;
    $j++;

如果我把while循环替换成if语句,它就能工作——所以不是文件路径或其他原因导致问题。我尝试了很多组合,但无法使其工作。
我尝试使用file_exists(),但它不起作用——我认为这是因为我正在传递已经通过escapeshellarg()处理的变量给它。因此,我认为file_exists会准确地查找/path/to/dir/'Report1.txt'——显然'Report1.txt'不存在,而Report1.txt存在。这就是为什么我使用exec和ls的原因。
感谢任何回复。

Jingo,你确定它没有产生错误吗?通常情况下,display_errors默认是关闭的。尝试在文件顶部放置ini_set('display_errors',1);以确保没有错误。 - AlexC
2个回答

3

PHP内置了一些处理文件的好用函数。例如,您应该考虑使用file_exists()

$basename =  "dirbuster_" . $workload["Scan_Name"] . "_output.txt";          
$Scan_Name_Output = $basename;
$j = 1;
while (file_exists($Scan_Name_Output)){
    $Scan_Name_Output = $basename . $j;
    $j++;
}
$ourFileHandle = fopen($Scan_Name_Output, 'w') or die("can't open file");

抱歉,我在原帖中应该已经提到了,我会编辑以清晰表述。我尝试使用file_exists(),但它无法工作 - 我认为这是因为我正在传递通过escapeshellarg()处理过的变量。因此,我认为file_exists实际上是在查找 /path/to/dir/'Report1.txt' - 显然'Report1.txt'不存在,而Report1.txt确实存在。这就是为什么我使用exec和ls的原因。感谢您的回复! - Jingo

2

试试这个:

$Scan_Name_Output =  "dirbuster_" . $workload["Scan_Name"] . "_output.txt";
if (file_exists($Scan_Name_Output))
{
    rename($Scan_Name_Output, $Scan_Name_Output . "1");
}

谢谢您的回复,如果您看到我的更新帖子,您会发现为什么file_exists对我来说似乎不起作用。干杯 - Jingo
此外,如果有两个文件名为report.txt和report.txt1,这种方法将无法正常工作 - 它只会覆盖report.txt1文件,因为没有计数器,不是吗? - Jingo
为什么在传递给file_exists之前不使用trim()去除单引号-您可以这样做:$Scan_Name_Output =“dirbuster_”. trim($workload [“Scan_Name”],“'”). “_output.txt”; - Ninja
如果在 trim() 函数中的第二个参数不清楚,那么就是将单引号作为第二个参数(你可以指定要修剪哪些字符,请在这里阅读:http://php.net/manual/zh/function.trim.php)。 - Ninja
谢谢 - 这样做确实有效,但我必须从两个用户提供的变量中删除 ''。通过这样做,我不是有效地删除了对用户提供的输入进行任何净化吗?这就是为什么我在寻找原始代码的解决方案的原因。 - Jingo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接