結果如果我要打電話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. 排除從DIV
- 7. Directory.GetFiles()是searchPattern
- 8. 使用Directory.GetFiles
- 9. 當使用Directory.GetFiles(...)
- 10. Directory.getfiles():文件C#
- 11. 從JTable排序列排除
- 12. 從排序排除jtable列
- 13. 填充一個2維列表從Directory.GetFiles
- 14. 防止Directory.GetFiles()從搜索短文件名
- 15. 排除從結果
- 16. 排除從生成
- 17. 排除從分析
- 18. 排除@Component從@ComponentScan
- 19. 「排除」從的IntelliJ
- 20. 排除從分析
- 21. 排除從部署
- 22. 從查詢排除
- 23. 排除從陣列
- 24. 排除從查詢
- 25. 排除從結果
- 26. 排除從日誌
- 27. Directory.GetFiles()性能問題
- 28. Directory.GetFiles某些擴展
- 29. 如何使用Directory.GetFiles
- 30. C#directory.getfiles多是searchPattern
'Directory.GetFiles'不具備這種能力。模式參數僅指示應該包含什麼*。一個更好的選擇可能是使用'Directory.EnumerateFiles'並在其結果中指定一個'Where'子句。 – 2012-02-02 03:30:40