Seite 1 von 1

Dateizugriff teilen.

Verfasst: 26.10.2012 03:55
von BSP
Hallo.
Für mein Stromzählerprg habe ich nun festgelegt, wie ich die Daten sicher.
Nun gehts an die Grafikauswertung.
Nun habe ich folgendes Überlegt.
Ich teile mein Prg in den Sensorteil und den Auswerteteil.
Mache also zwei Prgs daraus.
So läuft das Sensorteil munter weiter und sammelt schon mal Daten,
wärend ich an der Auswertung basteln kann.
Nun meine Frage:
Welches sind die Funktionen, die mir melden, wenn eine Datei gerade von einem anderen Prg benutzt wird, also geöffnet ist?
Hier mal zwei Minibeispiele, mit denen ich das Teste.

Diesen Teil Compilieren und als exe starten:

Code: Alles auswählen

OpenWindow(0,0,0,200,200,"Test1")

OpenFile(0,"c:\Test1.txt")
WriteStringN(0,"Test")

Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow

CloseFile(0)
Dieses Teil starten, wärend der erste Teil läuft.
Es wartet, bis das erste Prg beendet wurde und die Datei wieder frei ist, schreibt seinen Satz und endet dann ebenfalls.

Code: Alles auswählen

OpenWindow(0,0,0,200,200,"Test2")

Repeat
  ok=OpenFile(0,"c:\Test1.txt")
  If ok
    FileSeek(0,Lof(0))
    WriteStringN(0,"Test2")
    CloseFile(0)
  EndIf
  While Not WindowEvent():Wend
Until ok
Gruß und Dank shon mal im Voraus:
Bernd

PS.
Interessant ist, das der MS- Editor geöffnete Dateien zumindest lesen kann, (aber natürlich nicht beschreiben),
aber PB verweigert auch das lesen.

Code: Alles auswählen

OpenWindow(0,0,0,200,200,"Test2")

Repeat
  ok=ReadFile(0,"c:\Test1.txt")
  If ok
    While Not Eof(0)
    Debug ReadString(0)
    Wend
    CloseFile(0)
  EndIf
  While Not WindowEvent():Wend
Until ok

Re: Dateizugriff teilen.

Verfasst: 26.10.2012 12:17
von bobobo
copyfile geht aber
eventuell ist sowas eine simple Lösung

Part 1

Code: Alles auswählen

;erzeugt fortlaufend (irrelevante) Daten und die Datei wird immer größer
OpenWindow(0,0,0,200,200,"Test1")
OpenFile(0,"c:\Test1.txt")
Repeat
 event=WaitWindowEvent(25)
  Debug WriteStringN(0,"Test::"+Str(ElapsedMilliseconds()))
Until event=#PB_Event_CloseWindow
CloseFile(0)

Part 2

Code: Alles auswählen

;Kopiert erstmal und liest die Kopie, die dann am Ende gelöscht wird
OpenWindow(0,0,0,200,200,"Test2")
CopyFile("c:\Test1.txt","c:\Test1.txt.bak")
Repeat
  ok=ReadFile(0,"c:\Test1.txt.bak")
  If ok
    While Not Eof(0)
    Debug ReadString(0)
    Wend
    CloseFile(0)
    DeleteFile("c:\Test1.txt.bak")
  Else
    Debug "nicht ok"
  EndIf
  While Not WindowEvent():Wend
Until ok

Re: Dateizugriff teilen.

Verfasst: 26.10.2012 21:09
von BSP
Hallo bobobo.
Danke erst einmal für Deine Mühe.
Aber ich muss gestehen, für wirklich praktisch halte ich die Lösung nicht.
In meinem Beispiel bin ich ja von dem Idealfall ausgegangen, die Datei ist auf jeden Fall für Part1 frei.
Streng genommen muss ja aber auch Part1 die Überprüfungen vornehmen, ob die Datei zum Bearbeiten frei ist. Vieleicht liest Part2 ja gerade.
Eine Möglichkeit wäre nun also:
Die beiden Parts überprüfen sich gegenseitig, ob sie noch laufen.
Und wenn ja, schicken sie sich gegenseitig Meldungen zu.
Aber diese Vorgehenweise halte ich für übertrieben.

Es muss doch eine einfache Möglichkeit geben zu überprüfen, warum eine Datei gerade nicht zum Bearbeiten bereit ist.
Datei kann nicht geöffnet werden weil:
- Datei wird gerade von einem anderen Prg genutzt.
Also abwarten und Daten zwischenspeichern.
- Datenträger ist voll.
Nutzer hat gepennt. Also auf anderen Datenträger ausweichen oder Feierabend machen.
- Window hat gerade keinen Bock.
Also nach Schritt 1 verfahren.

Gruß: Bernd

Re: Dateizugriff teilen.

Verfasst: 27.10.2012 06:31
von 7x7
Bei Dateioperationen gilt die goldene Regel: öffnen -> schreiben/lesen -> schliessen! Durch das offenhalten blockiert man logischerweise alle anderen Programme die ebenfalls mit dieser Datei arbeiten wollen.

In deinem Fall heisst das also:
Datei Messdaten öffnen -> neue Messdaten anhängen ->Datei Messdaten schliessen. Der ganze Vorgang ist blitzschnell erledigt.

Dein zweiter Thread/zweites Programm das die Messdaten analysiert oder weiter verarbeitet, kann die Datei öffnen ->alle daten einlesen/letztes Datum einlesen ->schliessen. Auch blitzschnell erledigt und nix wird blockiert.


Z.B. Notepad macht das genauso. Deswegen kann ich 2xNotepad öffnen, jeweils die gleiche Datei einlesen, unabhängig bearbeiten, und nach belieben speichern, ohne das Notepad(1) das Notepad(2) stört.

Re: Dateizugriff teilen.

Verfasst: 27.10.2012 06:57
von BSP
Guten morgen, 7x7.
In deinem Fall heisst das also:
Datei Messdaten öffnen -> neue Messdaten anhängen ->Datei Messdaten schliessen. Der ganze Vorgang ist blitzschnell erledigt.
Bei meinen eigentlichem Prg mache ich das auch so.
Das ich oben die Datei offen gelassen habe, geschah nur zu demo- Zwecken.
Du hast recht. Die Dateioperationen laufen sehr schnell ab.
Aber trotzdem besteht die Gefahr, das sich meine Zwei Prgs dabei in die Quere kommen können.
Das muss man abfangen. Und da kann es dann wichtig sein zu wissen, warum eine Datei gerade gesperrt ist.

Interessant ist:
Der MS- Editor liest auch eine offene Datei. PB mag offene Dateien garnicht. Was ja im Prinzip auch richtig ist. Wenn das Eine gerade schreibt, wärend das Andere liesst, bekommt das Lesende eventuell nicht alles mit.

Gibt es vieleicht eine einfache API, die mir sagt, ob eine Datei frei zum bearbeiten ist und wenn ja, warum nicht?

Gruß: Bernd