PHP scandir 看到旧的已删除文件,fopen 看到它的内容



我在一些PHP代码中遇到了一个非常奇怪的异常,我需要一些帮助来弄清楚这里发生了什么。


用户有一个文件目录,PHP 将所有文件的名称和内容中继到网页。

它使用scandir检测文件并使用fopen读取它们。

另一个PHP文件能够通过unlink删除这些文件,这是通过JavaScript AJAX请求调用的。

在测试过程中,我创建了一个名为_.txt的文件,后来使用上面提到的unlink文件将其删除。

这就是事情变得非常奇怪的地方。

在我的工作区的文件浏览器中,_.txt文件不见了。

在 Bash 终端中使用ls表示_.txt文件已消失。

但是 PHPscandir仍然检测到该文件,并且fopen能够成功读取其内容。


从这一点开始,我通过 Bash 终端创建了一个带有touch _.txt

我给了它一些内容nano _.txt

PHP 会正确检测该文件并读取新_.txt文件的内容。

然后我用rm _.txt删除了它

现在 PHP 仍然检测_.txt文件,并且仍然读取_.txt文件的内容。


为了使这个问题更加奇怪,我通过这些PHP命令创建和删除的任何其他文件都不会发生这种情况。_.txt,只有这一个文件给我带来了所有这些麻烦。

自从这种情况开始发生以来,我已经重新启动了服务器几次。

我在网上看遍了,找不到任何关于这个的信息。


负责扫描和读取文件的代码片段:

$username = $_COOKIE['username'];
/*
password checks ommited as it's not relevant
*/
$directory = scandir('USERFILES/'.$username);
foreach($directory as $filename){
// do not select . and ..
if($filename != '.' && $filename != '..'){
// by default this remains an empty string
$fileusesunderscore = '';
// if invalid characters start the filename
if(strpos('0123456789.,-[]/+=\`"'!*:|@#%^&()<>?|;~', $filename[0]) !== false){
// set the empty string to underscore
$fileusesunderscore = '_';
}
// grab the file contents
$file = fopen('USERFILES/'.$username.'/'.$filename, 'r');
/*
line at this position is responsible for echo'ing the file
it is ommited as it is irrelevant, except that $fileusesunderscore is used like so when echoing:
$fileusesunderscore.pathinfo($filename, PATHINFO_FILENAME)
*/
fclose($file);
}
}

负责删除文件的代码片段:

$username = $_COOKIE['username'];
// filename can only possibly equal a name that was
// given to the JS by the first PHP file
$filename = $_POST['file'];
/*
password checks ommited as it's not relevant
*/
$filepath = '/USERFILES/'.$username.'/'.$filename.'.txt';
unlink(getcwd().$filepath);

所以我想总结一下,这是我遇到的问题,需要帮助来实现:

名为_.txt的文件已通过unlink删除,不再存在。

scandir仍然看到它,fopen仍然看到它的内容。

我无法使用 Bashrm删除文件_.txt因为它不再存在。

我正在尝试做的是成功摆脱此文件并防止这种情况再次发生。

我一直在到处寻找解决方案,但找不到,所以我在这里寻求帮助。感谢您抽出宝贵时间对此提供帮助。

旧帖子,但我在我的 Kali Linux 上遇到了类似的问题。疯了几个小时! 通过以 root 身份进入目录(视觉上不存在的文件(来解决,在命令行中尝试使用 dir 命令作为最后的想法,然后删除的文件显示为"name.jpg~"。 使用 rm 命令删除了它们,一切都很好!

最新更新