Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Аттрибуты файлов. [D7, WinXP]


Galiaf ©   (2005-07-27 21:00:00) 

Сдравствуйте! Есть файл "D:\ws.txt"(например) и нужно узнать время его последнего изменения (или что-то вроде того), желательно присвоить это время переменной типа string. Как это раелизовать?


Джо   (2005-07-31 18:23:00) [1]


> [9] Galiaf   (31.07.05 13:22)

Кстати, конкретных вопросов не вижу. Тема исчерпана?


Джо   (2005-07-31 18:17:00) [2]


>  [9] Galiaf   (31.07.05 13:22)

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

> "Symbol 'FindData' is specific to a platform".

Это не ошибка. Это предупреждение. Работать будет для Win - для Линукс нет. Твоя программа - кроссплатформенна?


Galiaf   (2005-07-31 13:22:00) [3]

Мне как-то не очень удобно будет всё это использовать, темболее у меня для того что бы узнать время и папок и файлов нужно толко перевести переменную типа TFileTime в String, я видел в твоём примере как можно перевести сперва в dosdatetime а потом в string, но мешает одна ошибка которую в этом проекте встречаю уже  не первый раз: "Symbol 'FindData' is specific to a platform". Ещё эта ошибка встречается когда хочу Delete(l,1,1) где l: string; l:=searchrec.name, в другом проекте l:=label.caption и всё работало нормально.


Джо   (2005-07-28 23:41:00) [4]

Вот накропал образец класса, который все это дело инкапсулирует. Определяет, если это поддерживается текущей операционной и файловой системой дату/время создания,модифицирования и последнего обращения.


unit Unit2;

interface
uses Windows, SysUtils;

type

 TCustomDateTime = class
 private
   FValue: TDateTime;
   FDefined: Boolean;
   function GetDefined: Boolean;
 public
   constructor Create (AValue: TDateTime);
   constructor CreateUndefined;
   property Value: TDateTime read FValue;
   function ToString: string;
   property Defined: Boolean read GetDefined;
 end;

 TFileDateTimeInfo = class
 private
   FSearchRec: TSearchRec;
   FFileName: string;
   FCreationTime,
   FLastWriteTime,
   FLastAccessTime: TCustomDateTime;
   function DoOpenFile: Boolean;
   procedure DoReadFileDateTime;
   procedure DoCloseFile;
 public
   constructor Create (const AFileName: string);
   property CreationTime: TCustomDateTime read FCreationTime;
   property LastAccessTime: TCustomDateTime read FLastAccessTime;
   property LastWriteTime: TCustomDateTime read FLastWriteTime;
 end;

implementation

{ TFileDateTimeInfo }

constructor TFileDateTimeInfo.Create(const AFileName: string);
begin
 inherited Create;

 FFileName := AFileName;

 if not DoOpenFile then
   RaiseLastOSError;
 try
   DoReadFileDateTime;
 finally
   DoCloseFile;
 end;
end;

procedure TFileDateTimeInfo.DoCloseFile;
begin
 SysUtils.FindClose (FSearchRec)
end;

function TFileDateTimeInfo.DoOpenFile: Boolean;
begin
 Result := FindFirst (FFileName,faAnyFile,FSearchRec) = 0;
end;

procedure TFileDateTimeInfo.DoReadFileDateTime;
 function ConvertDateTime (FT: TFileTime): TCustomDateTime;
 var
   N: Integer;
 begin
   FileTimeToLocalFileTime(FT,FT);
   FileTimeToDosDateTime(FT,LongRec(N).Hi,LongRec(N).Lo);
   try
     Result := TCustomDateTime.Create(FileDateToDateTime(N));
   except
     Result := TCustomDateTime.CreateUndefined;
   end;
 end;
begin
 FCreationTime := ConvertDateTime(FSearchRec.FindData.ftCreationTime);
 FLastWriteTime := ConvertDateTime(FSearchRec.FindData.ftLastWriteTime);
 FLastAccessTime := ConvertDateTime(FSearchRec.FindData.ftLastAccessTime);    
