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

Вниз

Как при помощи IDFTP узнать дату изменения файла   Найти похожие ветки 

 
ZAV ©   (2005-08-02 11:14) [0]

Суть вопроса отражена в теме. Необходимо узнать только дату "создания" или "загрузки" файла (т.е. получить значение строкой), лежащего на сервере, при помощи Indy9 IDftp клиента.


 
ZAV ©   (2005-08-04 14:13) [1]

Может кто-нибуди написать (одной строкой) как это делается?


 
ZAV ©   (2005-08-04 19:33) [2]

Вот процедурка из demo к Indy9. Здесь в LS формируется весь список файлов в выбранной директории сайта. А как теперь вытянуть оттуда нужную информацию (дату загрузки) об определенном файле?

procedure TForm1.ChageDir(DirName: String);
Var
 LS: TStringList;
begin
 LS := TStringList.Create;
 try
   IdFTP1.ChangeDir(DirName);
   IdFTP1.TransferType := ftASCII;

   EDir.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;


 
ZAV ©   (2005-08-06 13:00) [3]

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


 
тестер   (2005-08-10 17:31) [4]

Выкладывай плиз.


 
ZAV ©   (2005-08-15 16:13) [5]

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


unit IL;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Forms,
 ComCtrls, WinInet, mdCONTROLS, IdIntercept, IdBaseComponent, IdComponent, IdTCPConnection,
 IdTCPClient, IdFTP, IdAntiFreezeBase, IdAntiFreeze, IdLogBase, IdLogDebug, IdGlobal,
 IdLogEvent, IdFTPCommon, IdFTPList, StdCtrls, Buttons, ExtCtrls,
// может какие лишние, т.к. выдрал из проекта

type
 TForm1 = class(TForm)
   IdFTP1: TIdFTP;
   IdLogEvent1: TIdLogEvent;
   IdAntiFreeze1: TIdAntiFreeze;
   EHostName: TEdit;
   EUserName: TEdit;
   EPassword: TEdit;
   EFileName: TEdit;
   BConnect: TBitBtn;
   EDir: TEdit;
   DirectoryListBox: TListBox;

private
   { Private declarations }
   BytesToTransfer: LongWord;
   TransferrignData: Boolean;
   STime: TDateTime;
   AbortTransfer: Boolean;
   procedure ChageDir(DirName: string);
   function Index(FName: string): integer;
   function GetModified(FileName: string): string;
   function Modif(ind: integer): string;

 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 HostName, Password, UserName, FileName, DirName: string;
 LS, LA: TStringList;

implementation

{$R *.dfm}

function TForm1.GetModified(FileName: string): string;
var
bgh: integer;
nhj: string;
begin
//
 bgh:=Index(FileName); // по имени файла на сайте получаем его индекс в TStringList
 nhj:=Modif(bgh); // по индексу в TStringList получаем дату загрузки на сайт
 GetModified:=nhj;
end;

function TForm1.Modif(ind: integer): string; // по индексу в TStringList получаем дату загрузки на сайт
var
nmonth, nday, ntime, symbol, nyear: string;
lt: TSYSTEMTIME;
begin
//
 if ind=-1 then // если индекс = -1 (нет такого файла), то возвращаем «пустое место»
   begin
   Modif:="";
   exit;
   end;
//
 nmonth:=copy(LS[ind], 44, 3); //копируем из TStringList со строкой нужного файла месяц загрузки
 nday:=copy(LS[ind], 48, 2); //аналогично дату
 symbol:=copy(LS[ind], 51, 1); //в эту переменную пишем один символ. Для чего?
// Небольшое отступление:
// В TStringList информация хранится в следующем виде:
// -rw-r--r-- 1 0        0 1976  Oct  11  2004 index.html
// drwxr-xr-x 2 0        0 512  Jul  27 21:31 mods
// -rw-r--r--  1 0        0 265331 Sep  11  2004 screen562.jpg
// -rw-r--r--  1 0        0 32  May  29 14:06 date.txt
// (Для наглядности чуть-чуть изменил номера символов в строке, но на это не обращайте внимания)
// Что означают колонки:
// 1 Permisions
// 2 Тип
// 3 Группа
// 4 Пользователь
// 5 Размер
// 6 Месяц
// 7 Число
// 8 Время/Год
// 9 Название файла
// Так вот… Как видно, в 8 колонке хранится информация либо о времени загрузки файла (если загружен в текущем году), либо в ней указан год (если загружен не в текущем году).
// Теперь вернемся к переменной symbol, в которую скопировали один 51-й символ.
 if symbol<>" " then // Проверяем, если символ отличен от пробела, то значит указано время, если нет (else), значит указан год
   begin
   ntime:=copy(LS[ind], 51, 5); // копируем время
   GetLocalTime(lt); // получаем локальное время
   nyear:=IntToStr(lt.wYear); // запоминаем текущий год
   end
   else
   begin
   ntime:="00:00"; // к сожалению, если указан год, то время мы узнать не можем, поэтому пишем 00:00
   nyear:=copy(LS[ind], 52, 4); // запоминаем год
   end;
// Следующие проверки для перевода месяцев в числовой формат (делаю влоб, т.к. по-другому не знаю как)
 if nmonth="Jan" then
   nmonth:="01";
 if nmonth="Feb" then
   nmonth:="02";
 if nmonth="Mar" then
   nmonth:="03";
 if nmonth="Apr" then
   nmonth:="04";
 if nmonth="May" then
   nmonth:="05";
 if nmonth="Jun" then
   nmonth:="06";
 if nmonth="Jul" then
   nmonth:="07";
 if nmonth="Aug" then
   nmonth:="08";
 if nmonth="Sep" then
   nmonth:="09";
 if nmonth="Oct" then
   nmonth:="10";
 if nmonth="Nov" then
   nmonth:="11";
 if nmonth="Dec" then
   nmonth:="12";
 Modif:=nyear+"/"+nmonth+"/"+nday+"/"+ntime; // возвращаем дату загрузки в формате год/месяц/число/время. В принципе это не имеет особого значения, просто мне так было удобнее для дальнейшего сравнения.
end;

function TForm1.Index(FName: string): integer; // по имени файла на сайте получаем его индекс в TStringList
var
klm: integer;
begin
//
Index:=-1; // вернем -1, если дальше ничего не получается по проверкам
 for klm:=0 to LS.Count-1 do // Ищем строку с нужным именем обычным перебором
   begin
   if copy(LS [klm], 57, length(LS[klm])-56)=FName then
     Index:=klm;
   end;
end;

//Определение соединения с интернетом
{uses
  WinInet;}
function IsConnectedToInternet: Boolean;
var
  dwConnectionTypes: DWORD;
begin
  dwConnectionTypes :=
    INTERNET_CONNECTION_MODEM +
    INTERNET_CONNECTION_LAN +
    INTERNET_CONNECTION_PROXY;
  Result := InternetGetConnectedState(@dwConnectionTypes, 0);
end;
//Конец определения соединения

procedure TForm1.ChageDir(DirName: String);
begin
 if IdFTP1.Connected then
 begin
 try
   //Label6.Caption:=IdFTP1.RetrieveCurrentDir;
   //if IdFTP1.RetrieveCurrentDir=DirName then
   //  exit;
   IdFTP1.ChangeDir(DirName);

   IdFTP1.TransferType := ftASCII;

   EDir.Text := IdFTP1.RetrieveCurrentDir;

   DirectoryListBox.Items.Clear;
   IdFTP1.List(LA); // в TStringList записываем инфу о содержимом директории на сайте
   DirectoryListBox.Items.Assign(LA);
   if DirectoryListBox.Items.Count > 0 then
     if AnsiPos("total", DirectoryListBox.Items[0]) > 0 then DirectoryListBox.Items.Delete(0);
 finally
   LS:=LA; // Этого можно не делать. У меня для того, чтобы когда нет соединения с сайтом, был доступен листинг файлов
 end;
 end;
end;

procedure TForm1.BConnectClick(Sender: TObject); // Соединение с сайтом
begin
 if IsConnectedToInternet=false then
   exit;
 if IdFTP1.Connected then
  begin
  try
   if TransferrignData then
     IdFTP1.Abort;
   IdFTP1.Quit;
 finally
   BConnect.Caption := "Connect";
 end;
 end
 else
 begin
 with IdFTP1 do try
   Username := EUserName.Text;
   Password := EPassword.Text;
   Host := EHostName.Text;
   Connect;
   ChageDir(EDir.Text); // вызов процедуры изменения директории на сайте и формирования в TStringList инфы о содержимом этой директории
 finally
   if Connected then begin
     BConnect.Caption := "Disconnect";
   end;
 end;
 end;
end;

end.


 
Плохиш ©   (2005-08-15 16:28) [6]

Хм, а чем свойство DirectoryListing не угодило, да и описании для List рекомендую почитать повнимательней.



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

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

Наверх




Память: 0.5 MB
Время: 0.026 c
9-1121415743
NeedleWTF
2005-07-15 12:22
2005.11.27
Загрузка модели в GLscene


2-1131102812
dj0n
2005-11-04 14:13
2005.11.27
влияет ли ОС на прогу??


14-1131357226
VladimirZ
2005-11-07 12:53
2005.11.27
D7 работает только у администратора


2-1131103736
syte_ser78
2005-11-04 14:28
2005.11.27
как сохранить изменения в базе? BDE.


14-1130859331
kaif
2005-11-01 18:35
2005.11.27
Задача с конусом