Neue Datei erzeugen wenn nicht vorhanden

H

Hydrogeddon

Neues Mitglied
0
Guten Tag^^

Ich bin gerade dabei, eine App und Funktionen von C# in Java zu realisieren, stecke allerdings gerade an einer Funtion fest mit der ich Daten in einer Datei aktualisieren kann und bräuchte in einem Punkt dabei hilfe. Java ist für mich nämlich noch fast komplettes Neuland.

Die Funktion soll einen Gruppennamen, eine Mitgliedsliste und einen FileNamen erhalten um dann eine Gruppe aus der Datei herauszufiltern und ihre Mitglieder zu aktualisieren. Aber die Datei wird von vornherein schon gar nicht automatisch erzeugt und habe schon diverse Sachen ohne Erfolg ausprobiert.

Der bisherige Stand der Funktion:
Code:
final static void WriteListFixedPath(String GroupName, ArrayList<String> MemList, String FileName){
            File Directory, Root, SaveFile;
            ArrayList<String> content= new ArrayList<String>();

            Root= Environment.getExternalStorageDirectory();
            Directory=new File(Root.getAbsolutePath()+"/RanGen/"+FileName);
            int i;
            String GRow, temp;

            if(!Directory.exists()){
                Directory.mkdir();
            }
            
           //Alter Inhalt soll geladen werden falls vorhanden, um auch größere Änderungen in Datei zu sichern
            try{
                FileReader read = new FileReader(Directory.getAbsolutePath()+"/"+FileName);
                BufferedReader bufin = new BufferedReader(read);
                for(GRow=null; (GRow=bufin.readLine())!=null; content.add(GRow));
                read.close();
            }
            catch(IOException e){
                SaveFile=new File(Directory, FileName);
                try {
                    SaveFile.createNewFile();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
          
            //Testweise hinzufügen des Gruppennamen
            try {
                FileWriter write = new FileWriter(Directory.getAbsolutePath()+"/" + FileName);
                GRow=GroupName+":";
                for(i=0; i<MemList.size(); ++i) {
                   GRow+=MemList.get(i)+";";
                }
                content.add(GRow);
                write.flush();
                write.write(content.get(0));
                for(i=1; i<content.size(); write.append(content.get(i++)));
                write.close();
            }
            catch(IOException e){}
        }
 
Hallo @Hydrogeddon,

da läuft etwas mit den Namen der Pfade durcheinander. Deine Variable directory ist ein Pfad von einer Datei und nicht von einem Ordner.
Und sonst schicke einfach mal die Fehlermeldung, das macht es einfacher.

Log | Android Developers


PS: Bei Java fangen nach gängiger Konvention Methoden und Variablen immer mit ein Kleinbuchstaben an. Ich weiß, das es bei C# anders geregelt ist. Aber du solltest versuchen, dich daran zu halten.
 
Ah, ja du hast recht :) Die Pfade sind da völlig durcheinander geraten.^^' Ich habe die Fehler mit den Pfaden jetzt rausgenommen und die Hauptfunkion der Methode erstmal fertiggestellt. Auf meinem Rechner wird ein manuell angegebener Pfad mit Datei erstellt, aber bei dem Versuch das in Android einzubinden findet er die Datei/Pfad nicht.

Hier ist das Logcat mit den Pfaden an forderster Stelle.
02-16 11:11:45.341 2693-2693/com.example.chese96.rangen W/EGL_genymotion: eglSurfaceAttrib not implemented
Code:
02-16 11:21:55.261 2693-2693/com.example.chese96.rangen D/Dir.mkdirs(): /storage/emulated/0/RanGen
02-16 11:21:55.261 2693-2693/com.example.chese96.rangen D/file.createNewFile(): /storage/emulated/0/RanGen/save.grp
02-16 11:21:55.265 2693-2693/com.example.chese96.rangen E/IOException: WriteListFixedPath:
        java.io.IOException: open failed: ENOENT (No such file or directory)
at java.io.File.createNewFile(File.java:946)
at com.example.chese96.rangen.JavaDroid$FileWorker.WriteListFixedPath(JavaDroid.java:60)
at com.example.chese96.rangen.Member$1.onClick(Member.java:50)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18422)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
   Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
at libcore.io.Posix.open(Native Method)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
at java.io.File.createNewFile(File.java:939)
at com.example.chese96.rangen.JavaDroid$FileWorker.WriteListFixedPath(JavaDroid.java:60)
at com.example.chese96.rangen.Member$1.onClick(Member.java:50)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18422)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)


Die Stelle mit der Exception:
if(!file.exists()){
Dir.mkdirs();
file.createNewFile(); => Zeile 60 (JavaDroid.java:60)
}

Die Pfade hole ich mir dafür folgenderweise:
File root = Environment.getExternalStorageDirectory();
Directory=root.getAbsolutePath()+"/RanGen";
File file = new File(Directory+"/"+FileName), Dir=new File(Directory);
 
Zuletzt bearbeitet:
Benötigt man nicht Berechtigungen?

Füge mal folgendes in die Manifest ein:
Code:
uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Und zum prüfen ob man schreiben darf:
Code:
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}
 
Ok danke,

eine Sache ist ein bischen merkwürdig für mich. Gebe ich die Berechtigungen über das Manifest erhalte ich die Meldung "Permission denied" obwohl sie ja eig. gesetzt sein müsste. Die obige Methode gibt hierbei "true" zurück. Ohne den Eintrag im Manifest aber kommt die Meldung "directory not found". Allerdings ist mir dann aufgefallen, dass ich eigentlich viel weniger für meinen Zweck benötige. Ich bin wohl am Ziel vorbeigeschossen bei dem Versuch, zu viel neues auf einmal zu lernen und hab die Bäume vor lauter Wald nicht mehr gesehen. xD

Ich nutze jetzt den Pfad "/data/data/<packageName>/<Datei>";" für meine Dateien anstatt über "Environment.getExternalStorageDirectory()" zu gehen. Und siehe da, alles funktioniert!
Danke für den Hinweis mit den Berechtigungen :)
Anders wäre ich womöglich nie auf die eigentlich ausreichende Alternative gekommen^^

gruß,
Hydrogeddon
 

Ähnliche Themen

D
Antworten
23
Aufrufe
2.537
Data2006
D
SaniMatthias
Antworten
19
Aufrufe
955
swa00
swa00
5
Antworten
0
Aufrufe
1.146
586920
5
Zurück
Oben Unten