Russian Qt Forum

Qt => Общие вопросы => Тема начата: jjoss от Февраль 09, 2010, 19:49



Название: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: jjoss от Февраль 09, 2010, 19:49
Народ, есть ли в QT инструментарий для проверки того, открыт ли файл другим приложением?
Или всё таки, например, при разработке под Windows использовать API?


Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: gigabyte от Февраль 09, 2010, 20:54
1.Если ты делаешь какую-то системную утилиту, то только с использованием API системы
2. Можешь воспользоваться методом который использует Ворд и ексель, создать временный lock-файл (правда у них это файл отката а не простой lock-файл) и потом проверяешь его наличие и принимаешь соответственное решение


Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: jjoss от Февраль 09, 2010, 20:59
1.Если ты делаешь какую-то системную утилиту, то только с использованием API системы
2. Можешь воспользоваться методом который использует Ворд и ексель, создать временный lock-файл (правда у них это файл отката а не простой lock-файл) и потом проверяешь его наличие и принимаешь соответственное решение

Задача, в общих чертах, состоит в следующем. Есть два сторонних приложения. Первое делает выгрузку данных из базы в файл. Второе отправляет выгруженный файл по почте и УДАЛЯЕТ его. Два действия - выгрузку и отправку - осуществляет пользователь. Задача заключается в том, что нужен робот, который должен отловить момент, когда выгрузка закончена и "забрать" файл.


Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: BRE от Февраль 09, 2010, 21:06
Выгрузка происходит в файл с каким то специальным расширением, например upload. Когда все данные записаны в файл, он переименовывается.

Выгружается         Файл готов к отправке
data1.txt.upload   ->   data.txt


Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: jjoss от Февраль 09, 2010, 21:10
Выгрузка происходит в файл с каким то специальным расширением, например upload. Когда все данные записаны в файл, он переименовывается.

Выгружается         Файл готов к отправке
data1.txt.upload   ->   data.txt
Не получится. Выгружающая система написана давно и не мной. Исходников нет. :(


Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: SimpleSunny от Февраль 09, 2010, 21:13
Если файла нет, а потом он начинает заполняться, то он открывается на запись и читать из него нельзя. Можно проверить наличие файла, а потом пытаться открыть на чтение с некой периодичностью.


Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: BRE от Февраль 09, 2010, 21:15
Не получится. Выгружающая система написана давно и не мной. Исходников нет. :(
Написана давно, исходников нет..... платформа венда?  :)


Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: BRE от Февраль 09, 2010, 21:16
Если файла нет, а потом он начинает заполняться, то он открывается на запись и читать из него нельзя. Можно проверить наличие файла, а потом пытаться открыть на чтение с некой периодичностью.
Тоже подумал использовать QFileSystemWatcher, только возможно что выгрузка идет с разными интервалами.


Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: jjoss от Февраль 09, 2010, 21:17
Не получится. Выгружающая система написана давно и не мной. Исходников нет. :(
Написана давно, исходников нет..... платформа венда?  :)
Да, винда


Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: jjoss от Февраль 09, 2010, 21:19
Если файла нет, а потом он начинает заполняться, то он открывается на запись и читать из него нельзя. Можно проверить наличие файла, а потом пытаться открыть на чтение с некой периодичностью.
Так думал сначала. Но файл не блокируется при заполнении. Так, например, notepad работает - он не блокирует файл. Буду пробовать на основе этого реализовывать http://wasm.ru/article.php?article=lockfileswork. Но, чёт кажется, что есть более простой способ...


Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: SimpleSunny от Февраль 09, 2010, 21:24
Более простого метода нет. А блокнот не блокирует, ибо записывает туда информацию только при желании пользователя. А если программа тупо получила информацию из БД и сразу ее записала в файл, то метод на открытие вполне жизнеспособный.


Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: jjoss от Февраль 09, 2010, 21:37
А если программа тупо получила информацию из БД и сразу ее записала в файл, то метод на открытие вполне жизнеспособный.
Пробовал - не пашет... Придётся заморачиваться с хэндлами :) Всё равно всем спасибо!!!


Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: gigabyte от Февраль 09, 2010, 21:50
сделай батник run.cmd:

