PHP,文件存在:'con'?

时间:2014-02-10 08:50:46

标签: php filenames ntfs file-exists

我对文件名有效性进行了2次检查(上传):

  1. 是否有另一个同名的文件?
  2. 是否可以创建具有此名称的文件?
  3. 对于(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!为什么呢?

2 个答案:

答案 0 :(得分:3)

是的,确实如此。 con在历史上是Windows中IO-pseudo-device的名称。您无法使用此类名称创建文件,系统会将此视为已存在的文件。把它想象成让我们的日子美丽的魔力。

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

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

答案 1 :(得分:1)

我建议在触摸/创建文件后使用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个值。这是他们的列表和   每个意味着什么阻止:阻止特殊设备char:字符   特殊设备目录:目录fifo:FIFO(命名管道)文件:常规   文件链接:符号链接未知:未知文件类型

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