csv-öffenen shared-read?

Hallo,
kann ich mit LO ein csv-File 'Shared-Read' öffnen (dass andere Programme auch das File öffnen und lesen können, obwohl es in LO geöffnet ist)?
Wenn ja wie?

Ich weiß, daß das csv dann vielleicht nicht 'update' ist - trotzdem!
Gooly

Hallo Gooly,

kann ich mit LO ein csv-File 'Shared-Read' öffnen (dass andere Programme
auch das File öffnen und lesen können, obwohl es in LO geöffnet ist)?

Ich habe das gerade einmal getestet: CSV-Datei in LO-Base (als
eingebundene Texttabelle) geöffnet, dann noch in Calc und in einem
einfachen Textprogramm (KWrite) geöffnet.

Das größte Problem ist wohl nachher eine Integrität der Datei hin zu
bekommen. Beim Speichern in Calc wurde ich zwar gewarnt, dass ein
anderes Programm die Datei geändert hätte - die Änderungen aus Base
waren dann verloren, wurden aber in der Base-Tabelle munter weiter
angezeigt. KWrite zeigt mit einer Meldung jede Dateiänderung durch ein
anderes Programm an, so dass ich die neueste Version laden kann.

Da gibt es meines Wissens nirgendwo eine Schutzmöglichkeit, die es
anderen Programmen verbietet, nicht nur lesend, sondern auch schreibend
auf *.csv-Dateien zuzugreifen.

Problem wird also sein, dass gar kein Schreibschutz da ist und bei
unbedachtem Arbeiten die Datenintegrität der Datei nicht mehr
gewährleistet ist.

Gruß

Robert

Hallo Gooly,

kann ich mit LO ein csv-File 'Shared-Read' öffnen (dass andere Programme
auch das File öffnen und lesen können, obwohl es in LO geöffnet ist)?

Ich habe das gerade einmal getestet: CSV-Datei in LO-Base (als
eingebundene Texttabelle) geöffnet, dann noch in Calc und in einem
einfachen Textprogramm (KWrite) geöffnet.

Hmm,
mein Programm möchte das csv-file öffnen mit den Win-Api-Funktionen.
Also I öffne das csv-file in LO(Version 3.6.7.2 (Build ID: e183d5b) save Version) und dann in meinem Programm mache ich:

#import "kernel32.dll" //http://msdn.microsoft.com/en-us/library/windows/desktop/aa365467%28v=vs.85%29.aspx
...
  int wHdl = CreateFileW(fName, GENERIC_READ, WinFILE_SHARE_READ, WinNULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, WinNULL);
  if ( wHdl == INVALID_HANDLE ) {
    Print("ERROR Win32: Invalid Handle ",getWinErrors()," ",addErr);
    SetUserError( ERR_FILE_INVALID_HANDLE ); return("");
  }

und erhalte als Fehlermeldung:

