Russian Qt Forum
Апрель 29, 2024, 19:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как отслеживать появление новых файлов в папке?  (Прочитано 12701 раз)
Dimatorus
Гость
« : Октябрь 20, 2011, 15:52 »

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

Можно ли это сделать средствами Qt. Если нет, то подскажите как это можно сделать. Заранее благодарен.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Октябрь 20, 2011, 15:55 »

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

По теме, QFileSystemWatcher.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Dimatorus
Гость
« Ответ #2 : Октябрь 20, 2011, 15:59 »

Судя по документации, от отслеживает только изменение и удаление файла. А мне нужно чтобы объект мониторил появление файла и посылал соответствующий сигнал.
Записан
Dimatorus
Гость
« Ответ #3 : Октябрь 20, 2011, 16:00 »

а блин... там же есть еще directoryChanged... надо попробовать. Спасибо.
Записан
Dimatorus
Гость
« Ответ #4 : Октябрь 20, 2011, 16:03 »

Еще один вопрос. Когда этот сигнал посылается - это уже значит что он скопировался и я могу его открыть? Или может получиться так что будет копироваться большой файл, сигнал вышлется и я начну пытаться открыть еще не докопированный файл?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Октябрь 20, 2011, 16:07 »

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

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Dimatorus
Гость
« Ответ #6 : Октябрь 20, 2011, 16:12 »

Тогда такой вопрос (я мертвого за..бу, знаю))). Может кто знает, смогу ли открыть файл через open если он еще не скопировался. Возможно к нему не будет доступа? и эту проблему можно будет решить просто в цикле пытаться его открыть?

То что мне нужно, должно примерно выглядеть как автоимпорт в PokerTracker (для тех кто в теме).
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Октябрь 20, 2011, 16:20 »

Сможешь ли ты открыть зависит от того, как файл открывался на запись, по крайней мере под виндой.
Тут почитай про dwShareMode.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
marbius
Гость
« Ответ #8 : Октябрь 25, 2011, 17:33 »

Здравствуйте!

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

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

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

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

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

У этого метода есть и некоторый "побочный эффект": если сохранить последнее состояние контролируемой директории в файл по выходу из программы, а при запуске его считать, то можно получить отслеживание изменений даже при не запущенной программе.
« Последнее редактирование: Октябрь 25, 2011, 17:38 от µarbius » Записан
marbius
Гость
« Ответ #9 : Октябрь 25, 2011, 18:31 »

Но это не вариант, если при копировании файл сразу ресайзится на полный размер.

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

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

Спасибо
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #10 : Октябрь 25, 2011, 21:55 »

Тогда такой вопрос (я мертвого за..бу, знаю))). Может кто знает, смогу ли открыть файл через open если он еще не скопировался. Возможно к нему не будет доступа? и эту проблему можно будет решить просто в цикле пытаться его открыть?

Это ОС-зависимо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.055 секунд. Запросов: 22.