function GetFolderDate(Folder: string): TDateTime;
var
Rec: TSearchRec;
Found: Integer;
Date: TDateTime;
beginif Folder[Length(folder)] = '\' then
Delete(Folder, Length(folder), 1);
Result := 0;
Found := FindFirst(Folder, faDirectory, Rec);
tryif Found = 0 thenbegin
Date := FileDateToDateTime(Rec.Time);
Result := Date;
end;
finally
FindClose(Rec);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
d: TDateTime;
begin
d := GetFolderDate('C:\WINNT');
ShowMessage(FormatDateTime('dddd, d. mmmm yyyy, hh:mm:ss', d));
end;
{ Sets the time for both files and directories }{ for NT }function NT_SetDateTime(FileName: string; dtCreation, dtLastAccessTime, dtLastWriteTime: TDateTime): Boolean;
// by Nicholas Robinson var
hDir: THandle;
ftCreation: TFiletime;
ftLastAccessTime: TFiletime;
ftLastWriteTime: TFiletime;
function DTtoFT(dt: TDateTime): TFiletime;
var
dwft: DWORD;
ft: TFiletime;
begin
dwft := DateTimeToFileDate(dt);
DosDateTimeToFileTime(LongRec(dwft).Hi, LongRec(dwft).Lo, ft);
LocalFileTimeToFileTime(ft, Result);
end;
begin
hDir := CreateFile(PChar(FileName),
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
0);
if hDir <> INVALID_HANDLE_VALUE thenbegintry
ftCreation := DTtoFT(dtCreation);
ftLastAccessTime := DTtoFT(dtLastAccessTime);
ftLastWriteTime := DTtoFT(dtLastWriteTime);
Result := SetFileTime(hDir, @ftCreation, @ftLastAccessTime, @ftLastWriteTime);
finally
CloseHandle(hDir);
end;
endelse
Result := False;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
NT_SetDateTime('c:\temp\MyFolder', now, now, now);
end;
Here is a translation of the text into Russian:
Код на Delphi, предназначенный для получения или установки даты каталога. Он использует Windows API для достижения этого.
Первая функция GetFolderDate принимает путь к каталогу в качестве входных данных и возвращает последнюю модифицированную дату этого каталога. Если каталог не существует, она возвращает 0. Вот как это работает:
Проверьте, заканчивается ли путь к каталогу символом обратной косой черты (\). Если да, удалите символ.
Вызовите FindFirst, чтобы найти первый файл или подкаталог в указанном каталоге.
Если файл или подкаталог найден, получите его последнюю модифицированную дату с помощью FileDateToDateTime.
Возвращает последнюю модифицированную дату.
Вторая процедура Button1Click вызывает GetFolderDate с путь к каталогу и отображает результат в сообщении об ошибке.
Вторая функция NT_SetDateTime устанавливает даты создания, последнего доступа и последней записи для файла или каталога. Вот как это работает:
Создайте handle для указанного файла или каталога с помощью CreateFile.
Проверьте, является ли handle валидным. Если нет, верните False.
Преобразуйте даты из Delphi'а TDateTime в Windows' FILETIME с помощью функции DTtoFT.
Вызовите SetFileTime с handle и преобразованными датами.
Закройте handle.
Третья процедура Button2Click вызывает NT_SetDateTime с путь к каталогу и устанавливает даты создания, последнего доступа и последней записи для него в текущую дату и время с помощью Delphi'а now.
Вот некоторые улучшения, которые можно сделать:
Функция GetFolderDate не обрабатывает ошибки хорошо. Если каталог или файл не найден, она возвращает 0 без указания ошибки. Лучше было бы вернуть конкретное значение, например, EInvalidDir, и предоставить информацию о ошибке.
Функция NT_SetDateTime не проверяет, существует ли указанный файл или каталог перед попыткой установки дат. Это могло привести к ошибке доступа, если файл или каталог является только для чтения. Лучше было бы проверить существование файла или каталога с помощью GetFileAttributes и вернуть ошибку, если он не существует.
Код не обрабатывает исключения хорошо. Если происходит любое исключение, оно будет завершать программу без предоставления информации о ошибке. Лучше было бы использовать блоки try-except для ловли конкретных исключений и предоставления информации о ошибке.
Вот пример улучшенной функции GetFolderDate:
functionGetFolderDate(Folder:string):TDateTime;varRec:TSearchRec;Found:Integer;Date:TDateTime;beginifFolder[Length(Folder)]='\'thenDelete(Folder,Length(Folder),1);Result:=0;Found:=FindFirst(Folder,faDirectory,Rec);tryifFound=0thenbeginDate:=FileDateToDateTime(Rec.Time);Result:=Date;endelseResult:=EInvalidDir;// Возвращает ошибку, указывающую, что каталог не найденfinallyFindClose(Rec);end;end;
Вот пример улучшенной функции NT_SetDateTime:
functionNT_SetDateTime(FileName:string;dtCreation,dtLastAccessTime,dtLastWriteTime:TDateTime):Boolean;varhDir:THandle;ftCreation:TFiletime;ftLastAccessTime:TFiletime;ftLastWriteTime:TFiletime;functionDTtoFT(dt:TDateTime):TFiletime;vardwft:DWORD;ft:TFiletime;begindwft:=DateTimeToFileDate(dt);DosDateTimeToFileTime(LongRec(dwft).Hi,LongRec(dwft).Lo,ft);LocalFileTimeToFileTime(ft,Result);end;beginhDir:=CreateFile(PChar(FileName),GENERIC_READorGENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,0);ifhDir<>INVALID_HANDLE_VALUEthentryftCreation:=DTtoFT(dtCreation);ftLastAccessTime:=DTtoFT(dtLastAccessTime);ftLastWriteTime:=DTtoFT(dtLastWriteTime);Result:=SetFileTime(hDir,@ftCreation,@ftLastAccessTime,@ftLastWriteTime);ifnotResultthenShowMessage('Failed to set the date and time');finallyCloseHandle(hDir);endelseResult:=False;end;
В статье описаны функции для получения и установки даты создания, доступа и изменения директории в Delphi, которые могут быть использованы для работы с файловой системой Windows NT.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.