Seite 1 von 1

Filedate setzen

Verfasst: Mo, 15. Apr 2019 13:09
von STEPHAN
Hi,

ich habe gerade keine Zugriff auf die Doku.

Ich muss bei ca. 500.000 Files das Filedatum nach bestimmten Formeln setzen.

Mit welchem XPP Befehl kann ich das aus einen XBase PGM heraus machen?

Danke

Stephan

Re: Filedate setzen

Verfasst: Mo, 15. Apr 2019 13:17
von brandelh
da stellt sich zunächst die Frage, das Änderungsdatum, das Erstellungsdatum oder ... da war noch ein drittes.
Seit Win XX wird das unterschieden. In den Tools war glaube ich so eine Funktion, das Änderungsdatum könnte man auch mit Fopen und neu speichern erzwingen, aber wehe wenn was schief geht.
Ich weiß nicht mehr ob ich das mit Xbase++ oder einem tool gemacht habe, ist lange her.

Re: Filedate setzen

Verfasst: Mo, 15. Apr 2019 13:22
von STEPHAN
Änderungsdatum, sofern es keinen Ärger gibt, wenn es vor dem Erstellungsdatum liegt. Sonst beide.

Re: Filedate setzen

Verfasst: Mo, 15. Apr 2019 14:30
von brandelh
am besten beide gleich, sonst kann es sein, dass er im Explorer das falsche anzeigt:

:arrow: https://xbaseforum.de/viewtopic.php?f=16&t=6050

Ich wusste, ich hatte da mal was gesehen 8)

Re: Filedate setzen

Verfasst: Di, 16. Apr 2019 1:59
von AUGE_OHR
STEPHAN hat geschrieben: Mo, 15. Apr 2019 13:22 Änderungsdatum, sofern es keinen Ärger gibt, wenn es vor dem Erstellungsdatum liegt. Sonst beide.
hast du die Dateien mit dem Explorer kopiert und nun haben die alle das selbe Datum :roll:
Tip : für so was nehme ich den Total Commander mit "Kopiere Datum/Zeit von Verzeichnissen"

ich hatte ein DOS Tool das sich "Touch" nannte aber nicht unter 64Bit OS lief ... also hab ich mir das selbst geschrieben.
eine Sache über die ich immer wieder gestolpert bin : Daylightsaving = Sommerzeit

---

was ist eigentlich wenn die Sommerzeit abgeschafft wird mit solchen "Berechnungen" :?:
muss dann eine Abfrage rein Datum "ab 19xx" bis "20xx" dann Sommerzeit nachschauen ...

Re: Filedate setzen

Verfasst: Di, 16. Apr 2019 9:41
von STEPHAN
Nein. Ich nutze sowieso Total Commander.

Es geht im E-Mail Dateien. Ich will das Fildedatum auf das Datum der E-Mail aus dem Inhalt setzen. Ich kann das Datum auslesen, aber das Ändern des Fildedatums klappt noch nicht.

Re: Filedate setzen

Verfasst: Di, 16. Apr 2019 21:39
von azzo
Hallo,
in Clipper gibt es setfdati(). Sollte auch in xBase vorhanden sein.
LG
Otto

Re: Filedate setzen

Verfasst: Di, 16. Apr 2019 23:06
von STEPHAN
Danke für alle Eure Hilfe. Läuft jetzt problemlos.

Re: Filedate setzen

Verfasst: Mi, 17. Apr 2019 6:38
von Jan
Otto,

Xbase++ kennt ebenfalls ein SetFDaTi(), mit dem man Datum und Uhrzeit einer Datei setzen kann. Liegt in xbtbase1.dll.

Jan

Re: Filedate setzen

Verfasst: Mi, 17. Apr 2019 6:51
von brandelh
SetFDaTi() man hört doch immer wieder was neues :D

Mal sehen welche der setzt, ich habe einige Dateien, die ich per Paint geändert habe, aber die weigern sich im Explorer die "neue" Zeit anzuzeigen und es kommt weiterhin die Erstellungszeit ... sehr seltsam das,
ob der Explorer bei Bilddateien auch Metadaten auswertet ?

Re: Filedate setzen

Verfasst: Mi, 17. Apr 2019 7:06
von brandelh
Es liefert und setzt, das Änderungsdatum ...

Code: Alles auswählen

PROCEDURE Main
   LOCAL cFile := "F:\DSO\_HB-Skill-GM.png"
   LOCAL dDate := stod("20180813")
   LOCAL cTime := "17:16:00"
   /* we use the ansi charset by default */
   SET CHARSET TO ANSI
   ? "Setze Datum und Zeit"
   ?
   ? "Datei:     " , cFile
   ? "aktuell:   " , fileDate(cFile),fileTime(cFile)
   ?
   ? "SetFDaTi():" , SetFDaTi(cFile,dDate,cTime)
   ?
   ? "Datei:     " , cFile
   ? "aktuell:   " , fileDate(cFile),fileTime(cFile)
   ?
   inkey(40)
   /* $TODO: place your application code here */
