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

Вниз

Аттрибуты файлов.   Найти похожие ветки 

 
Galiaf   (2005-07-27 21:00) [0]

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


 
Джо ©   (2005-07-27 22:39) [1]

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

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


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

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


 
Джо ©   (2005-07-27 22:53) [3]

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

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

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


 
Джо ©   (2005-07-27 22:57) [4]

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

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;


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

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


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


> Galiaf   (28.07.05 12:05) [5]

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


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

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


 
Джо ©   (2005-07-28 23:41) [8]

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


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-31 13:22) [9]

Мне как-то не очень удобно будет всё это использовать, темболее у меня для того что бы узнать время и папок и файлов нужно толко перевести переменную типа 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-31 18:17) [10]


>  [9] Galiaf   (31.07.05 13:22)

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

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

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


 
Джо ©   (2005-07-31 18:23) [11]


> [9] Galiaf   (31.07.05 13:22)

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



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

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

Наверх




Память: 0.5 MB
Время: 0.052 c
1-1122281961
VadimX
2005-07-25 12:59
2005.08.21
Прозрачность картинки через Canvas.Draw


14-1122538370
Choovak
2005-07-28 12:12
2005.08.21
Символы


5-1093530180
SEROGA
2004-08-26 18:23
2005.08.21
Создание компонентов


1-1122620153
Acid apple
2005-07-29 10:55
2005.08.21
Разные результаты компиляции исходников на разных компах


9-1114751547
Crave
2005-04-29 09:12
2005.08.21
Неисчезающее меню