![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как при помощи IDFTP узнать дату изменения файла [D7, WinXP]
ZAV © (2005-08-02 11:14:00)Суть вопроса отражена в теме. Необходимо узнать только дату "создания" или "загрузки" файла (т.е. получить значение строкой), лежащего на сервере, при помощи Indy9 IDftp клиента.
Плохиш (2005-08-15 16:28:00) [1]Хм, а чем свойство DirectoryListingне угодило, да и описании для Listрекомендую почитать повнимательней.
ZAV (2005-08-15 16:13:00) [2]Вот вырезки из моей программки. Если лишнего не удалил, то должно работать.
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-10 17:31:00) [3]Выкладывай плиз.
ZAV (2005-08-06 13:00:00) [4]Проблема решена. Если надо, выложу решение (правда оно несколько корявое, но зато работает).
ZAV (2005-08-04 19:33:00) [5]Вот процедурка из 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-04 14:13:00) [6]Может кто-нибуди написать (одной строкой) как это делается?