Seite 2 von 2

Verfasst: 04.04.2008 16:56
von Kiffi
Agent hat geschrieben:Übrigens PB 4.2 Beta 2
willst Du hier SPAM-König werden?

Es gibt einen EDIT-Button!

Verfasst: 04.04.2008 16:56
von ts-soft
Agent hat geschrieben:Übrigens PB 4.2 Beta 2
Und? Haste es nochmal probiert. Im Explodierer siehste ja nur ein Datum, Du
solltest also das richtige Flag setzen, damit Du eine Änderung sehen kannst.

Verfasst: 04.04.2008 17:14
von jpd
Hi Agent,

hier ein beispiel für dich..

sind zwei modifizierte proceduren der droopy library!

FileGetTime und FileSetTime ...

umbenannt in DirGetTime und DirSetTime.

Hoffe das damit diese spam flut ein ende hat :-)

Ciao
jpd

Code: Alles auswählen

Procedure FileTimeToDate(*FT.FILETIME); - Convert API-Time-Format to PB-Date() 
  FileTimeToLocalFileTime_(*FT.FILETIME,FT2.FILETIME) 
  FileTimeToSystemTime_(FT2,st.SYSTEMTIME) 
  ProcedureReturn Date(st\wYear,st\wMonth,st\wDay,st\wHour,st\wMinute,st\wSecond) 
EndProcedure 
Procedure DateToFileTime(Date,*FT.FILETIME); - Convert PB-Date() to API-Time-Format 
  st.SYSTEMTIME 
  st\wYear=Year(Date) 
  st\wMonth=Month(Date) 
  st\wDayOfWeek=DayOfWeek(Date) 
  st\wDay=Day(Date) 
  st\wHour=Hour(Date) 
  st\wMinute=Minute(Date) 
  st\wSecond=Second(Date) 
  SystemTimeToFileTime_(st,FT2.FILETIME) 
  LocalFileTimeToFileTime_(FT2,*FT) 
EndProcedure 

