2014-02-10 60 views
1

我做了2個檢查文件名區分有效性的(上載):PHP,文件存在:'con'?

  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!爲什麼?

+1

我建議使用'is_writable($ dir。$ name)'在文件被觸摸/創建後(文件在fclose後保存)。 'touch'也是一個很好的方法,用於初始創建文件並測試它是否可以寫入 – DanFromGermany

+0

@DanFromGermany如果將註釋轉換爲答案,我會接受它,因爲應該使用'is_writable'而不是'file_exists'爲宣佈的目的。 – noober

+0

LOL。現在'con'通過'is_writable'傳遞,但是'fopen'會在輸出中產生一個警告,而不是返回FALSE。它必須被替換,我正在尋找什麼) – noober

回答

1

我sugge st文件被觸摸/創建後使用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個值。這是他們與 一下每種意味着塊列表:塊專用設備字符:字符 專用設備目錄:目錄FIFO:FIFO(命名管道)文件:定期 文件鏈接:符號鏈接未知:未知的文件類型

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

是的。 con歷史上是Windows中IO-pseudo-device的名稱。你不能用這樣的名字創建文件,系統會將其視爲已經存在的文件。把它看作是讓我們的日子變得美麗的一點魔力。

其他設備(這樣,保留文件名)與這樣的屬性是:

  • AUX(控制檯連接)
  • NUL(空裝置)
  • COM1 .. COM9(串口)
  • PRN(打印機)
  • LPT1 .. LPT9(並行端口)
+0

第二次檢查是否有意義呢? – noober

+0

哪個檢查?你不能使用這個名字。但是 - 不,不是因爲它存在。這是因爲它被系統 –

+0

'fopen'檢查保留。我必須將真正存在的文件衝突與aux/con/nul等錯誤分開(當然,我知道它們是什麼,我只是想知道,而PHP將它們解釋爲現有文件,尤其是絕對路徑形式)。 – noober