Probleme mit GetFileDate()

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Es wäre cool, wenn es einen Thread gebe, der schnellere Procedures
> vergleicht.....Denn Speed ist doch heutzutage wichtig ... --- .. Oder?

http://forums.purebasic.com/german/view ... 0324#50324

;-)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

Falls die Applikation nur unter Windoof laufen soll geht auch folgendes.
Stell doch ne Kopierliste zusammen (Prüfroutinen hast du ja) und behandel die mit XCOPY statt mit copyfile(). Das sollte die DateiDatümmer in Ruhe lassen bzw. mitkopieren.

(Xcopy ist allerdings auf den unterschiedlichen WinVersionen auch immer etwas unterschiedlich)

Ich benutz xcopy auch für meine abendlichen Sicherungsjobs und hab damit noch nie Probs gehabt, die ich nicht selber verursacht habe ( :!: auch BatchJobs müssen ordentlich programiert werden.)

Ob das die schnellste aller Möglichkeiten ist weiß ich nicht und wage es auch zu bezweifeln. Aber im Zweifelsfall geht immer noch Sicherheit und geringe Kosten gegen Speed (ist doch letztlich vollkommen Piepegal ob so ein Kopierjob ne Minute oder etwas länge braucht) Mein abendliche SicherungjobRoutine z.B. (umfasst xcopy's diverstester Verzeichnisse auf Spiegelpartitionen und USB-Platte, dts-jobs in Datenbanken, Zip-routinen) dauert ca 2 Minuten. Dabei werden Daten im Umfang von schätzungweise 700MB zumidest angepackt und davon ca 100MB kopiert.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag von Agent »

Next Step:

Ich habe meine Copy-Routine so umgebaut, das nach erfolgreichem kopieren das Datum der Org.Datei gesetzt wird. Und? Was ratet ihr? Same shit.

Tja...was soll ich sagen. Ob das irgendwie mit der URURURalten HDD hier in der Firma zusammenhängt? C: und D: sind die gleiche Platte (hardware). Wenn beide auf C: liegen gehts. liegt das ziel auf D: - gehts nicht. 1-2 Sekunden versatz. TROTZ angeglichenem Datum!

Ich werd den kram jetzt compilieren und dann hier in der Firma auf verschiedenen Systemen testen. Heute abend dann zu Hause. Wenns überall funzt, schieb ichs auf die Hardware (die sowieso extrem alt ist).

Übrigens wäre es mir neu, wenn CopyFile() irgendwas an der Datei fummelt (wär ja auch sinnlos).
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

Hi Agent, ...

probier doch mal aus, was mit dem Datum passiert, wenn Du von D: nach C: kopierst.

Gruß, PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag von Agent »

Hi PL!

Wäre mal den Versuch wert. Habs auf anderen PCs probiert: läuft problemlos.

Kann mir einer erklären, warum der Fensteraufbau in PB immer so lahm ist??? Habs schon mit Callback probiert usw.
Jedesmal wenn ich ein Fenster mit ein paar Gadgets mache, es starte und dann ein anderes Fenster mein Programm überlagert und ich dann das überlagernde Fenster wieder wegziehe, wird mein Programmfenster relativ langsam aufgebaut (aufbau noch erkennbar - von oben nach unten)...

Hier mal ein Bsp:

Code: Alles auswählen


Enumeration ; Fenster
  #win_main
  #main_statusbar
EndEnumeration

Enumeration ; gadgets
  #main_image_icon
  
  #main_button_source
  #main_text_source
  #main_button_target
  #main_text_target
  
  #main_frame_options
  #main_checkbox_logging
  #main_checkbox_md5
  #main_checkbox_delete
  
  #main_text_sourcefiles
  #main_string_sourcefiles
  #main_text_targetfiles
  #main_string_targetfiles
  #main_text_differentfiles
  #main_string_differentfiles
  #main_text_neueordner
  #main_string_neueordner
  #main_text_deletedfiles
  #main_string_deletedfiles
  #main_text_bytes
  #main_string_bytes
  #main_listview
  
  #main_frame_statistic
  #main_progressbar
  #main_text_progress
  
  #main_button_about 
  #main_button_start
EndEnumeration

Procedure wait4win()
  Repeat
    Delay(1)
  Until WindowEvent()=0
EndProcedure
Procedure WindowCallback(hwnd, Message, wParam, lParam) 
  result = #PB_ProcessPureBasicEvents 
  Select Message  
    Case #WM_SIZE ; Größe ändern
      Debug "Size changed:"
      Select wParam 
        Case #SIZE_MINIMIZED
          Debug "MINIMIZED"
        Case #SIZE_RESTORED 
          Debug "RESTORED"
        Case #SIZE_MAXIMIZED
          Debug "MAXIMIZED"
      EndSelect  
      
    Case #WM_RButtonDown ; Rechte Maus
      Debug "Right Mousebutton"
      
    Case #WM_LButtonDown ; LInks Maus
      Debug "Left Mousebutton" 
      
    Case #WM_MButtonDown ; Mittlere Maus
      Debug "Middle Mousebutton"
      
    Case #WM_MOVE 
      Debug "Window moved"
  EndSelect 
  ProcedureReturn result 
EndProcedure 

win_main=OpenWindow(#win_main,0,0,400,475,#PB_Window_ScreenCentered | #PB_Window_SystemMenu,"TEST")
If win_main And CreateGadgetList(win_main) And CreateStatusBar(#main_statusbar,win_main)
  main_w=WindowWidth(): main_h=WindowHeight()
  oben=10 : links=20 : buttonbreite=100 : hoehe=20 : abstand=10 : abstand_klein=5: textbreite=100 : stringbreite=100

  TextGadget(#main_text_source, links, oben+5, main_w-links-buttonbreite-abstand*3, hoehe, "(Bitte Quell-Verzeichnis auswählen)", #PB_Text_Right)
  ButtonGadget(#main_button_source, main_w-buttonbreite-abstand*2, oben, buttonbreite, hoehe, "Quelle", $8000)
  
  oben+hoehe+abstand
  TextGadget(#main_text_target, links, oben+5, main_w-links-buttonbreite-abstand*3, hoehe, "(Bitte Ziel-Verzeichnis auswählen)", #PB_Text_Right)
  ButtonGadget(#main_button_target, main_w-buttonbreite-abstand*2, oben, buttonbreite, hoehe, "Ziel", $8000)
  
  oben+hoehe+abstand*2
  Frame3DGadget(#main_frame_options, links-10, oben, main_w-links, hoehe*4+abstand*3, "Optionen")
  oben+abstand*2
  CheckBoxGadget(#main_checkbox_logging, links, oben, main_w-links*2, hoehe, "Logging aktivieren (Datei: "+logfile$+")")
  oben+hoehe+abstand
  CheckBoxGadget(#main_checkbox_md5, links, oben, main_w-links*2, hoehe, "zusätzlich MD5-Fingerprint prüfen (hoher Zeitaufwand)")
  oben+hoehe+abstand
  CheckBoxGadget(#main_checkbox_delete, links, oben, main_w-links*2, hoehe, "Überflüssige Dateien auf Ziel löschen")
  
  oben+hoehe+abstand*2
  Frame3DGadget(#main_frame_statistic, links-10, oben, main_w-links, hoehe*6+abstand*6, "Statistik") 
  oben+abstand*2
  TextGadget(#main_text_sourcefiles, links, oben, textbreite*2, hoehe, "Quell-Dateien")
  StringGadget(#main_string_sourcefiles, main_w-textbreite-abstand*2, oben, stringbreite, hoehe, "0", #PB_String_ReadOnly | #PB_Text_Right)
  oben+hoehe+abstand_klein
  TextGadget(#main_text_targetfiles, links, oben, textbreite*2, hoehe, "Ziel-Dateien")
  StringGadget(#main_string_targetfiles, main_w-textbreite-abstand*2, oben, stringbreite, hoehe, "0", #PB_String_ReadOnly | #PB_Text_Right)
  oben+hoehe+abstand_klein
  TextGadget(#main_text_differentfiles, links, oben, textbreite*2, hoehe, "Datei-Differenzen")
  StringGadget(#main_string_differentfiles, main_w-textbreite-abstand*2, oben, stringbreite, hoehe, "0", #PB_String_ReadOnly | #PB_Text_Right)
  oben+hoehe+abstand_klein
  TextGadget(#main_text_neueordner, links, oben, textbreite*2, hoehe, "Neue Ordner angelegt")
  StringGadget(#main_string_neueordner, main_w-textbreite-abstand*2, oben, stringbreite, hoehe, "0", #PB_String_ReadOnly | #PB_Text_Right)
  oben+hoehe+abstand_klein
  TextGadget(#main_text_deletedfiles, links, oben, textbreite*2, hoehe, "Gelöschte Dateien")
  StringGadget(#main_string_deletedfiles, main_w-textbreite-abstand*2, oben, stringbreite, hoehe, "0", #PB_String_ReadOnly | #PB_Text_Right)
  oben+hoehe+abstand_klein
  TextGadget(#main_text_bytes, links, oben, textbreite*2, hoehe, "Bytes kopiert")
  StringGadget(#main_string_bytes, main_w-textbreite-abstand*2, oben, stringbreite, hoehe, "0", #PB_String_ReadOnly | #PB_Text_Right)
  
  oben+hoehe*2+abstand
  ProgressBarGadget(#main_progressbar, links-10, oben, main_w-links-(textbreite/2)-abstand, hoehe, 1, 100, #PB_ProgressBar_Smooth)
  TextGadget(#main_text_progress, main_w-(textbreite/2)-abstand*2, oben+5, textbreite/2, hoehe, "0%", #PB_Text_Right)
  
  ButtonGadget(#main_button_start, links-10, main_h-50, buttonbreite*2, hoehe, "Starte Synchronisation",$8000)
  ButtonGadget(#main_button_about, main_w-abstand-buttonbreite, main_h-50, buttonbreite, hoehe, "About", $8000)
  
  AddStatusBarField(250)
  StatusBarText(#main_statusbar,0,"Bitte Quell- und Zielverzeichnis wählen...")
  AddStatusBarField(150)
  StatusBarText(#main_statusbar,1,"(c) "+FormatDate(" %yyyy",Date()))
  wait4win()
Else
  MessageRequester(""+" FEHLER","Konnte Fenster nicht aufbauen!",#mb_iconerror)
  End
EndIf

SetWindowCallback(@WindowCallback()) 


Repeat
  Delay(1)
  winevent=WindowEvent()
  
Until winevent=#PB_Event_CloseWindow Or main_exit=#True Or nowin=#True
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag von Agent »

Mir ist der Unterschied nicht klar, aber es gibt ihn....

Code: Alles auswählen

Repeat : Until WindowEvent()=0
ist NICHT gleich

Code: Alles auswählen

While WindowEvent() : Wend
:/

Any Ideas?
Wie ich drauf komme? Ganz einfach:
Ich hab folgende Procedure, die ich in alle Progs verwende, sobald was am Fenster passiert (grob gesagt):

Code: Alles auswählen

Procedure wait4win()
  Repeat : Delay(1) : Until WindowEvent()=0
EndProcedure
wenn ich in meiner Repeat Schleife ein wait4win() reinmache, passiet oben beschriebenes (langsamer Aufbau)....nehm ich aber diese Proc:

Code: Alles auswählen

Procedure wait4win()
  While WindowEvent() : Wend
EndProcedure
Geht das einwandfrei. Sobald man das überlappende Fenster wieder wegzieht ist mein Programmfenster komplett da. Null Aufbauzeit.

Man lernt noch dazu....

Das wait4win() steht bei mir in der Warteschleife des Programms, zb.

Code: Alles auswählen

Repeat
  Delay(1)
  wait4win()
  winevent=WindowEvent()
  
  ;....gadgets abfragen...
Until winevent=#PB_Event_CloseWindow
Alternativ im WindowCallBack ist das übrigens event 312....darunter sollte dann ein wait4win() stehen ;)

zb.
Procedure WindowCallBack(....)
select msg
case 312
wait4win()
endselect
endprocedure
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Mir ist der Unterschied nicht klar, aber es gibt ihn....
While ist eine Kopfgesteuerte Schleife, nur wenn die Bedingung zutrifft wird diese Schleife überhaupt jemals ausgeführt, im Gegensatz zur Repead-Schleife, diese ist Fußgesteuert, wird als in jedemfall einmal durchlaufen, da die Bedingung erst am Schluß geprüft wird
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag von Agent »

Dieser Unterschied ist klar.
Warum sich das genau SO auf das Fenster auswirkt ist mir allerdings nicht klar...
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Benutzeravatar
AndyMars
Beiträge: 141
Registriert: 08.09.2004 11:59
Computerausstattung: Win11 Prof 64bit, i5-13500 @ 4.8 GHz, 32GB RAM, Nvidia RTX 4070 TI
Wohnort: Zürich, Schweiz
Kontaktdaten:

Probleme mit GetFileDate() - FAT, NTFS

Beitrag von AndyMars »

Ist zwar schon 'ne Weile her - aber der Vollständigkeit halber schreib ich's trotzdem noch hin:

Das Phänomen, das hier beschrieben wird, kann auftreten bei Synchronisationen zwischen unterschiedlichen Dateisystemen, welche das Datum mit unterschiedlicher Präzision speichern. Dies ist nämlich genau bei FAT und NTFS der Fall - ich vermute jetzt einfach mal, dass die Festplatte mit NTFS und der USB-Stick mit FAT fomatiert war (ist zumindest so üblich).

Es gibt im Übrigen noch mehr Probleme zwischen diesen Dateisystemen - die Sommerzeitabweichung wird ebenfalls unterschiedlich gespeichert :twisted: - ganz gemein, denn man stellt dies in der Regel erst ca. 1/2 Jahr nach der Programmierung fest...

Die 1. Lösung wurde schon festgestellt - <=2 Sekunden Abweichung sind zu ignorieren...

Die Sommerzeitabweichung erfordert ein Ignorieren von Abweichungen von genau 1 und/oder 2 Stunden (+/- 2 Sekunden).

Wer das jetzt noch ganz raffiniert machen will, stellt vor irgendwelchen Abgleich-Prozessen das jeweilige Dateisystem fest...
Grüsse von AndyMars
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag von Agent »

Hallo Andy.

Danke für den Hinweis. Das wusste ich nicht mit FAT und NTFS. Aber wie Du schon richtig vermutet hast, Platte NTFS und Stick FAT32.
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Antworten