【问题标题】:Using a wildcard in php unlink在 php unlink 中使用通配符
【发布时间】:2011-06-24 18:08:54
【问题描述】:

我目前正在制作一个 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

还有更多。

【问题讨论】:

  • 您是否尝试过使用完整路径?

标签: php wildcard unlink


【解决方案1】:

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

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

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

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

【讨论】:

  • 它们在同一个工作目录中。我最终需要移动它们,但此时我只需要删除它们。不过感谢您的回复!
  • 这是一个权限问题,我让管理员给了我适当的权限,它就像一个魅力
  • 这意味着它从来都不是'通配符不起作用'
【解决方案2】:

根据您的限制,您可以通过使用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 多年中,我从未遇到任何问题。对于此类用途,错误处理通常只需要在设置和测试期间进行,通常归结为正确设置目录权限。

【讨论】:

  • exec('rm /var/home/requests/*-Token.txt'); 为我工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多