2010-05-31 90 views
24

目前我的應用程序使用string [] subdirs = Directory.GetDirectories(path)來獲取子目錄的列表,現在我想提取最新的路徑最後修改)子目錄。如何獲取最新(最後修改)的目錄[C#]

完成此操作的最簡單方法是什麼? (效率不是主要問題 - 但魯棒性是)

+0

它應該是遞歸(所有後代)? – 2010-05-31 04:13:52

回答

12

不使用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

您可以使用Directory.GetLastWriteTime(或Directory.GetLastWriteTimeUtc,在這種情況下,當您僅進行相對比較時,這並不重要)。

雖然你只是想看看操作系統報告的「修改」時間,或者你是否想找到最近修改過的文件裏面的目錄呢?它們並不總是匹配的(也就是說,操作系統並不總是在修改文件時更新包含「上次修改時間」的目錄)。

+0

最近的文件夾(文件內幕無關緊要) – Shaitan00 2010-05-31 04:11:37

+0

在這種情況下,'Directory.GetLastWriteTime'就是你所追求的。 Laramie的解決方案也行得通,正如我剛剛所說的那樣(他只是非常友好地爲您編寫代碼;) – 2010-05-31 04:30:54

37

非遞歸:

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

遞歸:

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

如果你正在建設一個窗口服務,你想,當一個新的通知文件或目錄已創建,您也可以使用FileSystemWatcher。誠然,並不容易,但玩起來很有趣。 :)

+0

-1這隻適用於在應用程序運行時創建目錄,但這不一定是真實的根據問題中提供的信息。 – 2010-05-31 04:17:21

+2

這正是我指定Windows服務的原因,意味着它將一直在運行。 – 2010-05-31 04:20:11

+0

這不一定是真的。可以啓動和停止服務,或間歇性運行(我認爲這是一個糟糕的設計,但這是一個單獨的問題)。例如,如果在安裝應用程序之前創建文件夾,則此方法不會通知應用程序。 – 2010-05-31 04:23:55

3

被警告:您可能需要調用Refresh()您的目錄信息對象,以獲得正確的信息:

例如在拉勒米的回答你編輯到:

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

否則,你可能會得到過時的信息和我一樣:

「呼籲必須進行刷新嘗試獲取屬性 信息之前,或信息會過時。「

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

相關問題