Как найти дату и время самого последнего файла - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь заставить консольное приложение работать в фоновом режиме и проверить, не было ли новых файлов создано в течение часа. Теперь я сталкиваюсь с проблемой, как получить время самого последнего файла в папке.

Вот что я попробовал:

string path1 = @"C:\Users\nx011116\Documents\test folder\server";
string[] subdir1 = Directory.GetDirectories(path1);
for (int a = 0; a < subdir1.Length; a++)
{
    var directory = new DirectoryInfo(subdir1[a]);
    var myFile = directory.GetFiles()
       .OrderByDescending(f => f.LastWriteTime)
       .First();

    Console.WriteLine(myFile);
}

В результате я получаю последний файл в папке. Это консольное приложение работает в фоновом режиме?

Теперь я могу получить DateTime самого последнего файла в папке. Но как я могу найти, если в папке нет новых файлов в течение часа?

Обновленный код

string path1 = @"C:\Users\nx011116\Documents\test folder\server";
string[] subdir1 = Directory.GetDirectories(path1);
for (int a = 0; a < subdir1.Length; a++)
{
    var directory = new DirectoryInfo(subdir1[a]);
    var myFile = directory.GetFiles()
        .OrderByDescending(f => f.LastWriteTime)
        .First();

    Console.WriteLine(myFile.LastAccessTime.ToString());
}

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

System.IO.FileSystemWatcher

public static async Task Main(string[] args)
{
    string dir = @"C:\tmp";

    var watcher = new System.IO.FileSystemWatcher();
    watcher.Path = dir;
    //watcher.NotifyFilter = ; //Add filters if desired
    watcher.Filter = "*.*";
    watcher.Changed += 
       (source, e) =>  Console.WriteLine($"{DateTime.UtcNow}: {e.ChangeType} {e.FullPath}");
    watcher.Created +=
      (source, e) => Console.WriteLine($"{DateTime.UtcNow}: {e.ChangeType} {e.FullPath}");
    watcher.EnableRaisingEvents = true;

    Console.ReadLine();
}

Пример вывода

15/10/2019 00:49:24: Created C:\tmp\New Text Document.txt
15/10/2019 00:49:30: Changed C:\tmp\New Text Document.txt
15/10/2019 00:49:30: Changed C:\tmp\New Text Document.txt


Directory.GetLastWriteTimeUtc

Если вы просто хотите определить, есть ли новыефайлы в верхнем каталоге (нет в подкаталогах) вы можете использовать Directory.GetLastWriteTimeUtc(String).

Обратите внимание на примечание:

Этот метод может возвращать неточное значение, потому что он использует nativeфункции, значения которых не могут постоянно обновляться операционной системой.


Наивный

Для полноты здесь приведено очень явное решение для жесткого диска.

string dir = @"C:\tmp";

while (true)
{
    Console.WriteLine($"");

    var desiredSinceUtc = DateTime.UtcNow.AddSeconds(-5);

    var files = System.IO.Directory.EnumerateFiles(dir, "*", System.IO.SearchOption.AllDirectories);
    var freshFiles = files.Where(f => System.IO.File.GetLastWriteTimeUtc(f) > desiredSinceUtc);

    foreach ( var f in freshFiles )
    {
        Console.WriteLine($"\t{f}");
    }
    await Task.Delay(TimeSpan.FromSeconds(5));
}
1 голос
/ 15 октября 2019

Простым решением было бы подсчитать общее количество файлов и сохранить его в переменной. В следующий раз проверьте, не превышает ли общее количество файлов предыдущее значение общего количества. Если он равен, значит, нового файла нет.

...