很多時候,您需要在 PHP 中移動檔案或在其中儲存一些資料。無論哪種情況,事先知道文件是否存在都可以幫助我們避免一些意外的行為。
PHP 附帶了多種函數來處理與文件相關的不同類型的查詢。在本教程中,我將向您簡要概述所有這些功能,以便您可以選擇最適合您情況的功能。
在許多情況下,在執行其他操作之前檢查檔案是否存在可能很重要。假設您的網站允許使用者將圖像檔案上傳到您的伺服器上,以便稍後存取。可以公平地假設,如果許多用戶使用您的服務頻繁上傳多個文件,則總是有可能出現文件名稱衝突。
在這種情況下,檢查您要儲存使用者最近上傳的檔案的位置是否已經存在另一個檔案就變得很重要。然後,您可以選擇採取一些步驟,例如將檔案重新命名為其他名稱或讓使用者知道他們的上傳將覆蓋現有檔案。
讓我們考慮另一種情況,您應該將資料附加到 PHP 中的檔案中。如果您建立的用於寫入所有資料的文件因某種原因被刪除,像file_put_contents()
這樣的函數只會建立一個具有指定名稱的新文件,並將您的資料儲存在新建立的文件中。在某些情況下這可能是可取的,但情況並非總是如此。因此,如果您在開始寫入資料之前已經期望該文件存在,那麼提前檢查該文件是否存在是有意義的。
您可以使用三種不同的函數來檢查 PHP 中是否存在檔案。
第一個函數是file_exists()
。此函數接受一個參數,即檔案所在的路徑。請記住,對於現有文件和目錄,它將傳回 true。這可能足以滿足您的需求,也可能不足以滿足您的需求。
如果您想要確保指定的路徑指向檔案而不是目錄,可以考慮使用 is_file()
函數。同樣,您可以使用 is_dir()
函數來檢查您指定的路徑是否存在以及是否指向目錄。
<?php $name = "squares.txt"; $directory = "squares.zip"; if(file_exists($name)) { echo 'The file "'.$name.'" exists.'; } if(is_file($name)) { echo '"'.$name.'" is indeed a file.'; } if(is_dir($directory)) { echo '"'.$directory.'" turned out to be a directory.'; } ?>輸出
The file "squares.txt" exists. "squares.txt" is indeed a file. "squares.zip" turned out to be a directory.
在上面的範例中,我故意將其中一個目錄命名為squares.zip 以表明進行自己的檢查很重要,而不是假設提供的檔案名稱實際上是檔案名稱或目錄.
請務必記住,is_file()
和is_dir()
都會傳回false
,即使父目錄沒有正確的權限時實際存在的路徑也是如此。
另外兩個名為 is_read()
和 is_writable()
的函數除了檢查檔案是否存在之外,還可用於取得有關檔案的一些額外資訊。
顧名思義,is_read()
函數會檢查兩件事:第一,檔案或目錄確實存在,第二,檔案可讀。同樣, is_writable()
函數也會檢查兩件事,即檔案或目錄存在且可寫入。
<?php $name = "squares.txt"; if(is_readable($name)) { echo 'We can read "'.$name.'".'; } if(is_writable($name)) { echo 'We can also modify the contents of "'.$name.'".'; } ?>輸出
We can read "squares.txt". We can also modify the contents of "squares.txt".
我建議您在解釋這兩個函數的返回值時要小心。例如,當 is_read()
傳回 false 時,我們的第一直覺是認為我們查詢的檔案不可讀。但是,如果檔案不存在,函數也會傳回 false。始終牢記這些功能的這一方面非常重要。
呼叫所有這五個函數傳回的回傳值,即file_exists()
、is_file()
、is_dir()
、is_read( )
和is_writeable()
—已快取。這意味著重複呼叫函數(例如 is_file()
)可能會顯示過時的結果。
PHP 快取這些函數的結果以提高效能。這可以確保查詢相同文件的多個呼叫運行得更快。但是,即使檔案在腳本執行過程中發生變化,它們的傳回值也將保持不變。
僅快取已存在檔案的結果。這意味著,對於不存在的文件,呼叫函數 is_file()
將繼續返回 false
,但一旦建立文件,就會開始返回 true
。另一方面,對於第一次呼叫期間存在的文件,函數將繼續返回 true
,即使該文件已被刪除。
<?php $name = "squares.txt"; if(is_file($name)) { echo '"'.$name.'" is indeed a file.'; } // Manually delete the file while script waits. sleep(5); if(is_file($name)) { echo '"'.$name.'" is indeed a file.'; } clearstatcache(); if(is_file($name)) { echo '"'.$name.'" is indeed a file.'; } else { echo 'The file probably no longer exists.'; } ?>
如果您對實際存在的檔案執行上述程式碼片段,然後在腳本等待期間手動將其刪除,則呼叫 is_file()
仍將傳回 true
#。不過,在再次查詢檔案是否存在之前,只需呼叫 clearstatcache()
即可得到正確的結果。
"squares.txt" is indeed a file. "squares.txt" is indeed a file. The file probably no longer exists.
要记住的另一件事是,调用 unlink()
会自动清除缓存,因此稍后调用 is_file()
等函数时会得到新的结果。
本教程首先介绍了检查 PHP 中文件是否存在的重要性。之后,我们了解了可用于检查 PHP 中文件是否存在的不同函数。我们还了解了其中一些功能可能具有的优点和缺点。
正如我在最后提到的,PHP 将缓存其中一些函数调用的结果以提高性能。因此,请确保在对这些文件执行重要操作之前清除缓存。
以上是如何在PHP中檢查檔案是否存在的詳細內容。更多資訊請關注PHP中文網其他相關文章!