ERROR Win32: Invalid Handle ERROR_SHARING_VIOLATION ReadCsvFile: 1834
( #define ERROR_SHARING_VIOLATION 32 // (0x20) The process cannot access the file because it is being used by another process. )

Das mit der Integrität ist mir klar! In meinem Fall ist csv offen, weil ich etwas geändert habe und das ich jetzt im anderen Programm überprüfen will...

Warum setzt Dein Code der in das CSV-File hinein schreiben will
nicht einfach eine leere Datei gleichen Namens nur mit einem ".lock"
als Surfix dahinter (Bsp: YXName.csv.lock ) und löscht dann das
Lock-File, wenn die Schreibaktion beendet ist ?

Gibt es das Lock-File, kann nur von anderen Threads oder Forks die
CSV-Datei nur gelesen werden.

Gruß Achim

Warum setzt Dein Code der in das CSV-File hinein schreiben will
nicht einfach eine leere Datei gleichen Namens nur mit einem ".lock"
als Surfix dahinter (Bsp: YXName.csv.lock ) und löscht dann das
Lock-File, wenn die Schreibaktion beendet ist ?

Gibt es das Lock-File, kann nur von anderen Threads oder Forks die
CSV-Datei nur gelesen werden.

Gruß Achim

Nein, nein nein.
Ich schreibe händisch die 'sets' in das csv-file und mein Programm soll das dann auslesen. Deswegen habe ist das csv geöffnet und will dann beobachten, was daraus gemacht wird.
Und das Lesen scheitert dann, wenn LO :frowning:
Ja das lock-file ( .~lock.Name.csv# ) gibt es!
gooly

Das ist aber kein 'shared read', wonach Du im OP gefragt hast; denn
mindestens einer der beteiligten Prozesse /liest/ nicht, sondern
/schreibt/. Was Du suchst, ist so was wie 'Optimistic Concurrency' o.
ä., bei dem mehrere Benutzer gleichzeitig schreibend()! und lesend
zugreifen können. Aber das erfordert Locking- und Messasging-funktionen,
die ein einfaches Betriebssystem nicht zur Verfügung stellen kann. Du
hast bei Deiner Vorgehensweise ja noch nicht mal die Möglichkeit, Deine
Änderung überhaupt physikalisch wirklich in die Datei zu bekommen (man
Caching).

Du benötigst *ein* System, welches die Zugriffe *beider* Benutzer
*gleichzeitig* überwacht und koordiniert; sprich eine
*netzwerkfähige*[1] Datenbankapplikation.

[1] auch wenn das 'Netzwerk' nur auf einem einzigen Rechner läuft. Der
Begriff steht einfach nur für den Gegensatz zu einer
Single-User-Applikation, wie die mitgelieferte HSQLDB engine eine ist.
AFAIK ist z. B. MySQL netzwerkfähig (oder es gibt das zumindest auch als
netzwerkfähige Version).

Wolf 'und dann musst Du die netzwerkspezifischen Optionen bei Deinen
Aufrufen natürlich auch noch benutzen' gang

Hallo Wolfgang,

Warum setzt Dein Code der in das CSV-File hinein schreiben will
nicht einfach eine leere Datei gleichen Namens nur mit einem ".lock"
als Surfix dahinter (Bsp: YXName.csv.lock ) und löscht dann das
Lock-File, wenn die Schreibaktion beendet ist ?

Gibt es das Lock-File, kann nur von anderen Threads oder Forks die
CSV-Datei nur gelesen werden.

Gruß Achim

Nein, nein nein.
Ich schreibe händisch die 'sets' in das csv-file und mein Programm soll
das dann auslesen. Deswegen habe ist das csv geöffnet und will dann
beobachten, was daraus gemacht wird.

Das ist aber kein 'shared read', wonach Du im OP gefragt hast; denn
mindestens einer der beteiligten Prozesse /liest/ nicht, sondern
/schreibt/. Was Du suchst, ist so was wie 'Optimistic Concurrency' o.
ä., bei dem mehrere Benutzer gleichzeitig schreibend()! und lesend
zugreifen können. Aber das erfordert Locking- und Messasging-funktionen,
die ein einfaches Betriebssystem nicht zur Verfügung stellen kann.

Hmm, in MS-Excel gibt's ja z.B. extra dafür die Funktion
"Arbeitsmappen freigeben", damit diese von mehreren Benutzern zur
selben Zeit bearbeitet werden kann.

Wenn man sowas in LibO einbauen könnte, wäre sein Problem vielleicht
lösbar ...

Ist es doch auch so schon. Der OP muss nur eine netzwerkfähige
Datenbank-Engine seiner Wahl installieren und in LO einbinden.

Wolfgang

ja, das war ungenau von mir SHARED_READ will nur das Programm, LO hat es halt geöffnet und blockiert damit alles. Ich hatte halt gehofft es gibt eine Möglichkeit zu lesen - jenseits kompletten Verwaltung, wer was wann wie... macht. Meine Änderungen sind dafür zu wenige und es ist auch nie gedacht, dass zugleich mehrere das csv bearbeiten und andere es lesen...
Vielleicht könnte man die Windows-Lesefunktion 'zwingen' das File zu lesen - obwohl LO es blockiert hat?
Gooly