Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi "Geändert am" setzen (https://www.delphipraxis.net/4956-geaendert-am-setzen.html)

theomega 18. Mai 2003 14:00


"Geändert am" setzen
 
Hallo Leute
mit fileSetDate setzte ich ja das erstelldatum einer Datei. Doch wie kann ich das "Geändert am" setzen?

Danke
TO

Christian Seehase 18. Mai 2003 14:05

Moin The Omega,

schau Dir mal die API Funktion SetFileTime an.

Duffy 18. Mai 2003 14:17

Hallo theomega,
anbei eine Procedure mit der Du die drei Zeiten setzen kannst.
Delphi-Quellcode:
//-----------------------------------------------------------------------//

//#######################################################################//
//## Function SetFileTimes:                                           ##//
//#######################################################################//
//##      Datum: Änderung:                                            ##//
//##      ====== =========                                            ##//
//##  30.12.2000 Initial Release                                      ##//
//#######################################################################//
function SetFileTimes(FileName: string;
                      const Created: TDateTime;
                      const Modified: TDateTime;
                      const Accessed: TDateTime): Boolean; overload;
var
  FileHandle: Integer;
  FTime, FTimeC, FTimeA, FTimeM: TFileTime;
  STime: TSystemTime;
  TimeFlag: Integer;
begin
  TimeFlag := 0;

  Result := False;

  ZeroMemory(@FTime, SizeOf(FTime));
  ZeroMemory(@FTime, SizeOf(FTimeC));
  ZeroMemory(@FTime, SizeOf(FTimeM));
  ZeroMemory(@FTime, SizeOf(FTimeA));

  // Created
  if Created > 0 then
  begin
    DateTimeToSystemTime(Created, STime);
    SystemTimeToFileTime(STime, FTime);
    LocalFileTimeToFileTime(FTime, FTimeC);
    Inc(TimeFlag, 1);
  end;

  // Accessed
  if Accessed > 0 then
  begin
    DateTimeToSystemTime(Accessed, STime);
    SystemTimeToFileTime(STime, FTime);
    LocalFileTimeToFileTime(FTime, FTimeA);
    Inc(TimeFlag, 2);
  end;

  // Modified
  if Modified > 0 then
  begin
    DateTimeToSystemTime(Modified, STime);
    SystemTimeToFileTime(STime, FTime);
    LocalFileTimeToFileTime(FTime, FTimeM);
    Inc(TimeFlag, 4);
  end;

  if TimeFlag = 0 then
  begin
    Exit; // Nothing to do
  end;

  // Get a File Handle
  FileHandle := FileOpen(FileName, fmOpenReadWrite + fmShareExclusive);
  if FileHandle < 0 then
  begin
    Exit;
  end;

  case TimeFlag of
    1: Result := SetFileTime(FileHandle, @FTimeC, nil, nil);
    2: Result := SetFileTime(FileHandle, nil, @FTimeA, nil);
    3: Result := SetFileTime(FileHandle, @FTimeC, @FTimeA, nil);
    4: Result := SetFileTime(FileHandle, nil, nil, @FTimeM);
    5: Result := SetFileTime(FileHandle, @FTimeC, nil, @FTimeM);
    6: Result := SetFileTime(FileHandle, nil, @FTimeA, @FTimeM);
    7: Result := SetFileTime(FileHandle, @FTimeC, @FTimeA, @FTimeM);
  end;

  FileClose(FileHandle);
end;
bye und viel Spaß

theomega 18. Mai 2003 14:27

Ich habe schon einige Funktionen probiert, aber alle weigern sich, das Datum zu setzten, die beiden anderen funktionieren nur das "Geändert am" nicht.Es bleibt einfach so wie es war.
Kann sich jemand einen Reim machen?

Danke
TO

Duffy 18. Mai 2003 14:37

Hallo theomega,
mit welchem OS arbeitest Du? Die Funktion von mir arbeitet nur unter NT, XP etc.
bye

theomega 18. Mai 2003 14:43

Also, die Funktion funktioniert nicht.
GetLastError gibt 87 zurück, was laut MSDN "The parameter is incorrect" bedeutet. Sagt mir aber garnichts.
OS ist WinXP allerdings wäre es nicht schlecht, wenn die Funktion auch unter Win98 laufen würde!

Christian Seehase 18. Mai 2003 15:02

Moin Duffy,

gemäss PSDK ist SetFileTime in 9x/ME/NTff enthalten.

Duffy 18. Mai 2003 15:05

Liste der Anhänge anzeigen (Anzahl: 1)
Hallo theomega,
ich hab da einen Fehler im Code gemacht, das overload muß weg. Wie's geht, siehe Beispiel.
Rest: siehe Christian Seehase (ich habs nicht ausprobiert!)

bye

theomega 18. Mai 2003 16:37

oki, dein Code geht und meiner nicht. Könnte sich bitte mal einer das hier anschauen:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,dateutils, ComCtrls, EnhListView, ExtListView,
  ExtCtrls, Mask,JclFileUtils;


type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    Label3: TLabel;
    Edit3: TEdit;
    listview1: TdfsExtListView;
    Label2: TLabel;
    Label4: TLabel;
    Edit2: TEdit;
    Label5: TLabel;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Label6: TLabel;
    Label7: TLabel;
    Bevel1: TBevel;
    Bevel2: TBevel;
    Button3: TButton;
    Bevel3: TBevel;
    MaskEdit1: TMaskEdit;
    MaskEdit2: TMaskEdit;
    Bevel4: TBevel;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    procedure Button2Click(Sender: TObject);
    procedure doit(filenamef:string;dis:TDateTime);

  private
    function SetFileTimes(FileName: string;
                          const Created: TDateTime;
                          const Modified: TDateTime;
                          const Accessed: TDateTime): Boolean;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;



var
  Form1: TForm1;

implementation

{$R *.dfm}
function TForm1.SetFileTimes(FileName: string;
                             const Created: TDateTime;
                             const Modified: TDateTime;
                             const Accessed: TDateTime): Boolean;
var
  FileHandle: Integer;
  FTime, FTimeC, FTimeA, FTimeM: TFileTime;
  STime: TSystemTime;
  TimeFlag: Integer;
begin
  TimeFlag := 0;

  Result := False;

  ZeroMemory(@FTime, SizeOf(FTime));
  ZeroMemory(@FTime, SizeOf(FTimeC));
  ZeroMemory(@FTime, SizeOf(FTimeM));
  ZeroMemory(@FTime, SizeOf(FTimeA));

  // Created
  if Created > 0 then
  begin
    DateTimeToSystemTime(Created, STime);
    SystemTimeToFileTime(STime, FTime);
    LocalFileTimeToFileTime(FTime, FTimeC);
    Inc(TimeFlag, 1);
  end;

  // Accessed
  if Accessed > 0 then
  begin
    DateTimeToSystemTime(Accessed, STime);
    SystemTimeToFileTime(STime, FTime);
    LocalFileTimeToFileTime(FTime, FTimeA);
    Inc(TimeFlag, 2);
  end;

  // Modified
  if Modified > 0 then
  begin
    DateTimeToSystemTime(Modified, STime);
    SystemTimeToFileTime(STime, FTime);
    LocalFileTimeToFileTime(FTime, FTimeM);
    Inc(TimeFlag, 4);
  end;

  if TimeFlag = 0 then
  begin
    Exit; // Nothing to do
  end;

  // Get a File Handle
  FileHandle := FileOpen(FileName, fmOpenReadWrite + fmShareExclusive);
  if FileHandle < 0 then
  begin
    Exit;
  end;

  case TimeFlag of
    1: Result := SetFileTime(FileHandle, @FTimeC, nil, nil);
    2: Result := SetFileTime(FileHandle, nil, @FTimeA, nil);
    3: Result := SetFileTime(FileHandle, @FTimeC, @FTimeA, nil);
    4: Result := SetFileTime(FileHandle, nil, nil, @FTimeM);
    5: Result := SetFileTime(FileHandle, @FTimeC, nil, @FTimeM);
    6: Result := SetFileTime(FileHandle, nil, @FTimeA, @FTimeM);
    7: Result := SetFileTime(FileHandle, @FTimeC, @FTimeA, @FTimeM);
  end;

  FileClose(FileHandle);
end;


procedure TForm1.Button2Click(Sender: TObject);
var sr:TSearchRec;
dis:integer;
offset,off1,off2:TDateTime;
tl:TListItem;
begin

//Überprüfen
listview1.Items.Clear;
off1 := strtodate(maskedit1.text)+encodetime(strtoint(edit2.text),strtoint(edit5.text),0,0);
off2 := strtodate(maskedit2.text)+encodetime(strtoint(edit4.text),strtoint(edit6.text),0,0);
offset := off2-off1;


if findfirst(edit1.text+edit3.text,0,sr) = 0 then begin;
    repeat
        dis := datetimetofiledate(filedatetodatetime(sr.Time) + offset);
        tl := listview1.Items.Add;
        tl.Caption := sr.Name;
        tl.SubItems.Add(datetimetostr(filedatetodatetime(sr.Time)));
        tl.SubItems.Add(datetimetostr(filedatetodatetime(dis)));

//        if sender=button2 then begin;
          doit(edit1.Text+sr.Name,dis);
//        end;

    UNTIL FindNext(sr) <> 0;
    findclose(sr);
end;
end;

procedure TForm1.doit(filenamef:string;dis:TDateTime);
begin;
SetFileTimes(filenamef,dis,dis,dis);
if (getlasterror>0) then showmessage(inttostr(getlasterror));
end;



end.
Warum geht das nicht?

Danke
TO

Duffy 18. Mai 2003 16:47

Hallo theomega,
wenn ich das jetzt so auf die Schnelle sehe, wandelst Du das Datum in
dis := datetimetofiledate(filedatetodatetime(sr.Time) + offset);
versuch es mal so
Delphi-Quellcode:
dis := filedatetodatetime(sr.Time) + offset;
die Funktion erwartet das Datum als TDateTime

bye


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz