Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];

Вниз

Как при помощи 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.015 c
1-1130852462
Tonich
2005-11-01 16:41
2005.11.27
TChart


2-1131608134
Wano
2005-11-10 10:35
2005.11.27
Запрос Access не работает в delphi


2-1131304186
ЯТутаНовичек
2005-11-06 22:09
2005.11.27
Помогите с TDate


14-1131354036
kjgg
2005-11-07 12:00
2005.11.27
Boot-диск


4-1124966742
BFG9k
2005-08-25 14:45
2005.11.27
На каком порте установлен модем ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский