2010-01-25 45 views
0

我正在編寫一個PHP函數,它將刪除傳遞給它的目錄中的所有文件(並且最終可能將其擴展爲遞歸刪除)。爲了安全起見,我想確保通過一個錯誤或某些東西,如果傳入的目錄是根目錄,我不會嘗試刪除任何東西。識別PHP中的根目錄

文件權限應該保護我,在很大程度上,但爲了以防萬一,特別是如果我把它擴展到遞歸刪除我只是想採取額外的步驟。

作爲複雜的因素,此代碼可以在Windows機器或Linux機器上運行,所以根目錄可能看起來像「C:\」或「/」。我認爲還有其他的方法可以真正的引用根目錄,可能是'c:\ temp ..'

那麼,在PHP中是否有一種可靠的方法來識別dir spec解析爲文件根目錄系統?

精...

我寫PHPUnit測試的Web應用程序,我想創造一個應用程序的狀態備份的測試運行,並恢復之前之後的框架。該應用程序允許用戶上傳文件。根據文件是什麼,它被複制到幾個可能的目錄中的一個。

保存和恢復應用程序的目錄需要地方複製的狀態,測試運行,那麼目錄需要有自己的文件刪除,並從備份retreived。

這些目錄的位置因機器而異,我知道有些人把它們放在網絡應用程序之外。有一個配置文件可以被測試讀取,它給出了給定機器的這些目錄的位置。

如果我沒有將所有這些目錄限制在特定的目錄樹中,那麼很難做到監獄。如果我將這些目錄限制在特定的目錄樹中,那麼有些人將不得不重新配置他們的機器。

回答

3

你應該有一個定義的根文件夾,你永遠不會去上面,也就是jailing。根文件夾不是唯一可以造成嚴重損壞的文件夾。

編輯。

雖然我仍然主張使用某種類型的監獄,我想你可以通過剝離任何驅動器字母並將\轉換爲/來識別根文件夾。根文件夾將始終是單個/。

function isRootFolder($dirpath) { 
    list($drive, $path) = explode(':', str_replace('\\', '/', $dirpath), 2); 

    return $path == '/'; 
} 
+0

我想到了這個,我喜歡這個詞,「監獄」。我認爲在一些Windows系統中,我需要考慮用戶賬戶中的目錄,c:\ users \ ...以及web應用程序中的目錄c:\ wamp \ www \ ...,因此監獄將是困難的。可能值得重新配置系統,以便所有受影響的目錄位於c:\ wamp \ ... 另一件事是,雖然我同意還有其他目錄,我不想意外刪除所有文件,root是唯一的我認爲這可能會產生一個錯誤。 – 2010-01-25 21:17:55

+0

你願意詳細說明你想要完成什麼嗎?我或其他人可能會給你一個更有幫助的答案。 – 2010-01-26 07:31:19

+0

以上詳細說明 – 2010-01-26 21:05:48

0

嘗試,這樣的功能:

function is_root_dir($path) 
{ 
    $clean_path = realpath($path); 
    if($clean_path == '/' || preg_match('/[a-z]:\\/i', $clean_path)) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

這不是測試,我只是寫在這裏的編輯器。 realpath()解決了路徑,出現了simbolic鏈接並解析瞭如下內容:c:\ temp .. == c:\

編輯:最後,您應該遵循nikc給出的建議,定義一個目錄列表可以安全刪除。

0

我用這個:

if (dirname($target)==$target) { // you're at the root dir 

(是微軟以及其他一切與便攜式)

C.