2017-10-17 155 views
0

我想使用PHP重命名文件。PHP文件重命名 - 文件名中的非法字符

我循環遍歷包含文件的目錄,一旦找到文件,我想使用rename()來進行實際的重命名。

到目前爲止這麼簡單。

問題是需要重命名的文件在文件名中包含非法字符。 我可以從名稱中刪除非法字符,但是當我想用新名稱重命名文件時,找不到它。

所以一旦我到了可以使用的地步rename() PHP會發出警告:系統找不到指定的文件。 (代碼:2)。

PHP似乎無法將文件識別爲文件(is_file()返回false)。 有問題的文件是pdf文件,我可以在Acrobat Reader中沒有任何問題的情況下打開它。 該文件是使用Quartz在Mac上生成的,我正在使用Windows。

有沒有人有一個想法,我可以如何讓PHP識別名稱中的非法字符作爲文件的文件?

PS

這是我的代碼:

$dataDirectory = new RecursiveDirectoryIterator($folders); 

foreach ($dataDirectory as $dataName => $dataFileName) { 

    $isfile = is_file($dataFileName); // false for files with illegal character in filename 
    $result = rename($dataFileName, 'testname'); // generates warning mentioned above 

} 

回答

0

什麼是服務器操作系統?

如果是Windows,那麼您將無法使用UTF-8編碼的文件名訪問文件,因爲PHP使用的CIO庫的Windows實現只會在系統默認代碼頁中進行討論。對於西歐安裝,這是代碼頁1252可以轉換爲UTF-8串用iconv到CP1252:

$winfilename= iconv('utf-8', 'cp1252', $utffilename); 

(utf8_decode也可以使用,但它會給出錯誤的結果適用於Windows的擴展字符映射在cp1252中爲0x80-0x9F。)

根據PHP和使用stdio的其他程序,系統代碼頁(例如希臘語)的名稱包含在系統代碼頁之外的字符的文件根本無法訪問。有腳本語言可以通過Win32 API使用原生Unicode文件名,但PHP5不是其中之一。

當然,當部署在文件系統採用UTF-8編碼的其他操作系統上時,不應使用上述步驟。 (即現代Linux)

如果您需要與PHP無縫跨服務器兼容,則必須避免在文件名中使用非ASCII字符。抱歉。

+0

謝謝。您指出有腳本語言可以使用本地Unicode文件名。你能建議一個嗎? – copossum

+0

Node.js就是一個例子。 –