Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.07;
Скачать: CL | DM;

Вниз

NMFTP + Nlist = Range check error   Найти похожие ветки 

 
Pavelkq   (2005-04-28 10:40) [0]

Здоавствуйте! Пишу ФТП-клиент для синхронизации локальной папки с сервером. Применил NMFTP. Код такой:

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
   TSL: TStringList;
begin
 if NMFTP1.Connected then
    NMFTP1.Disconnect
 else
 begin
   NMFTP1.Vendor := NMOS_AUTO;
   NMFTP1.Host:="hostname";
   NMFTP1.Port:=21;
   NMFTP1.TimeOut:=50000;
   NMFTP1.UserID:="username";
   NMFTP1.Password:="pass";
   NMFTP1.Connect;
   NMFTP1.ChangeDir("mydir");
 end;
 Memo2.Lines.Add("Соединились");

 iii:=0; // - это тип Интегер
 iiiTSL:=TStringList.Create;// - это TStringList
//Завел эту бадягу чисто для отладки. С ними список файлов на ФТП получается правильный, а без них почему-то в 8 раз меньше.

 TSL:=TStringList.Create;// - сюда попадает список файлов на ФТП
 Temp:="";// Тип Стринг
 GetList;

 ShowMessage(IntToStr(iii)+"  "+IntToStr(iiiTSL.Count-1));
//  Проверяю совпадение количества файлов.

 TSL.Text:=copy(Temp,2,Length(Temp)-1);
 TSL.Sorted:=true; // сортирую для дальнейшей обработки
 For i:=0 to TSL.Count-1 do
   Memo4.Lines.Add(TSL[i]);// вывожу
 Memo4.Lines.Add(IntToStr(TSL.Count-1));// Тут же снова количество для отладки
 // Дальше будет сравнение с локальным списком файлов.

end;

Procedure GetList();
begin
 With Form1 do
 begin
   Timer1.Enabled:=true;// - включаю таймер, чтобы не зависло соединение. Может это и лишнее
   Memo2.Lines.Add("Получаю список файлов");
   Edit1.Visible:=True; // Тут отобразится процесс получения списка файлов
   NMFTP1.NList;// Вот тут иногда вылетает та самая ошибка.
   Edit1.Visible:=False;
   Memo2.Lines.Add("Получен каталог "+Form1.NMFTP1.CurrentDir);
 end;
end;

procedure TForm1.NMFTP1ListItem(Listing: String);
begin
 Temp:=Temp+#13+Listing; // Собитаю список файлов для передачи в TStringList
 Edit1.Text:=IntToStr(Length(Temp));// отображение процесса получения. Может можно по другому?
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Timer1.Interval:=60000;
 if NMFTP1.Connected then
   NMFTP1.Disconnect;
 Memo2.Lines.add("Таймер отключил");
end;


 Так вот, иногда что-то не срабатывает и после команды NList вылетает ошибка Range Check Error. Может с таймером что-то напортачил?


 
Cobalt ©   (2005-04-28 13:15) [1]

if NMFTP1.Connected then
   NMFTP1.Disconnect
else
begin
<skip>
  NMFTP1.Connect;
  NMFTP1.ChangeDir("mydir");
end;
Memo2.Lines.Add("Соединились");

if NMFTP1.Connected, то действие
Memo2.Lines.Add("Соединились"); будет неверным.

Это для начала.


 
Pavelkq   (2005-04-28 13:58) [2]

Разобрался с таймером. Получается эта фишка не то, чтобы не помогает, а наоборот, все портит. Убрал полностью таймер. Все пошло лучше. Но теперь вижу, что список файлов на FTP не всегда одинаковый. При общем количестве 829 файлов в списке оказывается от 828 до 832 файлов. При этом я переписал обработку получения списка файлов:

procedure TForm1.NMFTP1ListItem(Listing: String);
begin
 TSL.Add(Listing);
 Edit1.Text:=IntToStr(TSL.Count);
end;

В списке появляются остатки расширения файлов (rar, ar).


 
Pavelkq   (2005-04-28 14:08) [3]

[1] Что Вы имеете в виду? У меня же if NMFTP1.Connected, то действие Дисконект. А только после условия идет вывод информации о соединении. В принципе, вполне возможно, что это лишнее. Но я взял из дельфийской справки.


 
Alexander Panov ©   (2005-04-29 15:08) [4]

Ты неправильно понимаешь работу подобных компонентов.
Они используют при работе событийную модель.
Разберись вот с этим примером, и тебе будет понятно, как работать с подобными компонентами.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Psock, NMFtp;

type
 TForm1 = class(TForm)
   NF: TNMFTP;
   Button1: TButton;
   me: TMemo;
   procedure NFConnect(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure NFListItem(Listing: String);
   procedure NFSuccess(Trans_Type: TCmdType);
 private
   { Private declarations }
 public
   procedure Display(const s: String);
   { Public declarations }
 end;

var
 Form1: TForm1;
 FtpList: TStringList;

implementation

{$R *.dfm}

procedure TForm1.NFConnect(Sender: TObject);
begin
 NF.ChangeDir("pub");
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 NF.Host := "host";
 NF.Port := 21;
 NF.UserID := "Anonymous";
 NF.Password := "anonymous@mail.ru";
 me.Lines.Clear;
 NF.Connect;
end;

procedure TForm1.Display(const s: String);
begin
 me.Lines.Add(s);
end;

procedure TForm1.NFListItem(Listing: String);
begin
 Display(Listing);
end;

procedure TForm1.NFSuccess(Trans_Type: TCmdType);
begin
 case Trans_Type of
   cmdChangeDir:
     begin
       FtpList := TStringList.Create;
       NF.Nlist;
     end;
   cmdNList:
     begin
       me.Lines.AddStrings(FtpList);
       FtpList.Free;
       NF.Disconnect;
     end;
 end;
end;

end.



Страницы: 1 вся ветка

Текущий архив: 2005.08.07;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.048 c
1-1121867507
MegaVolt
2005-07-20 17:51
2005.08.07
Перекрыл Seek у TFileStream теперь не могу узнать Size :(


4-1118051080
Андрей Жук
2005-06-06 13:44
2005.08.07
Аналог делфийского Format в WinAPI


1-1121836615
Elena_
2005-07-20 09:16
2005.08.07
Как найти корень или подкорень TreeView по значению data


8-1107000935
Atomic
2005-01-29 15:15
2005.08.07
JPG TO BMP


3-1120209540
Dell3r
2005-07-01 13:19
2005.08.07
Помогите составить запрос