Заархивировано

Эта тема находится в архиве и закрыта для дальнейших ответов.

AJIEX

Проверка нового файла

Рекомендуемые сообщения

Есть ФТП на который необходимо постоянно заходить и проверять наличие нового файла.

Как организовать автоматическую проверку (например через каждые 30 мин.) и выдачу пользователю сообщение о новом файле?

Может есть у кого ссылка или исходник?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

$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" - не везде будет работать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нужно чтоб сворачивалась в трей

автоматом проверяла и выдовала звук (сообщение)

при том что на ФТП создаются папки, а в них, файлы за которыми и требуется следить

вобщем это не обезательно может быть на делфи, можно и Си

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вобщем нашёл вот что

Пример на основе простого модуля-класса, осуществляющего просмотр буфера обмена.

--------------------------------------------------------------------------------

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.

 

Я так думаю потребуется за поминать в буфере список файлов которые были и проверять нет ли новых файлов.

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

Нужно выделять кусок памяти и не довать его опустошать (перезаписывать) винде.

У кого какие соображения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Вобщем нашёл вот что

Пример на основе простого модуля-класса, осуществляющего просмотр буфера обмена.

...

Я так думаю потребуется за поминать в буфере список файлов которые были и проверять нет ли новых файлов.

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

Нужно выделять кусок памяти и не довать его опустошать (перезаписывать) винде.

У кого какие соображения?

 

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

 

С Уважением, А. Галилов

Поделиться сообщением


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

 

С Уважением, А. Галилов

Про ФТП понятно.

Вопросы:

Как логеница по таймеру?

Я так понял, ты предлагаешь проверять у каждого файла дату и время создания? Если да, то каким образом и где хранить данные о последнем входе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как отправить прогу в трей я нашёл (cooltray).

Как заходить на ФТП тоже нашёл.

Вопрос:

Как логеница по таймеру на ФТП?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

procedure TForm1.Timer1Timer(Sender: TObject);

begin

Как заходить на ФТП тоже нашёл.

end;

end.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как лучше сделать?

1) Прога конектится по таймеру, проверяет наличие новых файлов, выдаёт сообщение (если есть новый файл) и дисконектится.

2) Прога конектится, проверяет наличие новых файлов по таймеру, выдаёт сообщение (если есть новый файл). -- т.е. дисконект не происходит.

 

Вопрос остаётся актуален:

Как организовать проверку нового файла?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Получать список файлов и сравнивать с предыдущем списком. Или ты не знаешь как получить список файлов?

Куда сохранять предыдущей список файлов?

Замечу, что там ещё и каталоги и в них файлы.

 

Допустим, есть ФТП, на нём создаётся папка с названием месяца и в ней файлы. Каждые несколько часов создаются файлы. Каждый месяц папки.

Вот мне и нужно оповещение о новых файлах!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

есть компонет файл лист бокс )... там просто слидишь за значением каунс и все .. если каунтпердпериод не равно каунтследпериод значит шоумесага АЛЕСКАПУТ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
есть компонет файл лист бокс )... там просто слидишь за значением каунс и все .. если каунтпердпериод не равно каунтследпериод значит шоумесага АЛЕСКАПУТ

Я не настолько шарю, чтоб со слов написать.

Это первая моя прога, до этого только простенькие делал, типа: 2+2= или поиск в массиве максимального числа, ну т.д.

Напиши примерный код, как оно должно выглядеть. :unsure:

 

p.s. Мне на форму не нужно выводить список файлов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Как организовать проверку нового файла?

Сделай обход по всем файлам --> результаты(имя, путь, дата создания) в файлик у себя клади --> при запуске сравнивай --> выдавай разницу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Блин обыскался в инете про idFTP и ничего не подходит для решения моего вопроса.

Может кто-то просветит в данном вопросе.

 

p.s. Как получить список всех файлов на ФТП включая и в подкаталогах?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня ругается на строку и непойму почему

idFTP.ChangeDir(Path);

и на эту

IdFTP.TransferType := ftASCII;

и на эту

IdFTP.List(LS);

хотя обьявлена LS: TStringList;

 

в uses прописаны:

IdFTP,IdFTPList,IdFTPCommon

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну как.

у всех фтп серверов данные можно передать в бинарном (ASCII) виде и в текстовом.

можно включить passive mode а можно нет . Эти две опции устанавливаются(либо нет) в любом фтп соединении. Для начала добейся просто считать список файлов с открываемой по дефолту (корень фтп) директории. Как добьешься - значит соединение правильное, потом уже копай в сторону чего тебе там нужно. Проще понять - открой фтп-клиент и поиграйся настройками, потом включай нужные опции в своей программе...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
ну как.

у всех фтп серверов данные можно передать в бинарном (ASCII) виде и в текстовом.

можно включить passive mode а можно нет . Эти две опции устанавливаются(либо нет) в любом фтп соединении. Для начала добейся просто считать список файлов с открываемой по дефолту (корень фтп) директории. Как добьешься - значит соединение правильное, потом уже копай в сторону чего тебе там нужно. Проще понять - открой фтп-клиент и поиграйся настройками, потом включай нужные опции в своей программе...

Да открывал уже, скачал и книги по Indy и демки, но там всё не то что мне нужно.

 

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

Неужеле тяжело написать код. А может большинство и сами незнают как это сделать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Я думаю, что большинство не пишет на делфи. Да и если пишет, то лень ковыряться в справочниках.:)

А на чём пишут, С ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

кто может про коментировать каждую строку (что делает).

 

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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо огромное ты единственный кто откликнулся!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может на Делфи для вас сложно, тогда на С++ подскажите :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты