2012-03-13 35 views
1

我有兩個文件夾,一個是我有視頻,另一個是每個視頻的配置文件(每個視頻有3個文件)。現在,如果我想刪除一個視頻,我必須手動刪除文件。 我發現這一點:取消鏈接文件與不區分大小寫(glob-like)模式

<?php 

$filename = 'name.of.the.video.xml';  
$term = str_replace(".xml","", $filename); 
$dirPath = ("D:/test/"); 

foreach (glob($dirPath.$term.".*") as $removeFile) 
{ 
    unlink ($removeFile); 
} 

?> 

一個回波將返回:

d:/test/name.of.the.video.jpg

d:/test/name.of.the。 video.srt

d:/test/name.of.the.video.xml

是確定的,它幫助了我很多,但我在這裏有一個問題。

並不是所有的文件都是一樣的例如: Name.of.The.video.jpg Name.Of.The.Video.xml

如果我贊同尋找該字符串的文件夾,而不是同文同$ filename將返回空。 所以,我的問題是,我如何使搜索大小寫不敏感? 謝謝。

回答

2

您正在使用區分大小寫的glob函數。您正在使用錯誤的功能來獲取文件列表。

因此,您應該首先規範目錄中的文件名,以便它們都共享相同的大小寫(例如全部小寫)。或者您需要使用其他方法來使目錄列表不區分大小寫。我建議第一個,但如果這不是一個選項,爲什麼你不要glob所有文件先,然後使用preg_grep篩選文件列表,它允許指定不區分大小寫的模式?

這使我認爲它更實際用途DirectoryIteratorRegexIterator點:的Iterator S碼的靈活性

$filename = 'name.of.the.video.xml'; 
$term = basename($filename, ".xml"); 
$files = new DirectoryIterator($dirPath); 
$filesFiltered = new RegexIterator($files, sprintf('(^%s\\..*$)i', preg_quote($term))); 
foreach($filesFiltered as $file) 
{ 
    printf("delete: %s\n", $file); 
    unlink($file->getPathname()); 
} 

一個很好的例子是你改變了要求:做那兩個目錄在一旦。您只需創建兩個DirectoryIterator s並使用AppendIterator將另一個附加到另一個。任務完成。其餘代碼保持不變:

... 
$files = new AppendIterator(); 
$files->append(new DirectoryIterator($dirPath1)); 
$files->append(new DirectoryIterator($dirPath2)); 
... 

Voilá。聽起來不錯? glob對於需要它的一些快速作業來說沒關係。對於目錄操作的其他部分開始考慮SPL。它有更多的權力。

+0

$ removeFile = scandir($ dirPath); print_r(preg_grep(「/ $ term/i」,$ removeFile)); 我會嘗試這個 – akun 2012-03-13 14:11:55

+0

@akun:我給你添了一個例子,不是你誤解我的意思。這是關於刪除文件,所以要小心。 – hakre 2012-03-13 14:21:33

+0

@akun:最好採用'DirectoryIterator'。 – hakre 2012-03-13 14:30:18

1

strcasecmp()是一個有效的函數嗎?它是一個不區分大小寫的str比較函數?

當然,如果你知道文件名並且你可以將它回顯出來,你可以把它傳遞給unlink()?