Форум: "Основная";
Текущий архив: 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