Lese / Schreibkonflikte?

Maik20

Erfahrenes Mitglied
Ich habe mal ein paar Frage zum Lese / Schreibzugriff auf Dateien.

Kann ich auf eine Datei lesend zugreifen in die ein anderes Programm gerade etwas schreibt? Ich nehme an ja.

Kann eine Datei gleichzeitig von zwei Dateien beschrieben werden? Vermutlich nicht. Nur wie kann ich prüfen ob ein anderes Programm gerade in meine Datei schreibt bzw. ob diese für mich zur Verfügung steht?

Besten Dank

Maik
 
Zum zweiten
Nur wie kann ich prüfen ob ein anderes Programm gerade in meine Datei schreibt bzw. ob diese für mich zur Verfügung steht?

Wenn du probierst eine Datei zu öffnen mittels FileOutputStream und in diese danach was schreibst (c.write("Hallo")), und diese Datei wird gerade auch von einem anderen Program verwendet, bekommst du eine Exception(SecurityException).

Gruß
Harry
 
Soviel ich weiß, liegt das dann am Betriebssystem, da dieses die Dateien verwaltet. Wenn jemand etwas in die Datei liest, is sie meines wissens gesperrt, d.h. es kann niemand die Datei lesen oder schreiben.

2 Programme können sicher zur selben Zeit von der Datei lesen.

Und wenn einer liest, kann man bestimmt auch nicht in die Datei schreiben.

Und zu deiner Frage zwecks Abprüfung, müsste dass so wie vorher beschrieben gehen, in dem du den FileInput(bzw. Output)Stream in einem try-catch Block öffnest, und da siehst du dan ob er einen Fehler wirft oder nicht!

Hoffe jetzt habe ich deine Frage in deinem interesse beantworten können!

Gruß,
Harry
 
Also folgendes funktionirt NICHT:

Code:
 String dateiName = "c:/import/test.zip";
try{							FileOutputStream schreibeStrom = new FileOutputStream(dateiName);
System.out.println("In die Datei wird nicht geschrieben");
}catch(IOException e){							System.out.println("Datei wird geschrieben");
}

Wenn ich parallel mit einem anderen Java Programm in die Datei schreibe:

Code:
public static void main (String[] args) throws IOException{
    String text = "1";
    String dateiName = "c:/import/test.zip";
    FileOutputStream schreibeStrom = 
                     new FileOutputStream(dateiName);
    boolean a = true;
    while (a){
    	for (int i=0; i < text.length(); i++){
    	      schreibeStrom.write((byte)text.charAt(i));
    	}
    }
    schreibeStrom.close();
    System.out.println("Datei ist geschrieben!");
  }

Ich erhalte immer "In die Datei wird nicht geschrieben" obwohl mein Schreibprogramm läuft!

Auf das Schreibprogramm selbst habe ich leider keinen Zugriff, so das dich die Datei umbenennen könnte etc.
 
Dass er immer "In die Datei wird nicht geschrieben" ausgibt wird daran liegen, dass er zwar den Stream öffnen kann. aber du nicht wirrklich was hineinschreibst, da sollte dann der Fehler auftauchen!


Und wieso lässt du nicht einfach zweimal dieses Program laufen:
Code:
public static void main (String[] args) throws IOException{
    String text = "1";
    String dateiName = "c:/import/test.zip";
    FileOutputStream schreibeStrom = 
                     new FileOutputStream(dateiName);
    boolean a = true;
    while (a){
    	for (int i=0; i < text.length(); i++){
    	      schreibeStrom.write((byte)text.charAt(i));
    	}
    }
    schreibeStrom.close();
    System.out.println("Datei ist geschrieben!");
  }

Startest zu erst eines.. danach ein zweites, wo du eben dass schreibeStrom.write((byte)text.charAt(i)); in einen try catch Block machst!
 
Könnte es vielleicht einfach nur daran liegen, dass du "System.out.println("In die Datei wird nicht geschrieben");" im try und "System.out.println("Datei wird geschrieben");" im catch() stehen hast?
Catch wird erst nach dem auftreten eines Ausnahme ausgeführt, deshalb wird auch immer nur im Ausnahmenfall "Datei wird geschrieben" in der Konsole stehen. Ich denke dass es am Programm liegt, ob das Funktioniert. Immerhin schreibt eine durchschnittliche HDD mit 100 MByte/sec., da dauert das meiste schreiben so kurz dass du es nichtmal mitbekommen würdest. Da hängt es dann eher davon ab, ob das Programm für die Datei vom OS ein Freigabehandle erstellen lässt. Immerhin befinden sich die Daten ja vor dem Schreibevorgang im RAM, wenn nicht gerade kopiert wird. Daher ist es egal, wenn du nach dem öffnen eine Datei löschen würdest, wenn eben kein Handle existiert.
 
Danke für die Tips.

der Catchblock war falsch abgeschrieben ist bei mir korrekt. Das Problem liegt daran das der Fehler wirklich erst auftritt wenn ich schreiben würde.

Das will ich aber gar nicht, da es sich um jeden X-beliebigen Dateitypen handeln kann und ich die Datei nicht "verhunzen" möchte.

Ich bin aber selbst auf eine Lösung gekommen.

Für alle die es interessiert:

Ich merke mir die Größe der Datei in einem Hashtable und warte z.B. 10 Sekunden. Danach prüfe ich die Größe nochmal. Hat sich diese nicht geändert ist die Datei wohl vollständig.

Ist nicht schön und hat auch den ein oder anderen Pferdefuß aber ich kann damit leben.

Danke
 
hallo nochmal,

mir wäre gerade noch etwas eingefallen!
Du könntest den FileOutputStream ja öffenen, und nicht schreiben sondern die methode getFD() aufrufen in einem try catch block! bzw. muss nich mal try-catch sein, den diese liefert die volgende werte:
err
A handle to the standard error stream.
in
A handle to the standard input stream.
out
A handle to the standard output stream.

Habe das leider wieder nicht ausprobiert, aber vl. t es ja!

mfg,
harry
 

Neue Beiträge

Zurück