After my script finishes I can delete the file, but while it's running I can't touch it, even after an fclose()
. Here is the code I'm trying to use:
$Files = glob("$_SERVER[DOCUMENT_ROOT]/files/*.csv");
$File = fopen($Files[0], "r");
//while (($Data = fgetcsv($File)) !== false) {...
$i = 0;
while (is_resource($File)) {
$i && sleep(1);
echo "Closing handle.\n";
fclose($File);
if (++$i > 5)
die("Could not close handle.");
}
foreach ($Files as $File) {
$i = 0;
while (file_exists($File)) {
$i && sleep(1);
echo "Deleting file.\n";
@unlink($File);
echo 'www-data@debian:~$ ', $Command = "rm -f '$File' 2>&1", "\n", shell_exec($Command);
if (++$i > 5)
die("Could not delete the file.");
}
}
As you can see I'm trying to delete it through unlink()
and using shell commands and neither are working, both give me this error:
rm: cannot remove 'invincible-file.csv': Text file busy
I also realize the script might be a bit overkill, but that's purely because I couldn't get it to work in any way, and some of the extra code is just for output purposes to try and debug what is happening.
I've run into this issue before and been able to remedy by forcing garbage collection after closing the file and before unlinking it:
By far not the best solution, but it did resolve an issue I had deleting files that had been previously opened and closed lines before.