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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.043 c
3-1121013164
atruhin
2005-07-10 20:32
2005.08.21
Репликация по email или на дискетах


11-1105726128
chum
2005-01-14 21:08
2005.08.21
Работа со строками


14-1122486666
Starcom
2005-07-27 21:51
2005.08.21
Почему в Windows 98/Me енто не работает?


3-1121244552
Fishka
2005-07-13 12:49
2005.08.21
DBGrid,ADODataSet и таблица с полями по умолчанию


4-1118906834
leonidus
2005-06-16 11:27
2005.08.21
Как получить слово выделенное в другом приложении





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский