6

我目前正在制作一个 php 脚本来绘制数据库中的一堆数据,将其排列成文本文件,然后运行 ​​GNUPlot 脚本来生成图形。我已经完成了所有这些工作,现在我需要做的就是删除我不再需要的文本文件。

我一直在尝试的是从另一个论坛上的另一个帖子中获得的:

foreach( glob('US_A.2.6.*') as $file )
    {
        unlink($file);
    }

然而,问题是它不起作用。这些文件具有复杂的结束名称:

  • US_A.2.6.1.1a.txt
  • US_A.2.6.1.2a.txt
  • US_A.2.6.1.3a.txt
  • US_A.2.6.1.4a.txt
  • US_A.2.6.1.5a.txt
  • US_A.2.6.1.6a.txt

和更多。

4

2 回答 2

6

使用getcwd()检查您的工作目录。如果您与文本文件不在同一目录中,则需要指定路径。

此外,尝试回显 glob() 语句的输出以查看它是否找到任何文件:

echo $file . PHP_EOL;
unlink($file);

您没有检查 unlink() 返回值,因此如果文件不可写,它可能会静默失败(取决于您的 error_reporting 级别)。

于 2011-06-24T18:11:52.930 回答
3

根据您的限制,您可以通过exec()调用生成更简洁的代码,但代价是跨平台可移植性较低。我更喜欢给出绝对路径,我通常在所有脚本中包含的配置文件中的变量中硬编码,所以:

define (FULL_DIRECTORY_PATH,'/whatever/your/path/is/');

...

exec('rm ' . FULL_DIRECTORY_PATH . 'US_A.2.6.*');

或者

define (BASE_PATH,'/base/path/');

...

exec('rm ' . BASE_PATH . 'additional/path/US_A.2.6.*');

该解决方案适用于 linux 和其他 UNIX 系统。尽管在 Windows 上使用 PHP 并不常见,但您可以调整它以在 Windows 服务器上工作。

如果有任何用户提交的输入,则存在与使用相关的一些严重安全风险;exec()使用原样的代码,它会很好,因为路径和文件名都是硬编码的。但如果您包含任何自定义输入,请确保使用escapeshellarg函数。

正如 George Cummins 所指出的,此解决方案不包括错误处理。如果您需要逐个文件进行错误处理,我发现他的解决方案会更好。但是,我通常使用这里的设置,没有错误处理,用于清理自动生成的文件,并且在使用这种结构的 10 多年中,我从未遇到任何问题。对于此类用途,错误处理通常只需要在设置和测试期间进行,并且通常归结为正确设置目录权限。

于 2019-03-12T18:33:13.093 回答