RETURN
die PNG Datei, wird von DIR so angezeigt:

Code: Alles auswählen

F:\DSO>dir _hb-skill-gm.png
 Datenträger in Laufwerk F: ist Samsung_T3
 Volumeseriennummer: 703B-156D

 Verzeichnis von F:\DSO

13.08.2018  17:16           164.541 _HB-Skill-GM.png
               1 Datei(en),        164.541 Bytes
               0 Verzeichnis(se), 11.486.887.936 Bytes frei

F:\DSO>
der Programmablauf ...

Code: Alles auswählen

Setze Datum und Zeit

Datei:      F:\DSO\_HB-Skill-GM.png
aktuell:    13.08.2018 17:16:00

SetFDaTi(): J

Datei:      F:\DSO\_HB-Skill-GM.png
aktuell:    13.08.2018 17:16:00
dennoch zeigt der Explorer von Win 7 64 Pro ...
ExplorerDatumAnzeige.png
ExplorerDatumAnzeige.png (3.81 KiB) 7673 mal betrachtet
Ich habe daher bei mir auch gleich die Spalte Änderungsdatum aktiviert.

Re: Filedate setzen

Verfasst: Mi, 17. Apr 2019 7:09
von brandelh
Der oben genannte LinK zur Wissensbasis zeigt auf die API Funktion

Code: Alles auswählen

BOOL SetFileTime(
  HANDLE         hFile,
  const FILETIME *lpCreationTime,
  const FILETIME *lpLastAccessTime,
  const FILETIME *lpLastWriteTime
);
und kann alle 3 Datumswerte setzen.

Re: Filedate setzen

Verfasst: Mi, 17. Apr 2019 7:48
von brandelh
Und wenn ich diese nutze, und so ausführe, dann wird das CREATE Datum auch so angezeigt wie ich das will ;-)

Code: Alles auswählen

#include "Common.ch"
#include "Fileio.ch"
#include "OT4XB.CH"
*#include "socket.ch"
#pragma library( "XBTBASE1.LIB" )
#pragma library( "XBTBASE2.LIB" )
#pragma library( "ADAC20B.lib" )




PROCEDURE Main

   LOCAL cFile := "F:\DSO\_HB-Skill-GM.png"
   LOCAL dDate := stod("20180813")
   LOCAL cTime := "17:16:00"

   // MSDN FILETIME Variablen (Pablo macht daraus Objekte - VIEL EINFACHER !)
*   LOCAL oFT    := FILETIME64():new():now()
   LOCAL oFCT
   LOCAL oFAT
   LOCAL oFWT
   LOCAL nH, cFN

   /* we use the ansi charset by default */
   SET CHARSET TO ANSI

   altd()

   ? "Setze Datum und Zeit"
   ?
   ? "Datei:     " , cFile
   ? "aktuell:   " , fileDate(cFile),fileTime(cFile)
   ?
   ? "SetFDaTi():" , SetFDaTi(cFile,dDate,cTime)
   ?
   ? "Datei:     " , cFile
   ? "aktuell:   " , fileDate(cFile),fileTime(cFile)
   ?
   ? "Nun mit Win API"
   ?

   altd()

   oFCT   := FILETIME64():new()
   oFAT   := FILETIME64():new()
   oFWT   := FILETIME64():new()


   cFN := cFile
   nH  := fOpen(cFN , FO_READWRITE + FO_SHARED )
   ? "Aktuelle Zeit als UTC=",   time("UTC")    ,"+00",time("+00"),"normal",time()  // habt ihr das schon gesehen ?
   ? "Lesen "
   ? "GetFileTime() = ",            @kernel32:GetFileTime(nH, @oFCT, @oFAT, @oFWT)    ,      @kernel32:GetLastError()
   // das war alles, nun kann man lesen.
   ? "Create:         ",oFCT:cTimeStamp
   ? "Access:         ",oFAT:cTimeStamp
   ? "Write:          ",oFWT:cTimeStamp
   // oder auch neu setzen ...
   // oFt:cTimeStamp := dtos(date())+"010203"
   ? "Setzen auf ... Änderungsdatum ..."
   ? "Create:         ",oFCT:cTimeStamp := oFWT:cTimeStamp
   ? "Access:         ",oFAT:cTimeStamp := oFWT:cTimeStamp
   ? "Write:          ",oFWT:cTimeStamp
   ? "SetFileTime() = ",@kernel32:SetFileTime(nH,oFCT, oFAT, oFWT)             ,@kernel32:GetLastError()
                        // was man nicht ändern will, einfach NIL setzen ...




   inkey(40)






   /* $TODO: place your application code here */
RETURN