# Schreibschutz entfernen und OutputStream öffnen



## m@nu (23. Jun 2005)

hallo!

und wiedermal hab ich ein kleines problem.
ich nutze folgenden code um einen _OutputStream_ auf eine datei zu öffnen.
ist die datei schreibgeschützt, entferne ich diesen per _getRuntime().exec_ (jop, ich weis... nicht mehr OS unabhängig  )


```
public OutputStream getTransferTarget(final FileDescriptor fileDescriptor) throws PluginSyncException {
        /* Vorbereiten: */
        String localFile = PluginHelper.fileDescriptorToAbsolutePath(fileDescriptor, path);
        OutputStream stream = null;
        File file = new File(localFile);
        
        try {
	        /* Datei prüfen: */
	        if(!file.exists()) {
                // Falls nötig, leere Datei erstellen:
	            file.createNewFile();
	            
	        } else {
	            // Schreibschutz entfernen (falls nötig):
	            if(!file.canWrite()) {
	                Runtime.getRuntime().exec("cmd /c attrib -R \"" + localFile + "\"");
		        }
	        }
	        
	        /* Stream holen: */
	        stream = new FileOutputStream(localFile);
        
        } catch (IOException e) {
            throw new PluginSyncException(PluginSyncException.msgERROROPENOUTPUTSTREAM,
                    fileDescriptor);
        }
        
        /* Rückgabe: */
        return stream;
    }
```

nun scheint java aber noch nicht ganz zu raffen, dass der schreibschutz entfernt wurde... ich erhalte eine _IOException_.
ziehe ich den explorer zu rate, sehe ich, dass der schreibschutz entfernt wurde.
ich denke per _sleep_ könnte man da was machen, finde ich aber eine unschöne lösung.

kennt jemand das problem oder hat anregungen zu einer lösung?
viele dank & grüsse aus der schweiz
m@nu


----------



## Jockel (23. Jun 2005)

Keine Ahnung, aber könnte es sein, dass die Attribute nur beim Öffnen der Datei ausgelesen werden und ein schließen und erneutes Öffnen abhilfe schafft?


----------



## Gast (23. Jun 2005)

Man muss auch dann gucken, wann die JVM den Befehl wirklich ausführt. Für dies hier weiß ich nicht, aber eine Datei löschen wird ja z.B. erst beim Beenden der JVM, nach ende des Java-Programms ausgeführt.
(Hier natürlich nicht, man braucht ja die Daten)


----------



## m@nu (24. Jun 2005)

@Jockel: hab versucht eine neue _File_-instanz nach dem ausführen des befehls zu erstellen... hat keine änderung gebracht.

@Gast: die JVM führt den befehl aus...
wenn ich z.b. im debugger einen breakpoint auf ne zeile nach dem runtime-aufruf setze, und im explorer die datei prüfe, ist das readonly-flag weg...


----------



## Bleiglanz (24. Jun 2005)

versuch mal lieber

```
Process p = Runtime.getRuntime().exec("cmd /c attrib -R \"" + localFile + "\""); 
if(0==p.exitValue())...
//oder p.waitFor();
```

ist möglicherweise in klitzekleines timing problem, weil bei dir SOFORT die Datei zum schreiben geöffnet werden soll


----------



## m@nu (24. Jun 2005)

hey cool! super, es funktioniert 
wie oben geschrieben, ich dachte mir schon dass es da probs mit dem timing gibt... aber diese lösung is schöner als per wait einfach mal ein paar sekunden blaue zu warten

*grml* hät' mir eigentlich nur die api vom Runtime/Process angucken müssen 

danke schön!


----------



## MarcusFrankfurt (22. Jan 2006)

Hi ...

gibt es denn wirklich keine Methode in Java, die den Schreibschutz wieder aufhebt? Muss ich wirklich auf das jeweilige Zielsystem zurückgreifen????

Marcus


----------

