Seite 1 von 2
FormatDate mit Millisekunden?
Verfasst: 10.10.2004 12:18
von Kiffi
Hallo,
ich generiere mehrere Dateien über einen längeren Zeitraum und benenne
sie dann mittels aktuellem Datum und Zeit der Generierung.
FormatDate("%yyyy%mm%dd%hh%ii%ss", Date())
Generiert mir:
C:\temp\20041010123044.txt
C:\temp\20041010123045.txt
C:\temp\20041010123046.txt
Nun kann es vorkommen, daß in der selben Sekunde zwei oder mehr
Dateien geschrieben werden. Aus diesem Grund würde ich gerne noch die
Angabe der Millisekunden an den Dateinamen hängen.
C:\temp\2004101012304602.txt
C:\temp\2004101012304612.txt
C:\temp\2004101012304705.txt
Leider habe ich noch nicht gefunden, wie ich dieses bewerkstelligen könnte.
Any hints?
Danke im voraus & Grüße ... Kiffi
Verfasst: 10.10.2004 12:38
von remi_meier
Du könntest doch auch anstatt die Millisekunden hinzuschreiben einfach irgendwo eine globale strukturierte Variable machen, wo drinn steht, wieviele Dateien schon mit der aktuellen Zeit geschrieben worden sind. Dann kannst du eine Dateinummer dahinter schreiben.
Bsp.:
Structure
AnzDateien.l
AktZeit.l
EndStructure
Und jetzt einfach immer wenn die AktZeit mit der Aktuellen Zeit nicht mehr übereinstimmt, AnzDateien auf 0 setzten. Und wenn eine neue Datei in der gleichen Zeit erstellt wird, die AnzDateien + 1 rechnen!
greetz
remi
Verfasst: 10.10.2004 12:45
von NicTheQuick
Am Anfang lässt rechnest du ein Offset für [c]ElapsedMilliseconds()[/c] aus, damit dies immer Null ist, wenn die Sekunden von [c]Date()[/c] umspringen
Code: Alles auswählen
sek_old.l = Second(Date())
Repeat
Offset = ElapsedMilliseconds() % 1000
Until (Second(Date()) - sek_old + 60) % 60 = 1
und dann nimmst du immer folgenden Code zum Dateinamen generieren
Code: Alles auswählen
FormatDate("%yyyy%mm%dd%hh%ii%ss", Date()) + RSet(Str((ElapsedMilliseconds() - Offset) % 1000), 4, "0")
Verfasst: 10.10.2004 12:46
von Smash
Hallo Kiffi,
Ist vielleicht nicht die beste Variante aber eventuell hilft es ja.
Code: Alles auswählen
Global Millisekunden.f
Millisekunden.f = 0
Procedure Schreibe()
Millisekunden.f = Millisekunden.f +1
Debug FormatDate("%yyyy%mm%dd%hh%ii%ss",Date()) + Str(Millisekunden.f)
EndProcedure
Repeat
Schreibe()
Delay(100)
ForEver
End
Verfasst: 10.10.2004 12:50
von remi_meier
Ich weiss jetzt zwar nicht wie schnell solche Dateizugriffe sind, aber ich denke, dass es trotzdem noch vorkommen kann, dass 2 Dateien innerhalb von 10ms geschrieben werden können (Die Genauigkeit von ElapsedMilliseconds() ist ja etwa 10ms). Deshalb habe ich auch die kompliziertere Methode vorgeschlagen.
greetz
remi
EDIT: Smashs Beitrag hab ich übersehen. Der ist natürlich noch einfacher (nimm aber nicht Floats und setze Millisekunden auch mal wieder auf 0)!
Verfasst: 10.10.2004 12:54
von Smash
Mann seid ihr alle schnell!
Ps.
Super das die Suche in der HTML Hilfe
Milliseconds nicht auf ElapsedMilliseconds() verweist.
Bis eben dachte ich den Befehl gibt es überhaupt nicht.
Verfasst: 10.10.2004 13:01
von remi_meier
In diesem Fall ists ja auch besser, dass du ihn nicht gefunden hast
Kannst auch GetTickCount_() oder timeGetTime_() verwenden (WinAPI)!
Ich glaube, für die Suchfunktion der Hilfe kannste M$ verantwortlich machen

Verfasst: 10.10.2004 13:39
von Smash
Mach ich _________

M$
Danke für die APIs
____________________________________________
@remi, Wieso keine Floats ?
Die hab ich benutzt weil sie angeblich unlimitiert sind.
Hab’s aber hier noch mal überarbeitet
Code: Alles auswählen
OpenWindow(0, 30, 200, 200, 20, #PB_Window_SystemMenu, "EXIT")
Global MilliNr.w : MilliNr.w = 0
Global Tick.s : Tick.s = "0"
Procedure Schreibe()
If FormatDate("%ss",Date()) <> Tick.s
Tick.s = FormatDate("%ss",Date())
MilliNr.w = 0
EndIf
Debug FormatDate("%yyyy%mm%dd%hh%ii%ss",Date()) +"-"+ Str(MilliNr.w)
MilliNr.w = MilliNr.w +1
EndProcedure
Repeat : Schreibe()
Select WindowEvent()
Case #PB_EventCloseWindow
End
EndSelect
;Delay(3)
ForEver
End
Verfasst: 11.10.2004 07:33
von sunset
Ich habe das selbe Problem gehabt und einfach eine Abfrage eingebaut, die bei einer bereits vorhandenen Datei den Wert jeweils um eine Sekunde senkt, bis ein freier 'Platz' gefunden ist.
Das ist dann m.E. die einfachste Lösung.
Frank
Verfasst: 11.10.2004 07:58
von Kiffi
@All: Vielen Dank für Eure schnelle Hilfe
Grüße ... Kiffi