Мониторинг папки для новых файлов в Windows - PullRequest
12 голосов
/ 29 октября 2008

Как лучше всего следить за папкой, чтобы увидеть, когда в нее был добавлен файл изображения? Файлы добавляются примерно раз в минуту, и именование выглядит следующим образом ... image0001.jpg, image0002.jpg, image0003.jpg и т. Д. Мне нужно знать, когда файл был записан в папку, чтобы мое приложение могло получить доступ и использовать это.

Ответы [ 8 ]

14 голосов
/ 29 октября 2008
4 голосов
/ 29 октября 2008

Как уже упоминалось ранее, уведомления об изменении каталога - это то, что вам нужно.

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

Проверьте этот поиск Google для различных решений для ожидания, пока файл не будет полностью записан

Редактировать : Я только что увидел, что вопрос был помечен с ++, и я связался с поиском .Net. Хотя то, что я предоставил, может быть не правильным языком, я думаю, что у вас все равно будут проблемы с Windows независимо от того, с какой системой вы кодируете.

1 голос
/ 17 февраля 2013

Вы можете использовать метод опроса для мониторинга папки. Цикл будет выполняться каждые 5 секунд, например.

Этот метод возвращает список новых файлов:

List<string> files = new List<string>();
string path = @"C:\test\"; // whatever the path is

public List<string> GetNewFiles(string path)
    {
        // store all the filenames (only .jpg files) in a list
        List<string> currentFiles = System.IO.Directory.GetFiles(path, "*.jpg");

        if ( currentFiles.Count() > files.Count() )
        {
            count = newFiles.Length - files.Length;
            List<string> newFiles = new List<string>();

            foreach ( string file in currentFiles )
            {
                if ( !files.Contains(file) )
                {
                    newFiles.Add(file);
                }
             }
         }
         files = currentFiles;
         return newFiles;
    }

Это метод, который будет опрашивать каждые 5 секунд и вызывать предыдущий метод.

public void MonitorFolder()
{
    while (true)
    {
        List<string> newFiles = GetNewFiles(path);
        System.Threading.Thread.Sleep(5000); // 5000 milliseconds
    }
}
1 голос
/ 29 октября 2008

Уведомления об изменениях могут вызвать некоторые накладные расходы, если у вас NTFS, рассмотрите Журналы изменений NTFS .

1 голос
/ 29 октября 2008

FileSystemWatcher сможет сделать это за вас.

0 голосов
/ 31 августа 2018

Это был лучший результат Google для моего поиска, поэтому я добавлю его в качестве ответа.

Если вы используете Qt, есть QFileSystemWatcher . Я не знал, что это существует, и мы случайно использовали Qt, поэтому я потратил больше нескольких часов, используя FindFirstChangeNotification , чтобы переписать то, что было легко доступно для меня, пока коллега не показал мне свет.

Хороший опыт обучения.

0 голосов
/ 08 декабря 2011
0 голосов
/ 29 октября 2008

inotify может быть ваша вещь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...