Форум: "Сети";
Текущий архив: 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.014 c