我对文件名有效性进行了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!为什么呢?
答案 0 :(得分:3)
是的,确实如此。 con
在历史上是Windows中IO-pseudo-device的名称。您无法使用此类名称创建文件,系统会将此视为已存在的文件。把它想象成让我们的日子美丽的魔力。
具有此类属性的其他设备(保留文件名)为:
答案 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);