【问题标题】:PHP, file exists: 'con'?PHP,文件存在:'con'?
【发布时间】:2014-03-07 12:13:43
【问题描述】:

我做了 2 次文件名有效性检查(用于上传):

  1. 还有其他同名文件吗?
  2. 是否可以创建具有此名称的文件?

对于 (1) 我使用 file_exists,对于 (2) — fopen 用于创建。

$dir = '../../images/';
if (file_exists($dir.$name))
{
    ok('alreadyexists', 'true');
}
else
{
    $file = fopen($dir.$name, 'x');
    if (FALSE == $file)
    {
        ok('invalid', 'true');
    }
    else
    {
        fclose($file);
        ok();
    }
}

测试上面的代码,我尝试了名称“con”(AFAIK,在 Windows 下你不能创建这样的文件)。我想它会在第二次测试中失败,但file_exists 为 '../../images/con' 返回 true!为什么?

【问题讨论】:

  • 我建议在文件被触摸/创建后使用is_writable($dir.$name)(文件在关闭后保存)。 touch也是初始创建文件并测试是否可以写入的好方法
  • 哈哈。现在“con”通过is_writable,但fopen 在输出中生成警告,而不是返回FALSE。它也必须更换,我正在寻找什么)
  • file_exists 应替换为 is_writablefopen 应替换为 @fopen,仅此而已。

标签: php filenames ntfs file-exists


【解决方案1】:

是的,是的。 con 历史上是 Windows 中 IO 伪设备的名称。您不能使用这样的名称创建文件,系统会将其视为已经存在的文件。把它想象成一种让我们的日子变得美好的魔法。

具有此类属性的其他设备(因此,保留文件名)是:

  • AUX(控制台连接)
  • NUL(空设备)
  • COM1 .. COM9(串口)
  • PRN(打印机)
  • LPT1 .. LPT9(并行端口)

【讨论】:

  • 那么第二次检查有意义吗?
  • 哪张支票?您不能使用该名称。但是——不,不是因为它存在。因为是系统预留的
  • fopen 检查。我必须将真实的现有文件冲突与 aux/con/nul 等错误分开(当然,我知道它们是什么,我只是想知道,而 PHP 将它们解释为现有文件,尤其是绝对路径形式)。
  • PHP 没有任何魔法(嗯,通常)。因此,它依赖于 FS(文件系统)向其报告的信息。 FS 由操作系统管理 - 因此,PHP 会将此类文件视为现有文件。因此,您可以使用file_exists() 处理此类问题
【解决方案2】:

我建议在文件被触摸/创建后使用is_writable($dir.$name)(文件在fclose 之后保存)。 touch() 也是初始创建文件并测试是否可以写入的好方法。

可以试试:

touch($dir.$name);

is_writable($dir.$name);

//parse the output of
shell_exec('touch ' . $dir . $name);
// or
exec('touch ' . $dir . $name);

打印出来的内容也会很有趣:

filetype($dir.$name);

来自http://www.php.net/manual/en/function.filetype.php

可以返回 7 个值。这是它们的列表和 每一个的含义 block: block 特殊设备 char: character 特殊设备 dir:目录 fifo:FIFO(命名管道)文件:常规 文件链接:符号链接未知:未知文件类型

// also interesting:
stat($dir.$name);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2013-01-07
    • 2014-02-19
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 2015-12-15
    相关资源
    最近更新 更多