2009-04-16 36 views
33

Làm cách nào để loại trừ loại tệp nhất định khi nhận tệp từ thư mục?Loại trừ một số phần mở rộng tệp nhất định khi nhận tệp từ thư mục

tôi đã cố gắng

var files = Directory.GetFiles(jobDir); 

Nhưng có vẻ như rằng chức năng này chỉ có thể chọn các loại tập tin mà bạn muốn bao gồm, không loại trừ.

+0

Duplicate điều này: http://stackoverflow.com/questions/163162/can-you-call-directory-getfiles-with-multiple-filters –

+3

Không, không hẳn là một người bị mắc mưu. – Graviton

+0

Bản sao có thể có của [C# - Lấy danh sách các tệp trừ những tệp bị ẩn] (http://stackoverflow.com/questions/2418270/c-sharp-get-a-list-of-files-excluding-those-that -are-hidden) – TarmoPikaro

Trả lời

70

Bạn nên lọc những tập tin bản thân, bạn có thể viết một cái gì đó như thế này:

var files = Directory.GetFiles(jobDir).Where(name => !name.EndsWith(".xml")); 
+0

Theo như tôi bây giờ, EndsWith lấy các chữ cái viết hoa vào tài khoản, có nghĩa là nếu filetype là .XML, nó sẽ không loại trừ nó. –

+3

'var files = Directory.GetFiles (jobDir) .Where (name =>! Name.EndsWith (". Xml ", true));' –

+1

'var files = Directory.GetFiles (jobDir) .Where (name =>! name.EndsWith (". xml", StringComparison.OrdinalIgnoreCase)); ' – nothingisnecessary

0

Afaik không có cách nào để chỉ định các mẫu loại trừ. Bạn phải làm điều đó bằng tay, như:

string[] files = Directory.GetFiles(myDir); 
foreach(string fileName in files) 
{ 
    DoSomething(fileName); 
} 
+2

Cảm ơn, nhưng tự làm nó là một cái gì đó tôi thực sự không thích – Graviton

+0

Có lẽ bạn có thể lấy được lớp thư mục của riêng bạn từ System.IO.Directory cơ sở nếu có thể (tôi đã không cố gắng). – Biri

9

Tôi đoán bạn có thể sử dụng biểu thức lambda

var files = Array.FindAll(Directory.GetFiles(jobDir), x => !x.EndWith(".myext")) 
+0

Câu trả lời hay này phù hợp với tôi –

11

Bạn có thể thử một cái gì đó như thế này:

var allFiles = Directory.GetFiles(@"C:\Path\", ""); 
    var filesToExclude = Directory.GetFiles(@"C:\Path\", "*.txt"); 
    var wantedFiles = allFiles.Except(filesToExclude); 
+0

Công trình này xuất sắc trong tất cả các dạng của lệnh GetFiles(). Nó không giải quyết được câu hỏi một cách chính xác nhưng bạn nhận được lợi ích bổ sung của việc tận dụng tham số searchPattern, điều này mạnh hơn nhiều so với việc chỉ nhìn vào các phần mở rộng. –

+2

Lời khuyên: điều này sẽ không hoạt động với phương thức cá thể 'DirectoryInfo.GetFiles()': nó trả về một mảng của FileInfo (thay cho chuỗi), một lớp không thể so sánh/không cân bằng. –

-4
string[] filesToDelete = Directory.GetFiles(@"C:\Temp", "*.der"); 

foreach (string fileName in filesToDelete) 
{ 
    File.Delete(fileName); 
} 
+4

Bạn rõ ràng không đọc câu hỏi. -1 –

+3

đây là giải pháp, nhưng rất triệt để – miky

+1

lol. – Justin

0

Đây là phiên bản của tôi về câu trả lời tôi đọc trên

List<FileInfo> fileInfoList = ((DirectoryInfo)new DirectoryInfo(myPath)).GetFiles(fileNameOnly + "*").Where(x => !x.Name.EndsWith(".pdf")).ToList<FileInfo>(); 
6

Tôi biết, đây là một yêu cầu cũ, nhưng về tôi nó luôn luôn quan trọng.

nếu bạn muốn exlude một danh sách các phần mở rộng tập tin: (dựa trên https://stackoverflow.com/a/19961761/1970301)

var exts = new[] { ".mp3", ".jpg" }; 



public IEnumerable<string> FilterFiles(string path, params string[] exts) { 
    return 
     Directory 
     .GetFiles(path, SearchOption.AllDirectories) 
     .Where(file => !exts.Any(x => file.Extension.EndsWith(x, StringComparison.OrdinalIgnoreCase))); 
} 
3

Bạn có thể thử này,

var directoryInfo = new DirectoryInfo("C:\YourPath"); 
var filesInfo = directoryInfo.GetFiles().Where(x => x.Extension != ".pdb"); 
0

tôi đi qua đây tìm kiếm một phương pháp để làm điều này, nơi loại trừ có thể sử dụng các quy tắc mẫu tìm kiếm chứ không chỉ logic kiểu EndWith.

ví dụ: Trình tìm kiếm ký tự đại diện mẫu tìm kiếm phù hợp:

  • * (dấu sao) 0 hoặc nhiều ký tự ở vị trí đó.
  • ? (dấu chấm hỏi) Không hoặc một ký tự ở vị trí đó.

Điều này có thể được sử dụng cho phần trên như sau.

string dir = @"C:\Temp"; 
var items = Directory.GetFiles(dir, "*.*").Except(Directory.GetFiles(dir, "*.xml")); 

Hoặc để loại trừ các mục có thể được bao gồm.

string dir = @"C:\Temp"; 
var items = Directory.GetFiles(dir, "*.txt").Except(Directory.GetFiles(dir, "*HOLD*.txt")); 
Các vấn đề liên quan