我有一個巨大的目錄,我需要從包括子目錄中檢索檔案。
我的檔案是包含各種檔案的檔案夾,但我只對以 7 位長度的擴展名命名的特定專有檔案感興趣。
例如,我有一個包含以下檔案的檔案夾:
abc.txt
def.txt
GIWFJ1XA.0201000
GIWFJ1UC.0501000
NOOBO0XA.0100100
summary.pdf
someinfo.zip
T7F4JUXA.0300600
vxy98796.csv
YJHLPLBO.0302300
YJHLPLUC.0302800
我嘗試了以下方法:
var fileList = Directory.GetFiles(someDir, "*.???????", SearchOption.AllDirectories)
并且
string searchSting = string.Empty;
for (int j = 0; j < 9999999; j )
{
searchSting = string.Format(", *.{0} ", j.ToString("0000000"));
}
var fileList2 = Directory.GetFiles(someDir, searchSting, SearchOption.AllDirectories);
哪個錯誤是因為字串顯然太長了。
我只想回傳具有指定擴展名長度的檔案,在這種情況下,為 7 位數字以避免不得不回圈我必須處理的數千個數字。
我考慮為搜索條件創建一個變數字串,該字串將包含所有 99,999,999 個可能的數字,但 d
我怎樣才能做到這一點?
uj5u.com熱心網友回復:
我不相信有一種方法可以在不遍歷目錄及其子檔案夾中的檔案的情況下做到這一點。的搜索模式GetFiles不支持正則運算式,所以我們不能真正使用類似的東西[\d]{7}作為過濾器。我建議使用Directory.EnumerateFiles然后回傳符合您條件的檔案。
您可以使用它來列舉檔案:
private static IEnumerable<string> GetProprietaryFiles(string topDirectory)
{
Func<string, bool> filter = f =>
{
string extension = Path.GetExtension(f);
// is 8 characters long including the .
// all remaining characters are digits
return extension.Length == 8 && extension.Skip(1).All(char.IsDigit);
};
// EnumerateFiles allows us to step through the files without
// loading all of the filenames into memory at once.
IEnumerable<string> matchingFiles =
Directory.EnumerateFiles(topDirectory, "*", SearchOption.AllDirectories)
.Where(filter);
// Return each file as the enumerable is iterated
foreach (var file in matchingFiles)
{
yield return file;
}
}
Path.GetExtension包括 the.所以我們檢查包括 the 在內的字符數.是 8,并且所有剩余的字符都是數字。
用法:
List<string> fileList = GetProprietaryFiles(someDir).ToList();
uj5u.com熱心網友回復:
我只是抓取目錄中的檔案串列,然后檢查'。'之后的子字串長度是否。等于 7。(* 只要您知道沒有其他檔案具有該長度擴展名)
編輯使用 Path 代替:
Directory.GetFiles(@"C:\temp").Where(
fileName => Path.GetExtension(fileName).Length == 8
).ToList();
老的:
Directory.GetFiles(someDir).Where(
fileName => fileName.Substring(fileName.LastIndexOf('.') 1).Length == 7
).ToList();
uj5u.com熱心網友回復:
考慮files作為Directory.GetFiles()結果。
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
List<string> files = new List<string>()
{"abc.txt", "def.txt", "GIWFJ1XA.0201000", "GIWFJ1UC.0501000", "NOOBO0XA.0100100", "summary.pdf", "someinfo.zip", "T7F4JUXA.0300600", "vxy98796.csv", "YJHLPLBO.0302300", "YJHLPLUC.0302800"};
Regex r = new Regex("^\\.\\d{7}$");
foreach (string file in files.Where(o => r.IsMatch(Path.GetExtension(o))))
{
Console.WriteLine(file);
}
}
}
輸出:
GIWFJ1XA.0201000
GIWFJ1UC.0501000
NOOBO0XA.0100100
T7F4JUXA.0300600
YJHLPLBO.0302300
YJHLPLUC.0302800
編輯:我試過(r.IsMatch)而不是使用o,但 dotnetfiddle 編譯器給我錯誤說
Compilation error (line 14, col 27): The call is ambiguous between the following methods or properties: 'System.Linq.Enumerable.Where<string>(System.Collections.Generic.IEnumerable<string>, System.Func<string,bool>)' and 'System.Linq.Enumerable.Where<string>(System.Collections.Generic.IEnumerable<string>, System.Func<string,int,bool>)'
由于我現在很忙,所以無法除錯它,如果有人路過建議任何解決方法,我會很高興。但是上面的當前代碼有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/463147.html
上一篇:從檔案中讀取并添加到單獨的串列中
