7 votes

Android - erreur d'ouverture d'un fichier qui vient d'être créé

Je suis nouveau dans le développement d'Android et j'essaie de faire quelques entrées/sorties de fichiers. Chaque fois que j'exécute ce bloc de code :

File meta = new File(context.getAppContext().getFilesDir(),"meta");
meta.mkdirs();
File dir = new File(meta,"subdir");
File imageFile = new File(dir,"filename");
Log.d("test",imageFile.getAbsolutePath());
FileOutputStream outputStream = new FileOutputStream(imageFile);

Je reçois cette erreur :

    java.io.FileNotFoundException: /data/data/com.example.android.networkusage/files/meta/Greg and The Morning Buzz/artwork30.jpg: open failed: ENOENT (No such file or directory)
    at libcore.io.IoBridge.open(IoBridge.java:406)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
    at com.example.android.networkusage.Podcast.downloadArtworkFromUrl(Podcast.java:117)
    at com.example.android.networkusage.Podcast.<init>(Podcast.java:93)
    at com.example.android.networkusage.JSONParser.parse(JSONParser.java:113)
    at com.example.android.networkusage.NetworkActivity.loadXmlFromNetwork(NetworkActivity.java:240)
    at com.example.android.networkusage.NetworkActivity.access$100(NetworkActivity.java:65)
    at com.example.android.networkusage.NetworkActivity$DownloadXmlTask.doInBackground(NetworkActivity.java:203)
    at com.example.android.networkusage.NetworkActivity$DownloadXmlTask.doInBackground(NetworkActivity.java:198)
    at android.os.AsyncTask$2.call(AsyncTask.java:264)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    at java.lang.Thread.run(Thread.java:856)
    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 libcore.io.IoBridge.open(IoBridge.java:390)
    ... 16 more

Le journal imprime même le chemin d'accès du fichier comme indiqué, donc le fichier doit exister ! Pourquoi cela se produit-il ?

De plus, mon application a des privilèges d'écriture internes et externes.

6voto

Kevin Bowersox Points 48223

L'un des sous-répertoires ( subdir ) et le fichier n'existe pas. Le code doit appeler createNewFile() pour créer réellement le fichier. De même, le subdir doit être fait en appelant mkdirs() .

File meta = new File(context.getAppContext().getFilesDir(),"meta")
meta.mkdirs();
File dir = new File(meta, "subdir");
dir.mkdirs(); //added
File imageFile = new File(dir, "filename.txt");
imageFile.createNewFile(); //added
FileOutputStream outputStream = new FileOutputStream(imageFile);

Je ne crois pas que le File Le constructeur crée réellement le fichier sur le système de fichiers. La documentation indique :

Les instances de cette classe peuvent ou non désigner un système de fichiers réel. tel qu'un fichier ou un répertoire. Si elle désigne un tel objet alors cet objet réside dans une partition. Une partition est une portion de d'exploitation d'un système de fichiers. Un dispositif de stockage unique (par exemple, un disque dur physique, une mémoire flash, un CD-ROM) peut contenir plusieurs partitions. plusieurs partitions. L'objet, le cas échéant, résidera sur la partition nommée par un ancêtre de la forme absolue de ce nom de chemin.

1voto

Voici un extrait de code d'un projet sur lequel je travaille en ce moment :

à partir de l'intérieur d'une activité/contexte :

File dir = getDir("Foler", 0);        // i think your problem is here
File file = new File(dir,"File.bin");

la création de répertoire dans Android est différente de celle de java sur un ordinateur normal, essayez de créer votre répertoire en utilisant getDir() au lieu de new File(...).mkdirs(), et assurez-vous que c'est à l'intérieur d'un contexte (après la création de l'activité).

Je ne pense pas être le mieux placé pour répondre à cette question puisque je suis également novice sur Android, mais peut-être que ceci peut vous aider.

Le code final pourrait donc être le suivant

File dir = getDir("subdir",0);
File imageFile = new File(dir, "filename.txt");
imageFile.createNewFile();
FileOutputStream outputStream = new FileOutputStream(imageFile);

Je ne sais pas comment créer des répertoires imbriqués, je n'ai pas essayé jusqu'à présent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X