Перейти к содержанию

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


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). Далее логиниться на ФТП-сервер, считывать список файлов/директорий и смотреть, появилось ли что-то новое с момента предыдущего логина. Как вариант, не хранить постоянно список файлов/директорий на клиенте (и не сравнивать по факту появления новых записей в этом списке), а только анализировать время появления файлов на ФТП и сравнивать с временем последней проверки.

 

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

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

Вопросы:

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

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

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

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

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;

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

  • 2 weeks later...

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

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

×
×
  • Создать...