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 :D
Kannst auch GetTickCount_() oder timeGetTime_() verwenden (WinAPI)!
Ich glaube, für die Suchfunktion der Hilfe kannste M$ verantwortlich machen :lol:

Verfasst: 10.10.2004 13:39
von Smash
Mach ich _________ :twisted: M$ :twisted:

Danke für die APIs :allright:

____________________________________________

@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 :allright:

Grüße ... Kiffi