AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

"Geändert am" setzen

Ein Thema von theomega · begonnen am 18. Mai 2003 · letzter Beitrag vom 18. Mai 2003
Antwort Antwort
Benutzerbild von theomega
theomega

Registriert seit: 18. Jun 2002
684 Beiträge
 
#1

"Geändert am" setzen

  Alt 18. Mai 2003, 14:00
Hallo Leute
mit fileSetDate setzte ich ja das erstelldatum einer Datei. Doch wie kann ich das "Geändert am" setzen?

Danke
TO
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 18. Mai 2003, 14:05
Moin The Omega,

schau Dir mal die API Funktion SetFileTime an.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Duffy
Duffy

Registriert seit: 19. Mär 2003
Ort: Wuppertal
835 Beiträge
 
Delphi 3 Standard
 
#3
  Alt 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ß
Künftige Generationen wollen ihre Fehler selber machen.
Jedes Programm wird nie das können, was Du wirklich brauchst.
Das Gegenteil von gut ist gut gemeint
-----
  Mit Zitat antworten Zitat
Benutzerbild von theomega
theomega

Registriert seit: 18. Jun 2002
684 Beiträge
 
#4
  Alt 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
  Mit Zitat antworten Zitat
Benutzerbild von Duffy
Duffy

Registriert seit: 19. Mär 2003
Ort: Wuppertal
835 Beiträge
 
Delphi 3 Standard
 
#5
  Alt 18. Mai 2003, 14:37
Hallo theomega,
mit welchem OS arbeitest Du? Die Funktion von mir arbeitet nur unter NT, XP etc.
bye
Künftige Generationen wollen ihre Fehler selber machen.
Jedes Programm wird nie das können, was Du wirklich brauchst.
Das Gegenteil von gut ist gut gemeint
-----
  Mit Zitat antworten Zitat
Benutzerbild von theomega
theomega

Registriert seit: 18. Jun 2002
684 Beiträge
 
#6
  Alt 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!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7
  Alt 18. Mai 2003, 15:02
Moin Duffy,

gemäss PSDK ist SetFileTime in 9x/ME/NTff enthalten.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Duffy
Duffy

Registriert seit: 19. Mär 2003
Ort: Wuppertal
835 Beiträge
 
Delphi 3 Standard
 
#8
  Alt 18. Mai 2003, 15:05
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
Angehängte Dateien
Dateityp: zip setfiletimestest.zip (207,9 KB, 24x aufgerufen)
Künftige Generationen wollen ihre Fehler selber machen.
Jedes Programm wird nie das können, was Du wirklich brauchst.
Das Gegenteil von gut ist gut gemeint
-----
  Mit Zitat antworten Zitat
Benutzerbild von theomega
theomega

Registriert seit: 18. Jun 2002
684 Beiträge
 
#9
  Alt 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
  Mit Zitat antworten Zitat
Benutzerbild von Duffy
Duffy

Registriert seit: 19. Mär 2003
Ort: Wuppertal
835 Beiträge
 
Delphi 3 Standard
 
#10
  Alt 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
dis := filedatetodatetime(sr.Time) + offset; die Funktion erwartet das Datum als TDateTime

bye
Künftige Generationen wollen ihre Fehler selber machen.
Jedes Programm wird nie das können, was Du wirklich brauchst.
Das Gegenteil von gut ist gut gemeint
-----
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:49 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