ProcedureDLL DirGetTime(File.s,Which); - Get the time of a File 
  
  ; Wich specify wich time
  ; 0 = Time the File was created
  ; 1 = Time the file was last accessed
  ; 2 = Time the file was last written 
  
  ; return 0 if fail / Date in Purebasic format if success
  
  Result=0 
  ;handle=CreateFile_(@File,#GENERIC_READ,#FILE_SHARE_READ|#FILE_SHARE_WRITE,0,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL,0) 
  handle= CreateFile_(File, #GENERIC_WRITE | #GENERIC_READ ,#FILE_SHARE_READ, #Null, #OPEN_EXISTING, #FILE_FLAG_BACKUP_SEMANTICS, #Null) 

  If handle<>#INVALID_HANDLE_VALUE 
    Select Which
      Case 1
        GetFileTime_(handle,0,FT.FILETIME,0) 
      Case 2
        GetFileTime_(handle,0,0,FT.FILETIME) 
      Default
        GetFileTime_(handle,FT.FILETIME,0,0) 
    EndSelect
    
    Result=FileTimeToDate(FT) 
    CloseHandle_(handle) 
  EndIf 
  ProcedureReturn Result 
EndProcedure 

ProcedureDLL DirSetTime(File.s,Date,Which); - Set the time of a File
  ; Return 1 If succes / 0 If fail
  
  ; Which specify wich time
  ; 0 = Time the File was created
  ; 1 = Time the file was last accessed
  ; 2 = Time the file was last written 
  
  ;handle=CreateFile_(@File,#GENERIC_WRITE,#FILE_SHARE_READ|#FILE_SHARE_WRITE,0,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL,0) 
  handle= CreateFile_(File, #GENERIC_WRITE | #GENERIC_READ ,#FILE_SHARE_READ, #Null, #OPEN_EXISTING, #FILE_FLAG_BACKUP_SEMANTICS, #Null) 
  If handle<>#INVALID_HANDLE_VALUE 
    DateToFileTime(Date,FT.FILETIME) 
    
    Select Which
      Case 1
        retour=SetFileTime_(handle,0,FT.FILETIME,0) 
      Case 2
        retour=SetFileTime_(handle,0,0,FT.FILETIME) 
      Default
        retour=SetFileTime_(handle,FT.FILETIME,0,0) 
    EndSelect
    
    CloseHandle_(handle) 
  EndIf 
  
  If retour<>0 : retour=1 : EndIf
  ProcedureReturn retour
EndProcedure 


File.s="c:\Temp"
;CreateFile(0,File)
;CloseFile(0)




FileTime=DirGetTime(File,0)
Debug "Creation " + FormatDate("%dd:%mm:%yy %hh:%ii:%ss",FileTime)


FileTime=DirGetTime(File,1)
Debug "Last Access " + FormatDate("%dd:%mm:%yy %hh:%ii:%ss",FileTime)


FileTime=DirGetTime(File,2)
Debug "Last Written " + FormatDate("%dd:%mm:%yy %hh:%ii:%ss",FileTime)


DateCreated=ParseDate("%dd:%mm:%yy %hh:%ii:%ss","01:01:05 00:00:00")
DateLastAccessed=ParseDate("%dd:%mm:%yy %hh:%ii:%ss","01:01:05 00:01:00")
DateLastWritten=ParseDate("%dd:%mm:%yy %hh:%ii:%ss","01:01:05 00:02:00")
; 
; 
DirSetTime(File,DateCreated,0)
DirSetTime(File,DateLastAccessed,1)
DirSetTime(File,DateLastWritten,2)


Verfasst: 04.04.2008 17:55
von ts-soft
Der Riesencode ist doch überflüssig, PB kanns doch von Hause aus, auch
wenns nicht in der Hilfe steht :wink:

Verfasst: 04.04.2008 18:17
von jpd
ts-soft hat geschrieben:Der Riesencode ist doch überflüssig, PB kanns doch von Hause aus, auch
wenns nicht in der Hilfe steht :wink:
in der tat ich habe hier etwas von netmaestro gefunden....

http://www.purebasic.fr/english/viewtop ... 956#202956

aber mir wurde schon die variante mit SetFileDate interessieren :wink:

werde warcheinlich mein wochenende daran verplempern!!! :freak:

Verfasst: 05.04.2008 12:46
von Agent
Danke für die Posts.

@TS:
Prima das es mit hauseigenen Befehlen geht und nicht dokumentiert ist. Wenn mir jetzt noch jemand verrät, welches "geheime" Flag nötig ist kann ich es darüber nutzen ;)

Verfasst: 07.04.2008 11:50
von Shardik
ts-soft hat geschrieben:Der Riesencode ist doch überflüssig, PB kanns doch von Hause aus, auch wenns nicht in der Hilfe steht :wink:
ts-soft, hast Du deine Behauptung eigentlich einmal ausprobiert? :freak:
Zumindest mit PB 4.1 funktioniert dieser Beispiel-Code von mir _nicht_ (getestet unter WinNT SP6 und WinXP SP2 mit Admin-Rechten :wink::

Code: Alles auswählen

If ExamineDirectory(0, "C:\Test", "") <> 0
  FinishDirectory(0)
Else
  If CreateDirectory("C:\Test")
    Info.S = "Das Verzeichnis C:\Test wurde gerade neu angelegt!" + #CR$ + #CR$
    Info + "Erstanlage-Datum = " + FormatDate("%dd.%mm.%yyyy %hh:%ii:%ss", GetFileDate("C:\Test", #PB_Date_Created)) + #CR$
    Info + "Änderungs-Datum = " + FormatDate("%dd.%mm.%yyyy %hh:%ii:%ss", GetFileDate("C:\Test", #PB_Date_Modified)) + #CR$
    Info + "Letztes Zugriffs-Datum = " + FormatDate("%dd.%mm.%yyyy %hh:%ii:%ss", GetFileDate("C:\Test", #PB_Date_Accessed)) + #CR$

    MessageRequester("Info", Info)
  EndIf
EndIf

SetFileDate("C:\Test", #PB_Date_Modified, ParseDate("%dd.%mm.%yyyy %hh:%ii:%ss", "01.01.2008 00:00:00"))

Info = "Das Erstanlage-Datum für das Verzeichnis C:\Test wurde abgeändert!" + #CR$ + #CR$
Info + "Erstanlage-Datum = " + FormatDate("%dd.%mm.%yyyy %hh:%ii:%ss", GetFileDate("C:\Test", #PB_Date_Created)) + #CR$
Info + "Änderungs-Datum = " + FormatDate("%dd.%mm.%yyyy %hh:%ii:%ss", GetFileDate("C:\Test", #PB_Date_Modified)) + #CR$
Info + "Letztes Zugriffs-Datum = " + FormatDate("%dd.%mm.%yyyy %hh:%ii:%ss", GetFileDate("C:\Test", #PB_Date_Accessed)) + #CR$

MessageRequester("Info", Info)
Wenn Du einen anderen Ansatz hast, der doch funktioniert, wäre es schön, wenn Du ihn uns zeigen könntest. Denn selbst netmaestro (einer der fähigsten Programmierer im englischen Forum) erklärt, daß es mit den PB-Befehlen nicht geht:
http://www.purebasic.fr/english/viewtop ... 14&start=1
netmaestro hat geschrieben:PureBasic's SetFileDate command works with files but not with folders. This is due to the fact that the SetFileDate_() API needs a valid folder handle to set the creation date and a string isn't going to cut it.
Er verweist gleichzeitig auf sein API-Beispiel, das auch jpd angeführt hat und das tatsächlich tadellos funktioniert:
http://www.purebasic.fr/english/viewtopic.php?t=28023

Verfasst: 07.04.2008 11:53
von Agent
Hi.

Ich kann das nur bestätigen, bei mir geht es auch nicht.

Mein Testcode:

Code: Alles auswählen


dir$= "C:\_ordnerdatum"


If Not CreateDirectory(dir$)
  Debug "no create"
EndIf 

If SetFileDate(dir$, #PB_Date_Created, ParseDate("%dd.%mm.%yyyy", "01.01.2006"))
  Debug FormatDate("%dd.%mm.%yyyy", GetFileDate(dir$, #PB_Date_Created))
Else
  Debug "no set"
EndIf


Debug "done"
...und nicht lästern, ist nur ein TESTCODE ;)

Verfasst: 07.04.2008 13:06
von ts-soft
>> ts-soft, hast Du deine Behauptung eigentlich einmal ausprobiert? :freak:
Ja, als es noch ging :oops:
Scheint nicht mehr zu gehen, komisch. Naja hab lange nix mehr gemacht

Verfasst: 07.04.2008 19:11
von Shardik
ts-soft hat geschrieben:Scheint nicht mehr zu gehen, komisch.
Weißt Du vielleicht noch die Version? Die 3.9x-Version kann es nicht gewesen sein, weil es damals die SetFileDate()-Funktion noch nicht gab...
ts-soft hat geschrieben:Naja hab lange nix mehr gemacht
[OT]
Wie kommt es? Ich habe Deine (früher sehr zahlreichen) Beiträge seit mindestens einem halben Jahr sehr vermißt. Ich habe nämlich viele hilfreiche Code-Schnippsel von Dir in meinem Tipps-Archiv und arbeite fast täglich mit Deiner PureDispHelper-Library, für die ich Dir eigentlich garnicht genug danken kann :allright:. Seitdem ich nämlich die COM/ActiveX-Programmierung damit so bequem erledigen kann, brauche ich mein altes Visual BASIC 6 fast überhaupt nicht mehr...
Du hattest einmal geäußert, daß Dein PC irreparabel ins Nirwana übergegangen ist und Du keinen ständigen Internet-Zugang mehr hast? Wie es aussieht, hat sich diese Situation doch jetzt hoffentlich gebessert, weil ich jetzt wieder häufiger Deine Postings lese...
[/OT]