Jaka jest składnia ustawiania wielu rozszerzeń plików na searchPattern
włączone Directory.GetFiles()
? Na przykład odfiltrowywanie plików z rozszerzeniami .aspx i .ascx .
// TODO: Set the string 'searchPattern' to only get files with
// the extension '.aspx' and '.ascx'.
var filteredFiles = Directory.GetFiles(path, searchPattern);
Aktualizacja : LINQ nie jest opcją , musi być searchPattern
przekazana do GetFiles
, jak określono w pytaniu.
c#
.net
system.io.directory
Seb Nilsson
źródło
źródło
Odpowiedzi:
Uważam, że nie ma rozwiązania gotowego do użycia, jest to ograniczenie metody Directory.GetFiles.
Jednak napisanie własnej metody jest dość łatwe, oto przykład .
Kod mógłby wyglądać następująco:
źródło
Edytuj 2014-07-23
Możesz to zrobić w .NET 4.5, aby przyspieszyć wyliczanie:
Directory.EnumerateFiles w MSDN
źródło
GetFiles
zwracastring[]
.Directory.EnumerateFiles
dla zwiększenia wydajności ... stackoverflow.com/questions/5669617/file.EndsWith("...", StringComparison.InvariantCultureIgnoreCase);
zamiastToLower
GetFiles może dopasować tylko jeden wzorzec, ale możesz użyć Linq do wywołania GetFiles z wieloma wzorcami:
Zobacz sekcję komentarzy tutaj: http://www.codeproject.com/KB/aspnet/NET_DirectoryInfo.aspx
źródło
new string[]{"*.txt","filename.*"}
. Jednak wywołanie wDistinct
rzeczywistości nie rozwiązuje tego problemu, ponieważ obiekty FileInfo są porównywane przy użyciu równości odwołań, a nie równości semantycznej. Można to naprawić, usuwającDistinct
lub przekazując plikIEqualityComparer<FileInfo>
. Edytowany, aby zrobić pierwszy.SelectMany
będzie to powtarzać tę samą strukturę plików (i znowu), więc może to być nieoptymalne pod względem wydajności.Podoba mi się ta metoda, ponieważ jest czytelna i pozwala uniknąć wielu iteracji katalogu:
źródło
HashSet<string>
Obawiam się, że będziesz musiał coś takiego zrobić, zmutowałem stąd wyrażenie regularne .
źródło
Directory.EnumerateFiles
aby zwiększyć wydajność ( jaka jest różnica między Directory.EnumerateFiles a Directory.GetFiles? )Lub może być szybsze dzielenie i scalanie twoich globów (przynajmniej wygląda czysto):
źródło
Rozwiązanie łatwe do zapamiętania, leniwe i być może niedoskonałe:
źródło
Użyłbym następujących:
EDYCJA: poprawiono z powodu niezgodności między Directory i DirectoryInfo
źródło
Bardziej wydajnym sposobem uzyskiwania plików z rozszerzeniami „.aspx” i „.ascx”, który pozwala uniknąć wielokrotnego sprawdzania systemu plików i zwracania wielu niepożądanych plików, jest wstępne filtrowanie plików przy użyciu przybliżonego wzorca wyszukiwania i aby później doprecyzować wynik:
źródło
Spróbowałbym określić coś takiego
powinno działać.
źródło
źródło
źródło
Zamiast funkcji EndsWith wybrałbym
Path.GetExtension()
zamiast tego metodę. Oto pełny przykład:lub:
(Użyj,
StringComparison.OrdinalIgnoreCase
jeśli zależy Ci na wydajności: porównania ciągów MSDN )źródło
wygląda jak to demo:
źródło
Path.GetExtension
czego możesz użyć.@Daniel B, dziękuję za sugestię napisania własnej wersji tej funkcji. Zachowuje się tak samo jak Directory.GetFiles, ale obsługuje filtrowanie wyrażeń regularnych.
Uznałem to za przydatne, więc pomyślałem, że się nim podzielę
źródło
wersja c # odpowiedzi @ qfactor77. To najlepszy sposób bez LINQ.
teraz zwraca
filePath
tablicę ciągów. Na początku potrzebujeszmusisz również dodać odniesienie do
Microsoft.VisualBasic
źródło
Zrobiłem prosty sposób, aby wyszukać tyle rozszerzeń, ile potrzebujesz, i bez ToLower (), RegEx, foreach ...
Praca na .Net Standard 2.0.
źródło
Możesz to zrobić w ten sposób
źródło
źródło
Chciałbym tylko powiedzieć, że jeśli używasz
FileIO.FileSystem.GetFiles
zamiastDirectory.GetFiles
, pozwoli to na tablicę symboli wieloznacznych.Na przykład:
źródło
FileIO
?