Apa sintaks untuk menyetel beberapa ekstensi file seperti searchPattern
pada Directory.GetFiles()
? Misalnya memfilter file dengan ekstensi .aspx dan .ascx .
// TODO: Set the string 'searchPattern' to only get files with
// the extension '.aspx' and '.ascx'.
var filteredFiles = Directory.GetFiles(path, searchPattern);
Pembaruan : LINQ bukanlah pilihan , itu harus searchPattern
diteruskan ke GetFiles
, sebagaimana ditentukan dalam pertanyaan.
c#
.net
system.io.directory
Seb Nilsson
sumber
sumber
Jawaban:
Saya percaya tidak ada solusi "di luar kotak", itu adalah batasan dari metode Directory.GetFiles.
Namun, cukup mudah untuk menulis metode Anda sendiri, berikut ini contohnya .
Kodenya bisa jadi:
sumber
var filteredFiles = Directory .GetFiles(path, "*.*") .Where(file => file.ToLower().EndsWith("aspx") || file.ToLower().EndsWith("ascx")) .ToList();
Sunting 2014-07-23
Anda dapat melakukan ini di .NET 4.5 untuk penghitungan yang lebih cepat:
var filteredFiles = Directory .EnumerateFiles(path) //<--- .NET 4.5 .Where(file => file.ToLower().EndsWith("aspx") || file.ToLower().EndsWith("ascx")) .ToList();
Directory.EnumerateFiles di MSDN
sumber
GetFiles
kembalistring[]
.Directory.EnumerateFiles
untuk meningkatkan kinerja ... stackoverflow.com/questions/5669617/…file.EndsWith("...", StringComparison.InvariantCultureIgnoreCase);
daripadaToLower
Saya suka metode ini, karena dapat dibaca dan menghindari beberapa iterasi direktori:
var allowedExtensions = new [] {".doc", ".docx", ".pdf", ".ppt", ".pptx", ".xls", ".xslx"}; var files = Directory .GetFiles(folder) .Where(file => allowedExtensions.Any(file.ToLower().EndsWith)) .ToList();
sumber
HashSet<string>
GetFiles hanya dapat mencocokkan satu pola, tetapi Anda dapat menggunakan Linq untuk menjalankan GetFiles dengan beberapa pola:
FileInfo[] fi = new string[]{"*.txt","*.doc"} .SelectMany(i => di.GetFiles(i, SearchOption.AllDirectories)) .ToArray();
Lihat bagian komentar di sini: http://www.codeproject.com/KB/aspnet/NET_DirectoryInfo.aspx
sumber
new string[]{"*.txt","filename.*"}
,. Namun, panggilan keDistinct
tidak benar-benar menyelesaikan masalah ini, karena objek FileInfo dibandingkan menggunakan persamaan referensi, bukan persamaan semantik. Itu bisa diperbaiki dengan menghapusDistinct
atau meneruskannyaIEqualityComparer<FileInfo>
. Diedit untuk melakukan yang pertama.SelectMany
akan mengulangi struktur file yang sama lagi (dan lagi) sehingga mungkin kurang optimal dalam hal kinerja.var filteredFiles = Directory .EnumerateFiles(path, "*.*") // .NET4 better than `GetFiles` .Where( // ignorecase faster than tolower... file => file.ToLower().EndsWith("aspx") || file.EndsWith("ascx", StringComparison.OrdinalIgnoreCase)) .ToList();
Directory.EnumerateFiles
untuk meningkatkan kinerja ( Apa perbedaan antara Directory.EnumerateFiles vs Directory.GetFiles? )Atau, mungkin lebih cepat untuk membagi dan menggabungkan glob Anda (setidaknya terlihat lebih bersih):
"*.ext1;*.ext2".Split(';') .SelectMany(g => Directory.EnumerateFiles(path, g)) .ToList();
sumber
Saya khawatir Anda harus melakukan hal seperti ini, saya mutasi regex dari sini .
var searchPattern = new Regex( @"$(?<=\.(aspx|ascx))", RegexOptions.IgnoreCase); var files = Directory.EnumerateFiles(path) .Where(f => searchPattern.IsMatch(f)) .ToList();
sumber
Solusi yang mudah diingat, malas, dan mungkin tidak sempurna:
Directory.GetFiles(dir, "*.dll").Union(Directory.GetFiles(dir, "*.exe"))
sumber
Saya akan menggunakan yang berikut ini:
var ext = new string[] { ".ASPX", ".ASCX" }; FileInfo[] collection = (from fi in new DirectoryInfo(path).GetFiles() where ext.Contains(fi.Extension.ToUpper()) select fi) .ToArray();
EDIT: diperbaiki karena ketidakcocokan antara Directory dan DirectoryInfo
sumber
Saya akan mencoba menentukan sesuatu seperti
var searchPattern = "as?x";
itu harus bekerja.
sumber
Cara yang lebih efisien untuk mendapatkan file dengan ekstensi ".aspx" dan ".ascx" yang menghindari kueri sistem file beberapa kali dan menghindari mengembalikan banyak file yang tidak diinginkan, adalah dengan melakukan pra-filter file dengan menggunakan pola pencarian perkiraan dan untuk mempersempit hasil setelahnya:
var filteredFiles = Directory.GetFiles(path, "*.as?x") .Select(f => f.ToLowerInvariant()) .Where(f => f.EndsWith("px") || f.EndsWith("cx")) .ToList();
sumber
/// <summary> /// Returns the names of files in a specified directories that match the specified patterns using LINQ /// </summary> /// <param name="srcDirs">The directories to seach</param> /// <param name="searchPatterns">the list of search patterns</param> /// <param name="searchOption"></param> /// <returns>The list of files that match the specified pattern</returns> public static string[] GetFilesUsingLINQ(string[] srcDirs, string[] searchPatterns, SearchOption searchOption = SearchOption.AllDirectories) { var r = from dir in srcDirs from searchPattern in searchPatterns from f in Directory.GetFiles(dir, searchPattern, searchOption) select f; return r.ToArray(); }
sumber
public static bool CheckFiles(string pathA, string pathB) { string[] extantionFormat = new string[] { ".war", ".pkg" }; return CheckFiles(pathA, pathB, extantionFormat); } public static bool CheckFiles(string pathA, string pathB, string[] extantionFormat) { System.IO.DirectoryInfo dir1 = new System.IO.DirectoryInfo(pathA); System.IO.DirectoryInfo dir2 = new System.IO.DirectoryInfo(pathB); // Take a snapshot of the file system. list1/2 will contain only WAR or PKG // files // fileInfosA will contain all of files under path directories FileInfo[] fileInfosA = dir1.GetFiles("*.*", System.IO.SearchOption.AllDirectories); // list will contain all of files that have ..extantion[] // Run on all extantion in extantion array and compare them by lower case to // the file item extantion ... List<System.IO.FileInfo> list1 = (from extItem in extantionFormat from fileItem in fileInfosA where extItem.ToLower().Equals (fileItem.Extension.ToLower()) select fileItem).ToList(); // Take a snapshot of the file system. list1/2 will contain only WAR or // PKG files // fileInfosA will contain all of files under path directories FileInfo[] fileInfosB = dir2.GetFiles("*.*", System.IO.SearchOption.AllDirectories); // list will contain all of files that have ..extantion[] // Run on all extantion in extantion array and compare them by lower case to // the file item extantion ... List<System.IO.FileInfo> list2 = (from extItem in extantionFormat from fileItem in fileInfosB where extItem.ToLower().Equals (fileItem.Extension.ToLower()) select fileItem).ToList(); FileCompare myFileCompare = new FileCompare(); // This query determines whether the two folders contain // identical file lists, based on the custom file comparer // that is defined in the FileCompare class. return list1.SequenceEqual(list2, myFileCompare); }
sumber
Alih-alih fungsi EndsWith, saya akan memilih untuk menggunakan
Path.GetExtension()
metode sebagai gantinya. Berikut contoh lengkapnya:var filteredFiles = Directory.EnumerateFiles( path ) .Where( file => Path.GetExtension(file).Equals( ".aspx", StringComparison.OrdinalIgnoreCase ) || Path.GetExtension(file).Equals( ".ascx", StringComparison.OrdinalIgnoreCase ) );
atau:
var filteredFiles = Directory.EnumerateFiles(path) .Where( file => string.Equals( Path.GetExtension(file), ".aspx", StringComparison.OrdinalIgnoreCase ) || string.Equals( Path.GetExtension(file), ".ascx", StringComparison.OrdinalIgnoreCase ) );
(Gunakan
StringComparison.OrdinalIgnoreCase
jika Anda peduli dengan kinerja: perbandingan string MSDN )sumber
terlihat seperti demo ini:
void Main() { foreach(var f in GetFilesToProcess("c:\\", new[] {".xml", ".txt"})) Debug.WriteLine(f); } private static IEnumerable<string> GetFilesToProcess(string path, IEnumerable<string> extensions) { return Directory.GetFiles(path, "*.*") .Where(f => extensions.Contains(Path.GetExtension(f).ToLower())); }
sumber
Path.GetExtension
yang dapat Anda gunakan.@Daniel B, terima kasih atas saran untuk menulis versi saya sendiri untuk fungsi ini. Ini memiliki perilaku yang sama seperti Directory.GetFiles, tetapi mendukung pemfilteran regex.
string[] FindFiles(FolderBrowserDialog dialog, string pattern) { Regex regex = new Regex(pattern); List<string> files = new List<string>(); var files=Directory.GetFiles(dialog.SelectedPath); for(int i = 0; i < files.Count(); i++) { bool found = regex.IsMatch(files[i]); if(found) { files.Add(files[i]); } } return files.ToArray(); }
Saya merasa itu berguna, jadi saya pikir saya akan berbagi.
sumber
c # versi jawaban @ qfactor77. Ini adalah cara terbaik tanpa LINQ.
string[] wildcards= {"*.mp4", "*.jpg"}; ReadOnlyCollection<string> filePathCollection = FileSystem.GetFiles(dirPath, Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, wildcards); string[] filePath=new string[filePathCollection.Count]; filePathCollection.CopyTo(filePath,0);
sekarang kembalikan
filePath
larik string. Pada awalnya Anda membutuhkanusing Microsoft.VisualBasic.FileIO; using System.Collections.ObjectModel;
Anda juga perlu menambahkan referensi ke
Microsoft.VisualBasic
sumber
Saya melakukan cara sederhana untuk mencari ekstensi sebanyak yang Anda butuhkan, dan tanpa ToLower (), RegEx, foreach ...
List<String> myExtensions = new List<String>() { ".aspx", ".ascx", ".cs" }; // You can add as many extensions as you want. DirectoryInfo myFolder = new DirectoryInfo(@"C:\FolderFoo"); SearchOption option = SearchOption.TopDirectoryOnly; // Use SearchOption.AllDirectories for seach in all subfolders. List<FileInfo> myFiles = myFolder.EnumerateFiles("*.*", option) .Where(file => myExtensions .Any(e => String.Compare(file.Extension, e, CultureInfo.CurrentCulture, CompareOptions.IgnoreCase) == 0)) .ToList();
Bekerja pada .Net Standard 2.0.
sumber
Anda bisa melakukannya seperti ini
new DirectoryInfo(path).GetFiles().Where(Current => Regex.IsMatch(Current.Extension, "\\.(aspx|ascx)", RegexOptions.IgnoreCase)
sumber
var filtered = Directory.GetFiles(path) .Where(file => file.EndsWith("aspx", StringComparison.InvariantCultureIgnoreCase) || file.EndsWith("ascx", StringComparison.InvariantCultureIgnoreCase)) .ToList();
sumber
Hanya ingin mengatakan bahwa jika Anda menggunakan
FileIO.FileSystem.GetFiles
alih-alihDirectory.GetFiles
, ini akan memungkinkan serangkaian karakter pengganti.Sebagai contoh:
Dim wildcards As String() = {"*.html", "*.zip"} Dim ListFiles As List(Of String) = FileIO.FileSystem.GetFiles(directoryyouneed, FileIO.SearchOption.SearchTopLevelOnly, wildcards).ToList
sumber
FileIO
?