4 profy! Мегачтение/удаление файла.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

4 profy! Мегачтение/удаление файла.

Сообщение Scuder » 12.01.2005 (Ср) 0:56

Немного хистори:
Все знают, что такое аська. Кто-то использует саму icq, продвинутые пользователи, надеюсь, юзают trillian. Те, кто используют программы ICQ, знают, что существуют дешифровщики хистори (сам юзал, знаю: хорошо дешифруют!). Те, кто пользуются trillian'ом, знают: трилл не шифрует хистори. И она открыто хранится в соответствующем каталоге в виде обычного txt'шника.

Собственно, цель:
Хочу написать агента, который будет, при включённой записи хистори, брать её, скажем, с интервалом в 20-30 секунд и шифровать в своём каталоге. Трудностей, сбствнно, практически нет. Алгоритм шифрования и принцип работы агента придуман...

Принцип работы:
Сканируем папку с файлами хистори. Если есть новые файлы, читаем из них информацию и удаляем. Информацию кодируем и дописываем в свой файл.

Внимание! Вопрос! ;-)
Допустим, что в конкретный момент времени человек очень активно переписывается с другим человеком. Трилл при этом постоянно дописывает файл с хистори. Как лучше организовать принцип работы? Ведь если я прочту файл (в переменную) и удалю его, на это уйдут какие-то (доли) секунды. Т.е. за время пока я буду читать, а затем удалять, может произойти запись в файл (между чтением и удалением). И таким образом будет потеряна некая информация..

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.01.2005 (Ср) 1:10

Зависит от того, каким образом этот Трилл (что это, кстати?) обращается к файлу, как он его лочит (если лочит) и т.д. etc.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 12.01.2005 (Ср) 1:18

GSerg писал(а):Зависит от того, каким образом этот Трилл (что это, кстати?) обращается к файлу, как он его лочит (если лочит) и т.д. etc.


Трилл = Trillian. Очень советую скачать (не выше 1.0.). Альтернатива аськи. Если кто-то мне скажет, что ICQ-проги лучше - готов плюнуть в лицо! ;-)

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

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.01.2005 (Ср) 1:21

Может, получать hThread этого самого Трилла, саспендить его, тырить файл, а потом резюмить?
Хотя это всё равно некультурно :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 12.01.2005 (Ср) 1:34

GSerg писал(а):Может, получать hThread этого самого Трилла, саспендить его, тырить файл, а потом резюмить?
Хотя это всё равно некультурно :)


GSerg!!! :-) Я, в общем-то, давно на этом форуме.. Я его читаю. :-) Я знаю, что ты гигант мысли и лёгких путей не ищешь. Пользуясь случаем, выражаю тебе моё почтение и уважение (без нотки иронии!) !

Но вопрос был в другом. Имеющий, как я полагаю, гораздо более простое решение. Как организовать чтение и (тут же) удаление файла, без возможности в этот момент записи в него. Знаешь, в оболочках типа wincmd есть кнопка F6 - перемещение. В момент, когда ты это перемещение подтверждаешь, файл реально меняет своё местоположение. При этом, если в него производилась запись после подтверждения, то вся информация сохраняется на месте его предыдушего хранения..

Как, на фиг, это организовать?? :-)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.01.2005 (Ср) 1:49

:lol:

Странно :)
Почему на месте предыдущего хранения?
Хотя, ответ на это вопрос зависит от того, как реализована апишка OpenFile...
В общем, ничего кроме проверки на практике предложить не могу. По идее, он же должен куда-то данные писать? Куда-то запишет...

Хотя почему бы-таки не саспендить? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 12.01.2005 (Ср) 2:06

Почему на месте предыдущего хранения?

Ну а где же ещё? :-)
Подумай: ты открываешь файл \\anybody\shared folder\test.txt на чтение (просмотр), допустим, обычным блокнотом. После этого кто-то открывает его на редактирование, дописывает строки, сохраняет. Ты изменения увидишь? Нет. Только после повторного открытия. Другой вариант: ты открываешь его на просмотр, после этого кто-то этот файл удаляет. Ты ничего не заметишь. Но после закрытия блокнота файл ты заново не откроешь - его больше нет. Теперь мой вариант: открываю файл на чтение. Читаю. Удаляю. Вот в этот момент времени возможна запись удалённой программой! Т.е. между открытием и удалением происходит запись информации, которую я не поимею! :-) Смысл проблемы теперь очевиден? :-)

Хотя, ответ на это вопрос зависит от того, как реализована апишка OpenFile...

У-у. Это я предпочту оставить для тебя. ;-)

В общем, ничего кроме проверки на практике предложить не могу. По идее, он же должен куда-то данные писать? Куда-то запишет...

Конечно! Как я и сказал, на старое место. :-)

Хотя почему бы-таки не саспендить?

