Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Получить или установить дату для директории

Delphi , Файловая система , Директории

Получить или установить дату для директории

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

function GetFolderDate(Folder: string): TDateTime;
 var
   Rec: TSearchRec;
   Found: Integer;
   Date: TDateTime;
 begin
   if Folder[Length(folder)] = '\' then
     Delete(Folder, Length(folder), 1);
   Result := 0;
   Found  := FindFirst(Folder, faDirectory, Rec);
   try
     if Found = 0 then
     begin
       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 then
    begin
     try
       ftCreation       := DTtoFT(dtCreation);
       ftLastAccessTime := DTtoFT(dtLastAccessTime);
       ftLastWriteTime  := DTtoFT(dtLastWriteTime);
       Result := SetFileTime(hDir, @ftCreation, @ftLastAccessTime, @ftLastWriteTime);
     finally
       CloseHandle(hDir);
     end;
   end
   else
     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. Вот как это работает:

  1. Проверьте, заканчивается ли путь к каталогу символом обратной косой черты (\). Если да, удалите символ.
  2. Вызовите FindFirst, чтобы найти первый файл или подкаталог в указанном каталоге.
  3. Если файл или подкаталог найден, получите его последнюю модифицированную дату с помощью FileDateToDateTime.
  4. Возвращает последнюю модифицированную дату.

Вторая процедура Button1Click вызывает GetFolderDate с путь к каталогу и отображает результат в сообщении об ошибке.

Вторая функция NT_SetDateTime устанавливает даты создания, последнего доступа и последней записи для файла или каталога. Вот как это работает:

  1. Создайте handle для указанного файла или каталога с помощью CreateFile.
  2. Проверьте, является ли handle валидным. Если нет, верните False.
  3. Преобразуйте даты из Delphi'а TDateTime в Windows' FILETIME с помощью функции DTtoFT.
  4. Вызовите SetFileTime с handle и преобразованными датами.
  5. Закройте handle.

Третья процедура Button2Click вызывает NT_SetDateTime с путь к каталогу и устанавливает даты создания, последнего доступа и последней записи для него в текущую дату и время с помощью Delphi'а now.

Вот некоторые улучшения, которые можно сделать:

  1. Функция GetFolderDate не обрабатывает ошибки хорошо. Если каталог или файл не найден, она возвращает 0 без указания ошибки. Лучше было бы вернуть конкретное значение, например, EInvalidDir, и предоставить информацию о ошибке.
  2. Функция NT_SetDateTime не проверяет, существует ли указанный файл или каталог перед попыткой установки дат. Это могло привести к ошибке доступа, если файл или каталог является только для чтения. Лучше было бы проверить существование файла или каталога с помощью GetFileAttributes и вернуть ошибку, если он не существует.
  3. Код не обрабатывает исключения хорошо. Если происходит любое исключение, оно будет завершать программу без предоставления информации о ошибке. Лучше было бы использовать блоки try-except для ловли конкретных исключений и предоставления информации о ошибке.

Вот пример улучшенной функции GetFolderDate:

function GetFolderDate( Folder: string ): TDateTime;
var
  Rec: TSearchRec;
  Found: Integer;
  Date: TDateTime;
begin
  if Folder[Length(Folder)] = '\' then
    Delete( Folder, Length(Folder), 1 );
  Result := 0;
  Found := FindFirst( Folder, faDirectory, Rec );
  try
    if Found = 0 then
    begin
      Date := FileDateToDateTime( Rec.Time );
      Result := Date;
    end
    else
      Result := EInvalidDir; // Возвращает ошибку, указывающую, что каталог не найден
  finally
    FindClose( Rec );
  end;
end;

Вот пример улучшенной функции NT_SetDateTime:

function NT_SetDateTime( FileName: string; dtCreation, dtLastAccessTime, dtLastWriteTime: TDateTime ): Boolean;
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 then
    try
      ftCreation := DTtoFT( dtCreation );
      ftLastAccessTime := DTtoFT( dtLastAccessTime );
      ftLastWriteTime := DTtoFT( dtLastWriteTime );
      Result := SetFileTime( hDir, @ftCreation, @ftLastAccessTime, @ftLastWriteTime );

      if not Result then
        ShowMessage('Failed to set the date and time');

    finally
      CloseHandle( hDir );
    end
  else
    Result := False;
end;

В статье описаны функции для получения и установки даты создания, доступа и изменения директории в Delphi, которые могут быть использованы для работы с файловой системой Windows NT.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Директории ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-07 04:20:15/0.0062780380249023/1