2010-05-31 23 views
24

Hiện tại ứng dụng của tôi sử dụng chuỗi [] subdirs = Directory.GetDirectories (đường dẫn) để lấy danh sách thư mục con, và bây giờ tôi muốn trích xuất đường dẫn đến thư mục mới nhất (sửa đổi cuối cùng) thư mục con trong danh sách.Cách lấy thư mục mới nhất (sửa đổi lần cuối) [C#]

Cách dễ nhất để thực hiện việc này là gì? (hiệu quả không phải là mối quan tâm chính - nhưng độ mạnh là)

+0

nó nên được đệ quy (tất cả con cháu)? –

Trả lời

12

mà không sử dụng LINQ

DateTime lastHigh = new DateTime(1900,1,1); 
string highDir; 
foreach (string subdir in Directory.GetDirectories(path)){ 
    DirectoryInfo fi1 = new DirectoryInfo(subdir); 
    DateTime created = fi1.LastWriteTime; 

    if (created > lastHigh){ 
     highDir = subdir; 
     lastHigh = created; 
    } 
} 
1

Bạn có thể sử dụng Directory.GetLastWriteTime (hoặc Directory.GetLastWriteTimeUtc, trong trường hợp này bạn không thực sự so sánh tương đối).

Mặc dù bạn chỉ muốn xem thời gian "đã sửa đổi" như được hệ điều hành báo cáo hoặc bạn có muốn tìm thư mục có tệp được sửa đổi gần đây nhất bên trong không? Chúng không phải lúc nào cũng khớp (tức là, hệ điều hành không phải lúc nào cũng cập nhật thư mục chứa "lần sửa đổi cuối cùng" khi nó sửa đổi một tệp).

+0

FOLDER gần đây nhất (tệp nội bộ không liên quan) – Shaitan00

+0

Trong trường hợp đó, 'Directory.GetLastWriteTime' là những gì bạn đang theo dõi. Giải pháp của Laramie cũng hoạt động, khá nhiều như tôi đã nói (anh ta đủ tử tế để viết mã cho bạn); –

37

Non-đệ quy:

new DirectoryInfo(path).GetDirectories() 
         .OrderByDescending(d=>d.LastWriteTimeUtc).First(); 

đệ quy:

new DirectoryInfo(path).GetDirectories("*", 
    SearchOption.AllDirectories).OrderByDescending(d=>d.LastWriteTimeUtc).First(); 
0

Nếu bạn đang xây dựng một dịch vụ cửa sổ và bạn muốn được thông báo khi mới tệp hoặc thư mục được tạo, bạn cũng có thể sử dụng FileSystemWatcher. Phải thừa nhận là không dễ dàng, nhưng thú vị để chơi với. :)

+0

-1 Điều này chỉ hoạt động nếu thư mục được tạo trong khi ứng dụng đang chạy, điều này không nhất thiết phải đúng dựa trên thông tin được cung cấp trong câu hỏi. –

+2

Đó là lý do tại sao tôi chỉ định một dịch vụ cửa sổ, ngụ ý rằng nó sẽ luôn luôn chạy. –

+0

Điều đó không nhất thiết phải đúng. Dịch vụ có thể được bắt đầu và dừng lại, hoặc chạy liên tục (tôi cho rằng đó là một thiết kế kém, nhưng đó là một vấn đề riêng biệt). Phương pháp này sẽ không thông báo cho ứng dụng nếu một thư mục được tạo trước khi ứng dụng được * cài đặt *, ví dụ. –

3

Được cảnh báo: Bạn có thể cần phải gọi Refresh() vào mục Thông tin của bạn đối tượng để có được thông tin chính xác:

ví dụ trong câu trả lời Laramie của bạn muốn chỉnh sửa để:

DirectoryInfo fi1 = new DirectoryInfo(subdir); 
fi1.Refresh(); 
DateTime created = fi1.LastWriteTime; 

Nếu không, bạn có thể nhận được thông tin lỗi thời như tôi đã làm:

"Cuộc gọi phải được thực hiện để Refresh trước khi cố gắng để có được những thông tin thuộc tính , hoặc thông tin sẽ lỗi thời. "

http://msdn.microsoft.com/en-us/library/system.io.filesysteminfo.refresh(v=vs.71).aspx

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