Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Dimatorus от Октябрь 20, 2011, 15:52



Название: Как отслеживать появление новых файлов в папке?
Отправлено: Dimatorus от Октябрь 20, 2011, 15:52
Нужно сделать программу, которая будет иметь две папки. В одну будут помещаться файлы (к примеру другой программой), а моя программа должна будет их открыть (причем нужно отследить как то чтобы файл полностью скопировался к тому моменту как моя прога захочет его открыть, что б не было утечек), обработать и затем перенести их в другой каталог. То есть она должна будет работать в фоне. Появился файл - она хоп и подхватила его, обработала и утащила в другую папку и ждет следующего.

Можно ли это сделать средствами Qt. Если нет, то подскажите как это можно сделать. Заранее благодарен.


Название: Re: Как отслеживать появление новых файлов в папке?
Отправлено: Пантер от Октябрь 20, 2011, 15:55
Нужно сделать программу, которая будет иметь две папки.
Причем в жесткой извращенной форме. ;D

По теме, QFileSystemWatcher (http://doc.qt.nokia.com/4.7/qfilesystemwatcher.html).


Название: Re: Как отслеживать появление новых файлов в папке?
Отправлено: Dimatorus от Октябрь 20, 2011, 15:59
Судя по документации, от отслеживает только изменение и удаление файла. А мне нужно чтобы объект мониторил появление файла и посылал соответствующий сигнал.


Название: Re: Как отслеживать появление новых файлов в папке?
Отправлено: Dimatorus от Октябрь 20, 2011, 16:00
а блин... там же есть еще directoryChanged... надо попробовать. Спасибо.


Название: Re: Как отслеживать появление новых файлов в папке?
Отправлено: Dimatorus от Октябрь 20, 2011, 16:03
Еще один вопрос. Когда этот сигнал посылается - это уже значит что он скопировался и я могу его открыть? Или может получиться так что будет копироваться большой файл, сигнал вышлется и я начну пытаться открыть еще не докопированный файл?


Название: Re: Как отслеживать появление новых файлов в папке?
Отправлено: Пантер от Октябрь 20, 2011, 16:07
Тут я даже не знаю, как правильнее решить. QFileSystemWatcher тебе просигнализирует при появлении файла. По идее, потом можно в цикле проверять размер файла и если он перестанет изменяться, значит копирование завершено. Но это не вариант, если при копировании файл сразу ресайзится на полный размер. Встроенных средств нет, но можно использовать АПИ конкретной ОС.


Название: Re: Как отслеживать появление новых файлов в папке?
Отправлено: Dimatorus от Октябрь 20, 2011, 16:12
Тогда такой вопрос (я мертвого за..бу, знаю))). Может кто знает, смогу ли открыть файл через open если он еще не скопировался. Возможно к нему не будет доступа? и эту проблему можно будет решить просто в цикле пытаться его открыть?

То что мне нужно, должно примерно выглядеть как автоимпорт в PokerTracker (для тех кто в теме).


Название: Re: Как отслеживать появление новых файлов в
Отправлено: Пантер от Октябрь 20, 2011, 16:20
Сможешь ли ты открыть зависит от того, как файл открывался на запись, по крайней мере под виндой.
Тут (http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx) почитай про dwShareMode.


Название: Re: Как отслеживать появление новых файлов в папке?
Отправлено: marbius от Октябрь 25, 2011, 17:33
Здравствуйте!

Хотя и не совсем по теме, но все-же

А вот мне QFileSystemWatcher не помог ни при каких "усилиях".

Когда мне нужно было отслеживать изменения в директориях (добавление/удаление/переименование/изменение файлов), то единственное, что мне "по-настоящему" смогло помочь, так это просмотр по таймеру содержимого контролируемой директории и сравнение ее с предыдущим состоянием (в моем случае мне хватало 1 проверки в 10 секунд).

Кроме того, я могу однозначно сказать, что и штатные средства Windows давали сбои в контроле за изменением директории (MASM): иногда почему-то "пропускалось" переименование и изменение файла.

Поэтому для себя я сделал вывод, что только таймер и сравнение атрибутов.

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


Название: Re: Как отслеживать появление новых файлов в папке?
Отправлено: marbius от Октябрь 25, 2011, 18:31
Но это не вариант, если при копировании файл сразу ресайзится на полный размер.

Кстати, при использовании вышеописанного мною метода. Для новых файлов, бОльших, чем 50 мБ (не знаю, откуда я взял эту цифру - просто наобум) я считал CRC32 в течение 3х циклов и, если суммы совпадали, то файл считался более неизменным (это я использовал на случай применения разного рода менеджеров загрузок, которые ресайзят, в большинстве случаев, на полный размер)

Пусть метод весьма и извращенный, и нагружающий систему, но вполне оказался работоспособным.

Спасибо


Название: Re: Как отслеживать появление новых файлов в папке?
Отправлено: Alex Custov от Октябрь 25, 2011, 21:55
Тогда такой вопрос (я мертвого за..бу, знаю))). Может кто знает, смогу ли открыть файл через open если он еще не скопировался. Возможно к нему не будет доступа? и эту проблему можно будет решить просто в цикле пытаться его открыть?

Это ОС-зависимо