[DELPHI] Mudar data de criação de arquivo [RESOLVIDO]

a Unit abaixo


unit Altere;

interface

uses Windows, SysUtils, Forms;

type

  TFileTimes = (ftLastAccess, ftLastWrite, ftCreation);

function aDataDoArquivo(nome: String; data: TDateTime; Times: TFileTimes): Boolean;

implementation

function aDataDoArquivo(nome: String; data: TDateTime; Times: TFileTimes): Boolean;

var Handle: THandle;
    FileTime: TFileTime;
    SystemTime: TSystemTime;

begin

 Result := False;

 Handle := CreateFile(PChar(nome),
                      GENERIC_WRITE,
                      FILE_SHARE_READ,
                      nil,
                      OPEN_EXISTING,
                      0,
                      0);

 if Handle <> INVALID_HANDLE_VALUE then

  try

    SysUtils.DateTimeToSystemTime(data, SystemTime);

    if Windows.SystemTimeToFileTime(SystemTime, FileTime) then
     begin

      // verifiva o tipo de modificação a ser feita
      case Times of

        ftLastAccess: Result := SetFileTime(Handle, nil, @FileTime, nil);
        ftLastWrite:  Result := SetFileTime(Handle, nil, nil, @FileTime);
        ftCreation:   Result := SetFileTime(Handle, @FileTime, nil, nil);

      end; // case

    end; // if

  finally

    CloseHandle(Handle);

  end; // finally

end;



end.

funciona, mas determina a hora de criação de um arquivo de maneira errada

se eu peço 10:05:10 ela grava 07:05:10

e nao faço ideia do porque desta redução de horas, alguem tem uma dica de como resolver isso ?

Bom, eu não sei a causa do problema, mas onde trabalho usamos a seguinte rotina para alterar a data e a hora de modificação do arquivo:

[code]function DefineDateTimeFile(FileName: string; DateTimeFile: TDateTime): boolean;

function DefineDateTimeFile;
var
F: integer;

begin
Result := false;
F := FileOpen( FileName, fmOpenWrite or fmShareDenyNone );
try
if F > 0 then
Result := FileSetDate( F, DateTimeToFileDate(DateTimeFile) ) = 0;
finally
FileClose(F);
end;
end;[/code]

Mais um carinha sendo pego pelo famoso problema “UTC x Horário Local” :slight_smile:

Note que estamos em UTC - 03:00, ou seja, se em Londres (Greenwich) o horário for 15:00, em Brasília o horário será 12:00.

se entendi bem, não tem como arrumar, vou ter que fazer um “path” correto ?
ok

Descobri a solução

1 - incluir a unit no projeto:


DateUtils

2 - usar a função


{ muda a data de criação do arquivo }
function altereADataDeCriacaoDoArquivo(nome: String; data: TDateTime): Boolean;

var Handle: THandle;
    FileTime: TFileTime;
    SystemTime: TSystemTime;

begin

 Result := False;

 Handle := CreateFile(PChar(nome),
                      GENERIC_WRITE,
                      FILE_SHARE_READ,
                      nil,
                      OPEN_EXISTING,
                      0,
                      0);

 if Handle <> INVALID_HANDLE_VALUE then

  try

    SysUtils.DateTimeToSystemTime(data, SystemTime);

    if Windows.SystemTimeToFileTime(SystemTime, FileTime) then
     Result := SetFileTime(Handle, @FileTime, nil, nil);

  finally

    CloseHandle(Handle);

  end; // finally

end; // end of 

3 - chamar a função da seguinte forma


{ modifica os atributos do arquivo selecionado }
procedure TForm1.Button1Click(Sender: TObject);
begin


  altereADataDeCriacaoDoArquivo(path, IncHour(StrToDateTime('01/01/2000 10:30:35'), 3));
                                                                      
 // processa msgs do SO
 Application.ProcessMessages;

end; // end of