Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Datei öffnen, speichern[Prob gelöst] (https://www.delphipraxis.net/10912-datei-oeffnen-speichern%5Bprob-geloest%5D.html)

synex 27. Okt 2003 20:39


Datei öffnen, speichern[Prob gelöst]
 
Hi Leute,

Ich habe ein Problem: Ich will eine Datei öffnen, etwas anhängen (nur einen Buchstaben oder sowas), dieses angehängte danach sofort wieder löschen und die Datei schließlich shcließen.

Was soll das ganze werdet ihr euch fragen. Also: Ich habe eine Listbox voll mit Dateinamen. Innerhalb der Listbox kann man die Reihenfolge verändern. Wenn ich jetzt auf einen Button drücke, sollen die Dateien in der Reihenfolge wie sie in der Listbox stehen ihr Änderungsdatum haben, also der oberste das älteste.

Ich habe schon versucht, das Datum der Datei zu ändern, habs aber nicht geschafft das Programm dazu zu bringen von einer bestimmten Datei das Änderungsdatum auf einen Wert zu bringen, damit es zwischen den 2 darüberliegenden Elementen liegt.

OK das klingt jetzt sehr kompliziert, aber mir geht es im Prinzip nur darum eine Datei zu öffnen, etwas anzuhängen (nur etwas kleines), das daraufhin dann wieder zu löschen.

MfG synex

synex 27. Okt 2003 21:11

Re: Datei öffnen, speichern
 
OK ich hab das Problem anders gelöst

Daniel B 27. Okt 2003 21:34

Re: Datei öffnen, speichern[Prob gelöst]
 
Und wie?

synex 28. Okt 2003 17:13

Re: Datei öffnen, speichern[Prob gelöst]
 
Es ging mir ja darum das Änderungsdatum der Dateien zu ändern so dass sie die Reiehnfolge haben wie in der Listbox.

Ich habe jetzt beim Drücken eines Buttons das Änderungsdatum jeder einzelnen Datei so geändert, dass siedie neue Reihenfolge haben.

Also:

Vorher:

datei1 12.10.03
datei2 16.10.03
datei3 20.10.03

Jetzt datei2 an erste Stelle verschieben:

Nachher:

datei2 18.10.03
datei1 19.10.03
datei3 20.10.03

Sharky 28. Okt 2003 18:54

Re: Datei öffnen, speichern[Prob gelöst]
 
Hai synex,

poste hier doch einfach mal den relevanten Teil von deiner Lösung.
Dann können andere (wenn sie die Suche verwenden) an deiner Lösung teilhaben.

Die DP lebt zu einem großem Teil davon das alle die Sosse veröffentlichen mit denen ein Problem gelöst wurde.

synex 28. Okt 2003 19:13

Re: Datei öffnen, speichern[Prob gelöst]
 
Diese beiden Prozeduren hab ich mir hier her geklaut :mrgreen:
Delphi-Quellcode:
//Dateierstellung etc ändern
function ChangeFileDate(const path: string; const Creation, LastAccess,
  LastWrite: TDateTime): Boolean;
var
  hFile: THandle;
  ftCreationUTC, ftLastAccessUTC, ftLastWriteUTC: TFileTime;
  ftCreationLocal, ftLastAccessLocal, ftLastWriteLocal: TFileTime;
  stCreationLocal, stLastAccessLocal, stLastWriteLocal: TSystemTime;
begin
  result := false;
  hFile := CreateFile(PChar(path), GENERIC_READ or GENERIC_WRITE, 0, nil,
  OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
  if (hFile <> INVALID_HANDLE_VALUE) then
    try
      //Umwandlung von TDateTime in Systemzeitformat
      DateTimeToSystemTime(Creation, stCreationLocal);
      DateTimeToSystemTime(LastAccess, stLastAccessLocal);
      DateTimeToSystemTime(LastWrite, stLastWriteLocal);
      //Umwandlung von Systemzeitformat in lokales Dateizeitformat
      if (SystemTimeToFileTime(stCreationLocal, ftCreationLocal)) and
      (SystemTimeToFileTime(stLastAccessLocal, ftLastAccessLocal)) and
      (SystemTimeToFileTime(stLastWriteLocal, ftLastWriteLocal)) then begin
        //Umwandlung von lokalem Dateizeitformat in Weltzeit
        if (LocalFileTimeToFileTime(ftCreationLocal, ftCreationUTC)) and
        (LocalFileTimeToFileTime(ftLastAccessLocal, ftLastAccessUTC)) and
        (LocalFileTimeToFileTime(ftLastWriteLocal, ftLastWriteUTC)) then begin
          result:=SetFileTime(hFile, @ftCreationUTC, @ftLastAccessUTC, @ftLastWriteUTC);
        end;
      end;
    finally
      CloseHandle(hFile);
    end;
end;

//datei datum sachen auslesen
function GetFileDate(const FileName: string; out Creation, LastAccess,
  LastWrite: TDateTime): Boolean;
var
  hFile: THandle;
  ftCreationUTC, ftLastAccessUTC, ftLastWriteUTC: TFileTime;
  ftCreationLocal, ftLastAccessLocal, ftLastWriteLocal: TFileTime;
  stCreationLocal, stLastAccessLocal, stLastWriteLocal: TSystemTime;
begin
  result:=false;
  hFile := CreateFile(PChar(FileName), GENERIC_READ, 0, nil,
  OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
  if (hFile <> INVALID_HANDLE_VALUE) then begin
    try
      //Ermittlung des Dateidatums in UTC (Weltzeit)
      if GetFileTime(hFile, @ftCreationUTC, @ftLastAccessUTC, @ftLastWriteUTC) then begin
        //Umrechnung in Ortszeit
        if FileTimeToLocalFileTime(ftCreationUTC, ftCreationLocal)
        and FileTimeToLocalFileTime(ftLastAccessUTC, ftLastAccessLocal)
        and FileTimeToLocalFileTime(ftLastWriteUTC, ftLastWriteLocal) then begin
          //Umwandlung in Systemdatumformat
          if FileTimeToSystemTime(ftCreationLocal, stCreationLocal)
          and FileTimeToSystemTime(ftLastAccessLocal, stLastAccessLocal)
          and FileTimeToSystemTime(ftLastWriteLocal, stLastWriteLocal) then begin
            //Zuweisung der Rückgabewerte
            Creation := SystemTimeToDateTime(stCreationLocal);
            LastAccess := SystemTimeToDateTime(stLastAccessLocal);
            LastWrite := SystemTimeToDateTime(stLastWriteLocal);
            result:=true;
          end;
        end;
      end;
    finally
      CloseHandle(hFile);
    end;
  end;
end;
Und so hab ich das in meinem Programm umgesetzt: (in der Listbox stehen die dateinamen mit Pfad in der endgültigen Reihenfolge)

Delphi-Quellcode:
procedure TForm1.Button15Click(Sender: TObject);
var i:integer;
  datum,erstellt,geaendert,access:tdatetime;
begin
datum:=now-(listbox1.Count-i); //der Einfachheit halber ist der Datumsunterschied genau 1 Tag
for i:= 0 to listbox1.Count-1 do
  begin
  getfiledate(listbox3.Items.Strings[i],erstellt,access,geaendert); //Daten auslesen
  changefiledate(listbox3.Items.Strings[i],datum,datum,datum); //und neue Daten setzen, Erstellungsdatum, LastAccess und LastWrite wird gleichgesetzt
  end;
end;
Und das wars auch schon.

MfG synex


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 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