AJIEX Опубликовано 28 апреля, 2008 Жалоба Share Опубликовано 28 апреля, 2008 Есть ФТП на который необходимо постоянно заходить и проверять наличие нового файла. Как организовать автоматическую проверку (например через каждые 30 мин.) и выдачу пользователю сообщение о новом файле? Может есть у кого ссылка или исходник? Ссылка на комментарий Поделиться на другие сайты More sharing options...
mr.Faster Опубликовано 29 апреля, 2008 Жалоба Share Опубликовано 29 апреля, 2008 $check_name = "check_file_name.txt"; $conn_id = ftp_connect($array_ftp['ftp_server']); $login_result = ftp_login($conn_id, $array_ftp['ftp_user_name'], $array_ftp['ftp_user_pass']); if($array_ftp['ftp_mode']=="passive"){ftp_pasv($conn_id, true);} if((!$conn_id) || (!$login_result)) { $error_msg = "FTP connection has failed!"; $error_msg .= "Attempted to connect to $ftp_server for user $ftp_user_name"; } $arr_directory = ftp_nlist($conn_id, $array_ftp['ftp_domain'].$array_ftp['ftp_folder']); ftp_close($conn_id); foreach($arr_directory as $value){if($value!="." && $value!=".." && $value!=$check_name){echo "процедура вывода";}} $array_ftp - массив с фтп данными $check_name - твой файл $array_ftp['ftp_folder'] - директория где лежит файл если каждые 30 минут - вешаешь хозяйство на крон еще - $array_ftp['ftp_mode']=="passive" - не везде будет работать Ссылка на комментарий Поделиться на другие сайты More sharing options...
mr.Faster Опубликовано 29 апреля, 2008 Жалоба Share Опубликовано 29 апреля, 2008 пардон, не видел что на делфи Ссылка на комментарий Поделиться на другие сайты More sharing options...
AJIEX Опубликовано 29 апреля, 2008 Автор Жалоба Share Опубликовано 29 апреля, 2008 нужно чтоб сворачивалась в трей автоматом проверяла и выдовала звук (сообщение) при том что на ФТП создаются папки, а в них, файлы за которыми и требуется следить вобщем это не обезательно может быть на делфи, можно и Си Ссылка на комментарий Поделиться на другие сайты More sharing options...
AJIEX Опубликовано 30 апреля, 2008 Автор Жалоба Share Опубликовано 30 апреля, 2008 Вобщем нашёл вот что Пример на основе простого модуля-класса, осуществляющего просмотр буфера обмена. -------------------------------------------------------------------------------- unit ClipboardViewer; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private FNextViewerHandle : THandle; procedure WMDrawClipboard (var message : TMessage); message WM_DRAWCLIPBOARD; procedure WMChangeCBCHain (var message : TMessage); message WM_CHANGECBCHAIN; public end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin // Проверяем работоспособность функции. // При невозможности просмотра буфера обмена // функция возвратит значение Nil. FNextViewerHandle := SetClipboardViewer(Handle); end; procedure TForm1.FormDestroy(Sender: TObject); begin // Восстанавливаем цепочки. ChangeClipboardChain(Handle, FNextViewerHandle); end; procedure TForm1.WMDrawClipboard (var message : TMessage); begin // Вызывается при любом изменении содержимого буфера обмена message.Result := SendMessage(WM_DRAWCLIPBOARD, FNextViewerHandle, 0, 0); end; procedure TForm1.WMChangeCBCHain (var message : TMessage); begin // Вызывается при любом изменении цепочек буфера обмена. if message.wParam = FNextViewerHandle then begin // Удаляем следующую цепочку просмотра. Корректируем внутреннюю переменную. FNextViewerHandle := message.lParam; // Возвращаем 0 чтобы указать, что сообщение было обработано message.Result := 0; end else begin // Передаем сообщение следующему окну в цепочке. message.Result := SendMessage(FNextViewerHandle, WM_CHANGECBCHAIN, message.wParam, message.lParam); end; end; end. Я так думаю потребуется за поминать в буфере список файлов которые были и проверять нет ли новых файлов. Но тогда нельзя пользоватся буфером на компе будет, а то при следующем копировании чего либо, буфер затрётся. Нужно выделять кусок памяти и не довать его опустошать (перезаписывать) винде. У кого какие соображения? Ссылка на комментарий Поделиться на другие сайты More sharing options...
AL-GALI Опубликовано 2 мая, 2008 Жалоба Share Опубликовано 2 мая, 2008 Вобщем нашёл вот что Пример на основе простого модуля-класса, осуществляющего просмотр буфера обмена. ... Я так думаю потребуется за поминать в буфере список файлов которые были и проверять нет ли новых файлов. Но тогда нельзя пользоватся буфером на компе будет, а то при следующем копировании чего либо, буфер затрётся. Нужно выделять кусок памяти и не довать его опустошать (перезаписывать) винде. У кого какие соображения? Приведенный Вами пример не имеет отношения к поставленной задаче. Надо использовать протокол ftp (вероятно, в виде готовой библиотеки, может такая поддержка уже есть в делфи, посмотрите компоненты INDY). Далее логиниться на ФТП-сервер, считывать список файлов/директорий и смотреть, появилось ли что-то новое с момента предыдущего логина. Как вариант, не хранить постоянно список файлов/директорий на клиенте (и не сравнивать по факту появления новых записей в этом списке), а только анализировать время появления файлов на ФТП и сравнивать с временем последней проверки. С Уважением, А. Галилов Ссылка на комментарий Поделиться на другие сайты More sharing options...
AJIEX Опубликовано 2 мая, 2008 Автор Жалоба Share Опубликовано 2 мая, 2008 Приведенный Вами пример не имеет отношения к поставленной задаче. Надо использовать протокол ftp (вероятно, в виде готовой библиотеки, может такая поддержка уже есть в делфи, посмотрите компоненты INDY). Далее логиниться на ФТП-сервер, считывать список файлов/директорий и смотреть, появилось ли что-то новое с момента предыдущего логина. Как вариант, не хранить постоянно список файлов/директорий на клиенте (и не сравнивать по факту появления новых записей в этом списке), а только анализировать время появления файлов на ФТП и сравнивать с временем последней проверки. С Уважением, А. Галилов Про ФТП понятно. Вопросы: Как логеница по таймеру? Я так понял, ты предлагаешь проверять у каждого файла дату и время создания? Если да, то каким образом и где хранить данные о последнем входе. Ссылка на комментарий Поделиться на другие сайты More sharing options...
AJIEX Опубликовано 3 мая, 2008 Автор Жалоба Share Опубликовано 3 мая, 2008 Как отправить прогу в трей я нашёл (cooltray). Как заходить на ФТП тоже нашёл. Вопрос: Как логеница по таймеру на ФТП? Ссылка на комментарий Поделиться на другие сайты More sharing options...
LOM Опубликовано 4 мая, 2008 Жалоба Share Опубликовано 4 мая, 2008 procedure TForm1.Timer1Timer(Sender: TObject); begin Как заходить на ФТП тоже нашёл. end; end. Ссылка на комментарий Поделиться на другие сайты More sharing options...
AJIEX Опубликовано 4 мая, 2008 Автор Жалоба Share Опубликовано 4 мая, 2008 Как лучше сделать? 1) Прога конектится по таймеру, проверяет наличие новых файлов, выдаёт сообщение (если есть новый файл) и дисконектится. 2) Прога конектится, проверяет наличие новых файлов по таймеру, выдаёт сообщение (если есть новый файл). -- т.е. дисконект не происходит. Вопрос остаётся актуален: Как организовать проверку нового файла? Ссылка на комментарий Поделиться на другие сайты More sharing options...
AJIEX Опубликовано 4 мая, 2008 Автор Жалоба Share Опубликовано 4 мая, 2008 Получать список файлов и сравнивать с предыдущем списком. Или ты не знаешь как получить список файлов? Куда сохранять предыдущей список файлов? Замечу, что там ещё и каталоги и в них файлы. Допустим, есть ФТП, на нём создаётся папка с названием месяца и в ней файлы. Каждые несколько часов создаются файлы. Каждый месяц папки. Вот мне и нужно оповещение о новых файлах!!! Ссылка на комментарий Поделиться на другие сайты More sharing options...
LOM Опубликовано 5 мая, 2008 Жалоба Share Опубликовано 5 мая, 2008 есть компонет файл лист бокс )... там просто слидишь за значением каунс и все .. если каунтпердпериод не равно каунтследпериод значит шоумесага АЛЕСКАПУТ Ссылка на комментарий Поделиться на другие сайты More sharing options...
AJIEX Опубликовано 5 мая, 2008 Автор Жалоба Share Опубликовано 5 мая, 2008 есть компонет файл лист бокс )... там просто слидишь за значением каунс и все .. если каунтпердпериод не равно каунтследпериод значит шоумесага АЛЕСКАПУТ Я не настолько шарю, чтоб со слов написать. Это первая моя прога, до этого только простенькие делал, типа: 2+2= или поиск в массиве максимального числа, ну т.д. Напиши примерный код, как оно должно выглядеть. p.s. Мне на форму не нужно выводить список файлов. Ссылка на комментарий Поделиться на другие сайты More sharing options...
MpakV Опубликовано 5 мая, 2008 Жалоба Share Опубликовано 5 мая, 2008 Как организовать проверку нового файла? Сделай обход по всем файлам --> результаты(имя, путь, дата создания) в файлик у себя клади --> при запуске сравнивай --> выдавай разницу. Ссылка на комментарий Поделиться на другие сайты More sharing options...
AJIEX Опубликовано 6 мая, 2008 Автор Жалоба Share Опубликовано 6 мая, 2008 Блин обыскался в инете про idFTP и ничего не подходит для решения моего вопроса. Может кто-то просветит в данном вопросе. p.s. Как получить список всех файлов на ФТП включая и в подкаталогах? Ссылка на комментарий Поделиться на другие сайты More sharing options...
AJIEX Опубликовано 7 мая, 2008 Автор Жалоба Share Опубликовано 7 мая, 2008 у меня ругается на строку и непойму почему idFTP.ChangeDir(Path); и на эту IdFTP.TransferType := ftASCII; и на эту IdFTP.List(LS); хотя обьявлена LS: TStringList; в uses прописаны: IdFTP,IdFTPList,IdFTPCommon Ссылка на комментарий Поделиться на другие сайты More sharing options...
mr.Faster Опубликовано 7 мая, 2008 Жалоба Share Опубликовано 7 мая, 2008 ну как. у всех фтп серверов данные можно передать в бинарном (ASCII) виде и в текстовом. можно включить passive mode а можно нет . Эти две опции устанавливаются(либо нет) в любом фтп соединении. Для начала добейся просто считать список файлов с открываемой по дефолту (корень фтп) директории. Как добьешься - значит соединение правильное, потом уже копай в сторону чего тебе там нужно. Проще понять - открой фтп-клиент и поиграйся настройками, потом включай нужные опции в своей программе... Ссылка на комментарий Поделиться на другие сайты More sharing options...
AJIEX Опубликовано 7 мая, 2008 Автор Жалоба Share Опубликовано 7 мая, 2008 ну как. у всех фтп серверов данные можно передать в бинарном (ASCII) виде и в текстовом. можно включить passive mode а можно нет . Эти две опции устанавливаются(либо нет) в любом фтп соединении. Для начала добейся просто считать список файлов с открываемой по дефолту (корень фтп) директории. Как добьешься - значит соединение правильное, потом уже копай в сторону чего тебе там нужно. Проще понять - открой фтп-клиент и поиграйся настройками, потом включай нужные опции в своей программе... Да открывал уже, скачал и книги по Indy и демки, но там всё не то что мне нужно. з.ы. Не ну я тоже люблю чтоб человек подумал своей головой, но когда вижу что человек действительно хочет, но не понимает, подсказываю. Неужеле тяжело написать код. А может большинство и сами незнают как это сделать. Ссылка на комментарий Поделиться на другие сайты More sharing options...
AJIEX Опубликовано 10 мая, 2008 Автор Жалоба Share Опубликовано 10 мая, 2008 Я думаю, что большинство не пишет на делфи. Да и если пишет, то лень ковыряться в справочниках. А на чём пишут, С ? Ссылка на комментарий Поделиться на другие сайты More sharing options...
AJIEX Опубликовано 12 мая, 2008 Автор Жалоба Share Опубликовано 12 мая, 2008 кто может про коментировать каждую строку (что делает). procedure TMainForm.ChageDir(DirName: string); var LS: TStringList; begin LS:=TStringList.Create; try IdFTP1.ChangeDir(DirName); IdFTP1.TransferType:=ftASCII; CurrentDirEdit.Text:=IdFTP1.RetrieveCurrentDir; DirectoryListBox.Items.Clear; IdFTP1.List(LS); DirectoryListBox.Items.Assign(LS); if DirectoryListBox.Items.Count>0 then if AnsiPos('total', DirectoryListBox.Items[0])>0 then DirectoryListBox.Items.Delete(0); finally LS.Free; end; end; procedure TMainForm.DirectoryListBoxDblClick(Sender: TObject); var Name: string; begin if not IdFTP1.Connected then Exit; Name:=IdFTP1.DirectoryListing.Items[DirectoryListBox.ItemIndex].FileName; if IdFTP1.DirectoryListing.Items[DirectoryListBox.ItemIndex].ItemType=ditDirectory then ChageDir(Name) else begin IdFTP1.TransferType:=ftBinary; BytesToTransfer:=IdFTP1.Size(Name); end end; procedure TMainForm.DirectoryListBoxDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin if Assigned(IdFTP1.DirectoryListing) and (IdFTP1.DirectoryListing.Count>Index) then begin DirectoryListBox.Canvas.FillRect(Rect); with IdFTP1.DirectoryListing.Items[index] do begin DirectoryListBox.Canvas.TextOut(Rect.Left, Rect.Top, FileName); end; end; end; Ссылка на комментарий Поделиться на другие сайты More sharing options...
Alex Novo Опубликовано 12 мая, 2008 Жалоба Share Опубликовано 12 мая, 2008 procedure TMainForm.ChageDir(DirName: string); процедура смены каталога var LS: TStringList; структура - список строк begin LS:=TStringList.Create; создаем список try IdFTP1.ChangeDir(DirName); меняем текущий каталог фтп IdFTP1.TransferType:=ftASCII; меняем режим передачи данных на аскои CurrentDirEdit.Text:=IdFTP1.RetrieveCurrentDir; считываем текущий каталог в метод DirectoryListBox.Items.Clear; очищаем листбокс с каталогами IdFTP1.List(LS); заполняем его именем каталога DirectoryListBox.Items.Assign(LS); if DirectoryListBox.Items.Count>0 then if AnsiPos('total', DirectoryListBox.Items[0])>0 заканчиваем как только попадается подстрока total then DirectoryListBox.Items.Delete(0); finally LS.Free; освобождаем память end; end; procedure TMainForm.DirectoryListBoxDblClick(Sender: TObject); var Name: string; begin if not IdFTP1.Connected если нет подключения к фтп то then Exit; выходим из процедуры Name:=IdFTP1.DirectoryListing.Items[DirectoryListBox.ItemIndex].FileName; берем имя файла if IdFTP1.DirectoryListing.Items[DirectoryListBox.ItemIndex].ItemType=ditDirectory меняем каталог then ChageDir(Name) else begin IdFTP1.TransferType:=ftBinary; двоичный режим передачи BytesToTransfer:=IdFTP1.Size(Name); количество передаваемых байт end end; procedure TMainForm.DirectoryListBoxDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); здесь просто все вышеперечисленное рисуется прямогуольниками на холсте begin if Assigned(IdFTP1.DirectoryListing) and (IdFTP1.DirectoryListing.Count>Index) then begin DirectoryListBox.Canvas.FillRect(Rect); with IdFTP1.DirectoryListing.Items[index] do begin DirectoryListBox.Canvas.TextOut(Rect.Left, Rect.Top, FileName); end; end; end; Ссылка на комментарий Поделиться на другие сайты More sharing options...
AJIEX Опубликовано 12 мая, 2008 Автор Жалоба Share Опубликовано 12 мая, 2008 Спасибо огромное ты единственный кто откликнулся! Ссылка на комментарий Поделиться на другие сайты More sharing options...
Alex Novo Опубликовано 13 мая, 2008 Жалоба Share Опубликовано 13 мая, 2008 Да не за что Ссылка на комментарий Поделиться на другие сайты More sharing options...
AJIEX Опубликовано 21 мая, 2008 Автор Жалоба Share Опубликовано 21 мая, 2008 Может на Делфи для вас сложно, тогда на С++ подскажите Ссылка на комментарий Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Заархивировано
Эта тема находится в архиве и закрыта для дальнейших ответов.