end;

{ TCustomDateTime }

constructor TCustomDateTime.Create(AValue: TDateTime);
begin
 inherited Create;
 FValue := AValue;
 FDefined := True;
end;

constructor TCustomDateTime.CreateUndefined;
begin
 inherited Create;
 FDefined := False;
end;

function TCustomDateTime.GetDefined: Boolean;
begin
 Result := FDefined
end;

function TCustomDateTime.ToString: string;
begin
 Result := DateTimeToStr(FValue)
end;

end.

Пример использования:

procedure TForm1.Button2Click(Sender: TObject);
var
 DateTimeInfo: TFileDateTimeInfo;
begin
 DateTimeInfo := TFileDateTimeInfo.Create(Edit1.Text);
 try
   // если определено время создания
   if DateTimeInfo.CreationTime.Defined then
     Memo1.Lines.Add('Creation time: ' + DateTimeInfo.CreationTime.ToString);

   // если определено время последней модификации
   if DateTimeInfo.LastWriteTime.Defined then
     Memo1.Lines.Add('Last write time: ' + DateTimeInfo.LastWriteTime.ToString);

   // если определено время последнего доступа
   if DateTimeInfo.LastAccessTime.Defined then
     Memo1.Lines.Add('Last access time: ' + DateTimeInfo.LastAccessTime.ToString);
 finally
   DateTimeInfo.Free;
 end;
end;

Работает как для папок, так и для файлов.
Свойства CreationTime,LastWriteTime,LastAccessTime перед использованием обязательно нужно протестировать на Defined, они могут быть неопределены. Так, например, в Win98 невозможно получить CreationTime для папки Windows (по крайней мере, у меня). Что радует, "Проводник" его тоже получить не может :)
Если что не ясно в использовании класса -- спрашивай. Но вроде все читабельно сделал, в ущерб компактности и простоте.


Galiaf   (2005-07-28 21:24:00) [5]

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


Плохиш   (2005-07-28 12:11:00) [6]


> Galiaf   (28.07.05 12:05) [5]

Читать [3] медленно и до полного прояснения.


Galiaf   (2005-07-28 12:05:00) [7]

Никак нихотит работать сей пример, может я что напортачил? У меня в проге есть то время что мне надо но в формате TFileTime, а я незнаю как его превести в TDateTime. Я был бы рад ответу на этот вопрос.


Джо   (2005-07-27 22:57:00) [8]

Возможно, корректнее будет записать так:

function GetFileAge (const AFileName: string): TDateTime;
var
 TimeStamp: Integer;
begin
 TimeStamp := FileAge (AFileName);
 if TimeStamp <> -1 then
   Result := FileDateToDateTime(TimeStamp)
 else
   raise Exception.Create('Could not retrieve time stamp');
end;


Джо   (2005-07-27 22:53:00) [9]

Ну, вот, например, время последней модификации.

function GetFileAge (const AFileName: string): TDateTime;
begin
 Result := FileDateToDateTime(FileAge (AFileName))
end;

Например:
ShowMessage(FormatDateTime('Последний раз изменяли: dd.mm.yyy hh.nn.ss',GetFileAge('E:\style000.css')));


Galiaf   (2005-07-27 22:46:00) [10]

дело в том что я открывал свойства какого-то файла и время его изменения было где-то на 4 года меньше времени создания, вот я и не уверен что именно мне надо, наверное время когда его в последний раз трогали.


Джо   (2005-07-27 22:39:00) [11]

Galiaf   (27.07.05 21:00)
> Сдравствуйте! Есть файл "D:\ws.txt"(например) и нужно узнать
> время его последнего изменения (или что-то вроде того),
>

Что-то вроде того это звучит обнадеживаеще...


Наверх

Титульная страница Поиск, карта сайта Написать письмо