結果如果我要打電話Directory.GetFiles並使其返回與模式匹配的*.bin
的所有文件,但我要排除的所有文件,將匹配的模式LOG#.bin
其中#
是不確定長度的運行計數器。有沒有辦法在將搜索過濾器傳遞到GetFiles
的步驟中過濾出結果,還是必須獲取結果數組,然後刪除我想要排除的項目?排除從Directory.GetFiles
回答
你可以使用Linq,Directory.EnumerateFiles()
和Where()
過濾器 - 這樣你只能得到你想要的文件,剩下的就被過濾掉了。
像這樣的東西應該工作:
Regex re = new Regex(@"^LOG\d+.bin$");
var logFiles = Directory.EnumerateFiles(somePath, "*.bin")
.Where(f => !re.IsMatch(Path.GetFileName(f)))
.ToList();
正如指出Directory.EnumerateFiles
需要.NET 4.0。另外一個更清潔的解決方案(花費更多的開銷)使用DirectoryInfo
/EnumerateFiles()
,它返回IEnumerable<FileInfo>
,因此您可以直接訪問文件名和擴展名,而無需進一步解析。
如果您需要使用.Net <4.0,那麼您可以使用Pinvoke來獲得類似的結果。查看:http://tom-shelton.net/index.php/2010/01/02/using-extension-methods-and-the-win32-api-to-efficiently-enumerate-the-file-system/ – 2012-02-02 03:37:12
感謝我瞭解'.Where'子句,我只是想知道是否可以在沒有第二個過濾器的情況下完成。我對你的代碼做了一些小改動,因爲它與'ThisIsNotALOG0.bin'匹配,我希望它匹配。謝謝。 – 2012-02-02 15:20:01
有使用LINQ的解決方案:
using System;
using System.IO;
using System.Linq;
namespace getfilesFilter
{
class Program
{
static void Main(string[] args)
{
var files = Directory.GetFiles(@"C:\temp", "*.bin").Select(p => Path.GetFileName(p)).Where(p => p.StartsWith("LOG"));
foreach (var file in files)
{
Console.WriteLine(file);
}
Console.ReadLine();
}
}
}
- 1. Directory.GetFiles(strFolderPath)排除某些文件名VB.NET
- 2. Directory.GetFiles按日期排序
- 3. VB.NET Directory.GetFiles按日期排序
- 4. Directory.GetFiles通過創建時間排序
- 5. 文件名不從Directory.GetFiles
- 6. 使用Directory.GetFiles
- 7. Directory.getfiles():文件C#
- 8. 當使用Directory.GetFiles(...)
- 9. 從JTable排序列排除
- 10. 排除從結果
- 11. 排除從結果
- 12. 「排除」從的IntelliJ
- 13. 排除從分析
- 14. 排除從陣列
- 15. C#directory.getfiles多是searchPattern
- 16. Directory.GetFiles搜索模式
- 17. 從MySQL排除排年紀比今天
- 18. 從URL中排除變量
- 19. jquery從功能排除div
- 20. 從babel混淆排除webresources?
- 21. knitr - 從`purl(...)`排除塊?
- 22. 排除從umbraco搜索
- 23. 從htaccess中排除目錄
- 24. 從TOC中排除章節
- 25. 從Travis中排除測試
- 26. 從SSL中排除子域
- 27. 排除dagger2類從APK
- 28. 如何從排除在MATLAB
- 29. 從CSV中排除字段
- 30. 從Maven中排除TestNG組
'Directory.GetFiles'不具備這種能力。模式參數僅指示應該包含什麼*。一個更好的選擇可能是使用'Directory.EnumerateFiles'並在其結果中指定一個'Where'子句。 – 2012-02-02 03:30:40