2010-05-31 3 views
24

В настоящее время мое приложение использует string [] subdirs = Directory.GetDirectories (путь), чтобы получить список подкаталогов, и теперь я хочу извлечь путь к последнему (последний измененный) подкаталог в списке.Как получить новейший (последний измененный) каталог [C#]

Что является самым простым способом достичь этого? (эффективность не является серьезной проблема - но надежность является)

+0

Должна ли она быть рекурсивными (все потомки)? –

ответ

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

Самые последние FOLDER (инсайдерские файлы неактуальны) – Shaitan00

+0

В этом случае 'Directory.GetLastWriteTime' - это то, что вам нужно. Решение Laramie также работает, что в значительной степени, как я говорил (он был достаточно любезен, чтобы написать код для вас;) –

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 Это работает только в том случае, если каталог создается во время работы приложения, что не обязательно верно на основе информации, предоставленной в вопросе. –

+2

Именно поэтому я указал службу Windows, подразумевая, что она будет работать все время. –

+0

Это не обязательно так. Службы можно запускать и останавливать или запускать с перерывами (я бы сказал, что это плохой дизайн, но это отдельная проблема). Этот метод не будет уведомлять приложение, если папка была создана до того, как приложение было * установлено *, например. –

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

Смежные вопросы