Мой тебе совет: если уж начинаешь ругаться, то хотя бы в сносках приводи перевод! ;-)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.01.2005 (Ср) 2:15

Ааааа! Так если блокнот имеется в виду, то он открывает, читает и закрывает! После этого связи между ним и файлом уже нет. Трилл поступает так же или держит файл открытым?

Ну и перевод: позырь функции SuspendThread и ResumeThread :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 12.01.2005 (Ср) 8:03

2 Scuder. Совет по организации периодического чтения файлов.
Попробуй установить запрос на уведомление об изменениях файла:
читай про API:
FindFirstChangeNotification
FindNextChangeNotification
WaitForSingleObject
WaitForMultipleObjects
FindCloseChangeNotification


Scuder писал(а):..В момент, когда ты перемещение подтверждаешь, файл реально меняет своё местоположение. При этом, если в него производилась запись после подтверждения, то вся информация сохраняется на месте его предыдушего хранения..

Как, на фиг, это организовать?? :-)

Извини, а почему не просто -
1. Установить запрос на уведомление
2. При изменении файла: скопировать файл во временный каталог, обработать с запомненного в предыдущий раз места
3. Установить новое уведомление
Правда, сам ничего такого писать не пробовал, врать не буду. А "саспендить", так, нужно еще доступ получить соответствующий..
Есть ли у меня вопрос? У меня всегда есть вопрос

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.01.2005 (Ср) 8:35

А почему бы не пойти другим путем?
Использовать другого клиента; размещать файл логов и хистори (устанавливать аську) на крипто-диск; использовать NTFS; поставить плугины?
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 12.01.2005 (Ср) 13:53

Вообще с файлом лога можно, скорей всего поступить гораздо проще - своей программой переименовывать его в той-же директории и открываем блокируя. Тогда программа чата при следующей попытке записи создаст новый, куда и будет писать новый лог, а старый мы спокойненько и неспеша обрабатываем, потом удаляем. Ну и так далее... Идея понятна? Думаю работать будет.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 12.01.2005 (Ср) 14:08

Trillian - редкостный изврат. В нем все наоборот по сравнению с большинством icq-клиентов: абзац делается по Ctrl+Enter (обычно это отправка сообщения), а отправка делается по просто Enter (обычно это абзац). В подавляющем большинстве клиентов, в том числе и в родном асечном, все так, как в скобках - дико раздражает.

Насчет шифровки: у меня в &RQ в опциях есть галочка "History encryption"... :)

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 12.01.2005 (Ср) 14:17

Но вопрос был в другом. Имеющий, как я полагаю, гораздо более простое решение. Как организовать чтение и (тут же) удаление файла, без возможности в этот момент записи в него.


Код: Выделить всё
 
  h = FreeFile()
  Open FileName For Append Access Read Write Lock Read Write As #h
  Close #h

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 12.01.2005 (Ср) 14:42

Ну я и сказал как это реализовать:

1. Переименуй файл лога Триллиана в том-же каталоге (переименоваться он должен даже если открыт другой программой на запись).
2. Открой его на запись блокируя другой программе (Триллиану) доступ к нему. Если Триллиан закончил в него писать, то ты сможешь открыть файл, а он в следующий раз создаст другой файл лога.
3. Спокойно читай лог и удаляй переименованный файл. Даже если ты будешь делать это полчаса ничего не будет утеряно так как Триллиан лог пишет в файл со своим именем.
4. Через некоторое время иди на пункт 1.

При этом ты ничего не потеряешь.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 12.01.2005 (Ср) 14:58

Konst_One писал(а):
Но вопрос был в другом. Имеющий, как я полагаю, гораздо более простое решение. Как организовать чтение и (тут же) удаление файла, без возможности в этот момент записи в него.


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

Впрочем, вот лучший вариант - можно просто читать родной файл не блокируя его и запоминая количество прочитанных байт, а в следующий раз продолжая со старого места. При этом удалять файл становится совершенно не нужно - только проверять его дату создания (на тот случай если его удалили ручками)... В общем, своей программой читаешь файл лога а Триллиан пусть пишет в него - к чему ему запрещать туда писать-то??? В общем, все зависит от того как Триллиан работает с файлом - это надо пробовать на месте.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 12.01.2005 (Ср) 15:15

2 Scuder Можно искать окно этого самого трилла, и если оно открыто тне удалять файл, а если закрыто то удалять.

Интересно а можно ли отследить обращение трилла к файлу,

если да то как?

и если можно отследить обращение к файлу то тогда отслеживать

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 13.01.2005 (Чт) 8:22

Вот, немножко набросал - один exe-шник пишет файл, другой считывает его и создает копию - в общем показано как все это дело можно понормальному реализовать...
Вложения
Log.rar
(8.2 Кб) Скачиваний: 20
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 16

    TopList