2014-06-05 24 views
11

Tôi muốn để có được một mảng chuỗi các đường dẫn của tập tin mà không có phần mở rộng. Chúng là các tệp nhị phân không có phần mở rộng nếu có.C# có được đường dẫn tập tin của chỉ các tập tin với phần mở rộng không

Ví dụ, tôi đang tải một nhóm các đường dẫn tập tin ra khỏi thư mục /test/

Tôi muốn chỉ đường dẫn và tên tập tin mà không có một phần mở rộng (vì vậy không .txt, không .csv, không .*)

/test/dontWant.txt

/test/dontWant.csv

/test/doWant

nếu tôi làm:

String[] paths = Directory.GetFiles(fDir, "*.*", SearchOption.AllDirectories); 

Tôi tất nhiên được mọi thứ trong thư mục đó.

nếu tôi sau đó thử:

String[] paths= Directory.GetFiles(fDir, "*", SearchOption.AllDirectories); 

tôi vẫn sẽ nhận được tất cả mọi thứ trong thư mục đó.

Có cách nào để chỉ nhận được các tập tin của những người không có phần mở rộng?


sử dụng "*." đã làm việc, và tôi không biết tại sao tôi không cố gắng mà để bắt đầu.

tôi nên đã được sử dụng EnumerateFiles để bắt đầu.

+2

thử 'String [] đường dẫn = Directory.GetFiles (fDir, "*. ", SearchOption.AllDirectories);' – Grundy

+0

@Grundy Nope. Đó sẽ là bất kỳ tên tệp nào kết thúc bằng dấu chấm. Tôi không biết bất kỳ tập tin nào như thế! – tnw

+0

@tnw, bạn có thử không ??? – Grundy

Trả lời

11

Điều này sẽ giúp:

var filesWithoutExtension = System.IO.Directory.GetFiles(@"D:\temp\").Where(filPath => String.IsNullOrEmpty(System.IO.Path.GetExtension(filPath))); 
foreach(string path in filesWithoutExtension) 
{ 
    Console.WriteLine(path); 
} 

Nó sẽ trả lại tất cả các tập tin w/o mở rộng chỉ trong dir quy định. Nếu bạn muốn bao gồm tất cả các thư mục con bạn sẽ phải sử dụng: System.IO.Directory.GetFiles(@"D:\temp\", "*", SearchOption.AllDirectories).

CẬP NHẬT
Như chàng trai gợi ý, nó tốt hơn để sử dụng Directory.EnumerateFiles vì nó tiêu thụ ít ram.

+0

Mã này hoạt động giống như một ông chủ. Chỉ cần thử nghiệm nó trong một ứng dụng giao diện điều khiển. – Shiva

8

Bạn sẽ cần phải làm một bộ lọc qua thứ 2 trên đó.

//If you are using .NET 3.5 you can still use GetFiles, EnumerateFiles will just use less ram. 
String[] paths = Directory.EnumerateFiles(fDir, "*.*", SearchOption.AllDirectories) 
          .Where(file => Path.GetFileName(file) == Path.GetFileNameWithoutExtension(file)) 
          .ToArray(); 

Vì vậy, điều này không là nó đi đường dẫn tập tin của bạn để GetFileNameGetFileNameWithoutExtension, nếu cả hai người trở lại cùng một chuỗi nó sau đó bao gồm các kết quả trong mảng.

+1

+1 cho 'Directory.EnumerateFiles' và sử dụng ít ram hơn. –

2

Để thay thế cho câu trả lời aleksey.berezan, bạn có thể làm như sau trong .NET 4+. EnumerateFiles sẽ trả về các tệp khi chúng được duyệt qua trong cây thư mục.

foreach(var file in Directory.EnumerateFiles(fDir, "*.*", SearchOption.AllDirectories).Where(s => string.IsNullOrEmpty(Path.GetExtension(s)))) 
{ 

} 
21

Bạn có thể thử với wildcard

String[] paths = Directory.GetFiles(fDir, "*.", SearchOption.AllDirectories); 

này bạn cũng có thể sử dụng ký tự đại diện này với Directory.EnumerateFiles

Directory.EnumerateFiles(fDir, "*.", SearchOption.AllDirectories); 
+0

Điều này chắc chắn xứng đáng có nhiều upvotes hơn. – Habib

Các vấn đề liên quan