myapp
copy result.txt upload.txt

сделай ярлык к нему и выставь на рабочий стол клыэнта
проверяй наличие файла upload.txt


Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: BRE от Февраль 09, 2010, 21:51
Тогда проще клиента заставить руками отчеты отправлять.  ;D


Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: break от Февраль 09, 2010, 21:52
Цитировать
Более простого метода нет. А блокнот не блокирует, ибо записывает туда информацию только при желании пользователя. А если программа тупо получила информацию из БД и сразу ее записала в файл, то метод на открытие вполне жизнеспособный.

Че то не верится в жизнеспособность этого метода где вероятность того что эта чужая программа выгрузки не работает также как вышеупомянутый "блокнот"? То есть работает со своим буфером по мере выгрузки а пишет периодически по таймеру переоткрывая/перезаписывая файл? Кроме того что в вашей фразе значит
Цитировать
сразу ее записала в файл
- как так сразу? может эта выгрузка час длиться будет на реальных данных...

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

Цитировать
Тогда проще клиента заставить руками отчеты отправлять.
Если для выгрузки какая-то спец программа используется - то возможно на той стороне как раз робот сидит и статистику собирает - а человеку сложно вручную будет такое отправлять...



Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: gigabyte от Февраль 09, 2010, 21:58
Тогда проще клиента заставить руками отчеты отправлять.  ;D
Ну незнаю как по мне то проще сказать "Нажми на работем столе красную розу" чем сказать:
Нажми на выгрузку данных, потом зайди на мой компутер, на диск С папка "Данные" и скопируй файл result.txt в файл upload.txt ( И это идеальный вариант). На практике мне приходится около часа обяснять где находится "мой компутер" и что он не "Мой" а "Их" и какую кнопочку надо нажать чтоб там вывсетилось этакое окошечко ;D


Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: jjoss от Февраль 09, 2010, 21:59
Вопрос несколько сложнее из-за человеческого фактора... Пользователи - тёти в возрасте, и новые ярлыки и всякие батники это просто кошмар... Да и клиентов очень много... Вот и изначально идея была - сделать, что бы эти тёти вообще ничего не знали и работали дальше, как и работали... Пока кроме хэндлов идей нет. Буду тестить используя их.


Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: gigabyte от Февраль 09, 2010, 22:02
Вопрос несколько сложнее из-за человеческого фактора... Пользователи - тёти в возрасте, и новые ярлыки и всякие батники это просто кошмар... Да и клиентов очень много... Вот и изначально идея была - сделать, что бы эти тёти вообще ничего не знали и работали дальше, как и работали... Пока кроме хэндлов идей нет. Буду тестить используя их.
Вот я и предлагаю заменить команду в их стардартном ярлыке к которому они привыкли на батник.
У меня здесь 2 фирмы так работают и програмы обновляются и конфиги и все по одному нажатию на ярлык


Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: BRE от Февраль 09, 2010, 22:19
Пока кроме хэндлов идей нет. Буду тестить используя их.
Чем использовать эту "технологию", попробуй сначала реализовать в лоб с QFileSystemWatcher?
Не знаю, как происходит процесс выгрузки, но можно отслеживать появление нового файла в директории и ждать момента, когда он не изменяется некоторое время (например 5 минут), а после этого его отправлять.


Название: Re: Проверка - открыт ли файл другим приложением [QT 4.6.0]
Отправлено: jjoss от Февраль 09, 2010, 22:22
Пока кроме хэндлов идей нет. Буду тестить используя их.
Чем использовать эту "технологию", попробуй сначала реализовать в лоб с QFileSystemWatcher?
Не знаю, как происходит процесс выгрузки, но можно отслеживать появление нового файла в директории и ждать момента, когда он не изменяется некоторое время (например 5 минут), а после этого его отправлять.
В любом случае проверю :) Спасибо!