Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Datei-Änderungsdatum auslesen- NUR das Jahr neu setzen und in Datei zurückschreiben (https://www.delphipraxis.net/160150-datei-aenderungsdatum-auslesen-nur-das-jahr-neu-setzen-und-datei-zurueckschreiben.html)

juergen 29. Apr 2011 19:03

Delphi-Version: 2007

Datei-Änderungsdatum auslesen- NUR das Jahr neu setzen und in Datei zurückschreiben
 
Hallo zusammen,

mit den Datumsfunktionen stehe ich wirklich auf dem Kriegsfuss. :oops:
Ich habe einiges gesucht und ausprobiert, bekomme aber leider nicht das gewünschet Ergebnis.

Ich lese das Änderungsdatum einer Datei aus. Z. B. mit GeFileTime(). Somit habe das Dateidatum in einem TDateTime-Format.
Egal welches Jahr dort drin steht, ich möchte ein neues Jahr setzen (nur das Jahr).
Zu beachten wäre evtl., dass das Jahr auch durchaus vor 1980 sein kann.

1. Wie bekomme ich das mit dem Jahr hin?
2. Wie schreibe ich es dann in die Datei zurück? (wird wohl im Wesentlíchen von der Umsetzung aus Punkt 1 abhängen, evtl. mit SetFileTime()?)

Freue mich über jede Hilfestellung.
Danke schon mal vorab!

Zacherl 29. Apr 2011 19:06

AW: Datei-Änderungsdatum auslesen- NUR das Jahr neu setzen und in Datei zurückschreib
 
Zum de- und enkodieren des Datums kannst du EncodeDateTime() und DecodeDateTime() verwenden. Das liefert dir Tag, Monat, Jahr, Stunde, etc. einzeln zurück.

jfheins 29. Apr 2011 19:10

AW: Datei-Änderungsdatum auslesen- NUR das Jahr neu setzen und in Datei zurückschreib
 
Es gibt auch eine Fuktion IncYear() in den DateUtils, die sollte genau das erledigen. SetFileTime() sollte ebenfalls richtig sein - Hilfe siehe msdn.

http://docs.embarcadero.com/products...s_IncYear.html
http://msdn.microsoft.com/en-us/libr...33(VS.85).aspx

juergen 1. Mai 2011 13:28

AW: Datei-Änderungsdatum auslesen- NUR das Jahr neu setzen und in Datei zurückschreib
 
Hallo zusammen,

kam leider erst heute zum weiteren Bearbeiten, schließlich sind wir auch noch neuer dt. Meister geworden! :-D

Danke zuerst für die Antworten!
IncYear() von jfheins war dann genau das richtige für meinen Anwendungsfall. :thumb:

Für alle nachfolgenden Interessenten zu diesem Thema, meine Umsetzung:
(Fehlerbehandlung für den MP3-Tag "Jahr" habe ich hier nicht mit aufgeführt)

Delphi-Quellcode:
var
...
  hFile: THandle;
  ls_Jahr_vom_DateiDatum, ls_MP3_Tag_Year : string;
  li_Korrektur_Jahr                      : Integer;
  lt_new_Time_Dummy                      : SystemTime;
  lt_new_Time                            : TFileTime;
...
...
  begin
    hFile := FileOpen(FCurFile, fmOpenWrite or fmShareDenyNone);
    li_Korrektur_Jahr := 0;
    try
      if not (hFile = INVALID_HANDLE_VALUE) then begin
        ls_Jahr_vom_DateiDatum := FormatDateTime('YYYY', GetFileDate(FCurFile));
        ls_MP3_Tag_Year := JS_MP3Tag.Year;
        li_Korrektur_Jahr := StrToInt(ls_MP3_Tag_Year) - StrToInt(ls_Jahr_vom_DateiDatum);
        if li_Korrektur_Jahr <> 0 then begin
          try
            DateTimeToSystemTime(IncYear(GetFileDate(FCurFile), li_Korrektur_Jahr), lt_new_Time_Dummy);
            SystemTimeToFileTime(lt_new_Time_Dummy, lt_new_Time);
            SetFileTime(hfile, nil, nil, @lt_new_Time);
          except
            on E: Exception do begin
              Main_Form.MemoLog.Lines.Add(E.ClassName + ':' + E.Message + '  ' + SysErrorMessage(GetLastError) + ' Datei, welche nicht geändert werden konnte => "' + FCurFile + '"');
              Main_Form.img3.Visible := True;
            end;
          end;
        end else if hFile = INVALID_HANDLE_VALUE then begin
          Main_Form.MemoLog.Lines.Add('Fehlercode für ungültiges Datei-Handle = ' + IntToStr(hFile) + '...bei Datei => "' + FCurFile + '"');
        end;
      end;
    finally
      FileClose(hFile);
      ls_Jahr_vom_DateiDatum := '';
      ls_MP3_Tag_Year := '';
      li_Korrektur_Jahr := 0;
    end;
  end;
...
Verbesserungsvorschläge sind natürlich gern gesehen.

Allen noch einen schönen Mai-Sonntag! :dp:

Luckie 1. Mai 2011 13:36

AW: Datei-Änderungsdatum auslesen- NUR das Jahr neu setzen und in Datei zurückschreib
 
Sind die Variablen global? Wenn ja, warum?

juergen 1. Mai 2011 13:48

AW: Datei-Änderungsdatum auslesen- NUR das Jahr neu setzen und in Datei zurückschreib
 
@Luckie,
nein, die Variable "FCurFile" (= Pfad+Dateiname) ist nicht global (gut aufgepasst).
Ich habe hier nur den relevanten Auszug für das Änderungsdatum aufgeführt, da die gesamte Procedure einiges mehr umfasst und hier nur verwirren würde.
Aus diesem Grunde hatte ich unter der Var-Deklaration die 3 Punkte gesetzt. Alle Variablen sind lokal in der Procedure hinterlegt.

Luckie 1. Mai 2011 14:06

AW: Datei-Änderungsdatum auslesen- NUR das Jahr neu setzen und in Datei zurückschreib
 
Zitat:

Zitat von juergen (Beitrag 1098059)
da die gesamte Procedure einiges mehr umfasst und hier nur verwirren würde.

Damit hast du dir eigentlich schon selber den Grund gegeben, warum du die Routine in mehrere zerlegen solltest. Einen besseren gibt es nicht. Und wenn dann noch gleiche Variablen in unterschiedlichen Routinen benötigt werden, haben wir den besten Grund für eine Klasse, mit den Variablen als private Felder derselbigen.

Lemmy 1. Mai 2011 14:08

AW: Datei-Änderungsdatum auslesen- NUR das Jahr neu setzen und in Datei zurückschreib
 
Hi,

Zitat:

Zitat von juergen (Beitrag 1098059)
Ich habe hier nur den relevanten Auszug für das Änderungsdatum aufgeführt, da die gesamte Procedure einiges mehr umfasst und hier nur verwirren würde.

warum hast Du diese dann nicht gleich in eine eigenständige Proc/Func ausgelagert? DANN wäre sie wirklich wieder verwendbar.... ;-)

Grüße


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