2009-01-13 49 views
8

Directory.GetFiles(LocalFilePath,searchPattern);過濾文件名:獲取* .abc不帶* .abcd或* .abcde等

MSDN注:

當在是searchPattern使用星號通配符,例如「.TXT」,當擴展名是正好三個字符長比當延伸是多個不同的匹配模式或少於三個字符長。具有正好三個字符的文件擴展名的searchPattern將返回具有三個或更多字符的擴展名的文件,其中前三個字符與searchPattern中指定的文件擴展名匹配。具有一個,兩個或多於三個字符的文件擴展名的searchPattern僅返回具有與searchPattern中指定的文件擴展名相匹配的正好具有該長度的擴展名的文件。當使用問號通配符時,此方法只返回與指定文件擴展名匹配的文件。例如,在目錄中給定兩個文件「file1.txt」和「file1.txtother」,「file?.txt」的搜索模式僅返回第一個文件,而「文件.txt」的搜索模式返回這兩個文件。

以下列表顯示了不同長度的爲是searchPattern參數的行爲:具有.abc.abcd.abcde.abcdef,等等的擴展

  • *.abc返回文件。

  • *.abcd僅返回擴展名爲.abcd的文件。

  • *.abcde僅返回擴展名爲.abcde的文件。

  • *.abcdef僅返回擴展名爲.abcdef的文件。

隨着searchPattern參數設置爲*.abc,我怎麼能回到具有.abc的延伸,而不是.abcd.abcde等文件?

也許這個功能將工作:

private bool StriktMatch(string fileExtension, string searchPattern) 
    { 
     bool isStriktMatch = false; 

     string extension = searchPattern.Substring(searchPattern.LastIndexOf('.')); 

     if (String.IsNullOrEmpty(extension)) 
     { 
      isStriktMatch = true; 
     } 
     else if (extension.IndexOfAny(new char[] { '*', '?' }) != -1) 
     { 
      isStriktMatch = true; 
     } 
     else if (String.Compare(fileExtension, extension, true) == 0) 
     { 
      isStriktMatch = true; 
     } 
     else 
     { 
      isStriktMatch = false; 
     } 

     return isStriktMatch; 
    } 

測試程序:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string[] fileNames = Directory.GetFiles("C:\\document", "*.abc"); 

     ArrayList al = new ArrayList(); 

     for (int i = 0; i < fileNames.Length; i++) 
     { 
      FileInfo file = new FileInfo(fileNames[i]); 
      if (StriktMatch(file.Extension, "*.abc")) 
      { 
       al.Add(fileNames[i]); 
      } 
     } 

     fileNames = (String[])al.ToArray(typeof(String)); 

     foreach (string s in fileNames) 
     { 
      Console.WriteLine(s); 
     } 

     Console.Read(); 
    } 

別人更好的解決辦法?

+0

你將給予更多的上下文...... – Eclipse 2009-01-13 03:57:25

回答

5

不是一個錯誤,不正確但記錄完好的行爲。 * .doc基於8.3回退查找匹配* .docx。

您將不得不手動過濾結果以doc結尾。

+0

刪除我的答案,因爲你是對的。 – NotMe 2009-01-13 04:06:23

9

答案是你必須做後過濾。 GetFiles單獨不能做到這一點。以下是一個將後處理結果的示例。有了這個,您可以使用GetFiles或不使用搜索模式 - 它將以任何方式工作。

List<string> fileNames = new List<string>(); 
// populate all filenames here with a Directory.GetFiles or whatever 

string srcDir = "from"; // set this 
string destDir = "to"; // set this too 

// this filters the names in the list to just those that end with ".doc" 
foreach (var f in fileNames.All(f => f.ToLower().EndsWith(".doc"))) 
{ 
    try 
    { 
     File.Copy(Path.Combine(srcDir, f), Path.Combine(destDir, f)); 
    } 
    catch { ... } 
} 
0

使用LINQ ....

string strSomePath = "c:\\SomeFolder"; 
string strSomePattern = "*.abc"; 
string[] filez = Directory.GetFiles(strSomePath, strSomePattern); 

var filtrd = from f in filez 
     where f.EndsWith(strSomePattern) 
     select f; 

foreach (string strSomeFileName in filtrd) 
{ 
    Console.WriteLine(strSomeFileName); 
} 
0

由於爲 「*名爲.abc」 的GetFiles後,將返回的3個或更多,任何擴展與長度爲3的 「」是完全匹配的,而且更長的不是。

string[] fileList = Directory.GetFiles(path, "*.abc"); 

foreach (string file in fileList) 
{ 
    FileInfo fInfo = new FileInfo(file); 

    if (fInfo.Extension.Length == 4) // "." is counted in the length 
    { 
     // exact extension match - process the file... 
    } 
} 

不知道上面的表現 - 雖然它使用簡單的長度比較,而不是字符串操作,新的FileInfo()被調用周圍的每次循環。

相關問題