IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Problème lors de la création d'un fichier sur la mémoire externe


Sujet :

Android

  1. #1
    Membre actif Avatar de IsiTech
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Janvier 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Janvier 2012
    Messages : 105
    Points : 270
    Points
    270
    Par défaut Problème lors de la création d'un fichier sur la mémoire externe
    Bonsoir,

    Mon objectif est de créer un fichier .txt sur la mémoire externe et d'y écrire. Cependant après avoir passé une après midi à chercher pourquoi ça ne fonctionnait pas, je n'ai toujours pas la réponse. J'utilise ce code basique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() +
    				"/Android/data/" + package + "/files/" + "test.txt";
     
    		Log.d("State", Environment.getExternalStorageState());
    		Log.d("FilePath", filePath);
     
    		File mFile = new File(filePath);
     
    		FileOutputStream out;
    		try {
    			mFile.createNewFile();
    			out = new FileOutputStream(mFile);
     
    			Log.d("TryCatch", "J'ecris");
     
    			ObjectOutputStream oos = new ObjectOutputStream(out);
     
    			String test = "aaa";
     
    			oos.writeObject(test);
    			oos.close();
     
    			if (out != null) {
    				out.close();
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}

    qui lève une exception. Voici le logcat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    03-06 21:38:41.105: D/State(22448): mounted
    03-06 21:38:41.105: D/FilePath(22448): /mnt/sdcard/Android/data/package/files/test.txt
    03-06 21:38:41.105: W/System.err(22448): java.io.IOException: open failed: ENOENT (No such file or directory)
    03-06 21:38:41.110: W/System.err(22448): 	at java.io.File.createNewFile(File.java:940)
    03-06 21:38:41.110: W/System.err(22448): 	at fr.lri.insitue.probe.ui.MainActivity.onCreate(MainActivity.java:94)
    03-06 21:38:41.110: W/System.err(22448): 	at android.app.Activity.performCreate(Activity.java:4465)
    03-06 21:38:41.110: W/System.err(22448): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    03-06 21:38:41.110: W/System.err(22448): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
    03-06 21:38:41.110: W/System.err(22448): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
    03-06 21:38:41.110: W/System.err(22448): 	at android.app.ActivityThread.access$600(ActivityThread.java:123)
    03-06 21:38:41.110: W/System.err(22448): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
    03-06 21:38:41.110: W/System.err(22448): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    03-06 21:38:41.110: W/System.err(22448): 	at android.os.Looper.loop(Looper.java:137)
    03-06 21:38:41.110: W/System.err(22448): 	at android.app.ActivityThread.main(ActivityThread.java:4424)
    03-06 21:38:41.110: W/System.err(22448): 	at java.lang.reflect.Method.invokeNative(Native Method)
    03-06 21:38:41.110: W/System.err(22448): 	at java.lang.reflect.Method.invoke(Method.java:511)
    03-06 21:38:41.110: W/System.err(22448): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
    03-06 21:38:41.110: W/System.err(22448): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
    03-06 21:38:41.110: W/System.err(22448): 	at dalvik.system.NativeStart.main(Native Method)
    03-06 21:38:41.110: W/System.err(22448): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
    03-06 21:38:41.110: W/System.err(22448): 	at libcore.io.Posix.open(Native Method)
    03-06 21:38:41.110: W/System.err(22448): 	at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
    03-06 21:38:41.115: W/System.err(22448): 	at java.io.File.createNewFile(File.java:933)
    03-06 21:38:41.115: W/System.err(22448): 	... 15 more
    Je comprends bien que le fichier et le dossier n'existe pas, mais je pensais qu'Android les créerait lui même. Soit, je crée moi même sous Windows les dossiers et retente l'expérience. Cette fois ci pas d'exception, mais le fichier n'est pas crée alors que le Log situé dans le Try Catch apparaît.

    Concernant le manifest j'ai ces permissions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
    mais ça ne change rien.

    Après avoir essayé pas mal de chose je n'arrive pas à trouver ce qui cloche, sachant que je test l'application sur mon smartphone et que j'ai effectué les tests en ayant le smartphone branché et débranché. Je suis donc à la recherche de pistes pour corriger ce problème.

    Merci de votre aide.

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Java / C++
    Inscrit en
    Mars 2013
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java / C++

    Informations forums :
    Inscription : Mars 2013
    Messages : 128
    Points : 228
    Points
    228
    Par défaut
    Bonsoir IsiTech,

    D'après les logs, le fichier n'existe pas tout simplement.

    Tout d'abord, concernant la création du répertoire, je pense qu'il est plus judicieux de le faire via le code, et la classe File contient les méthodes nécessaire à la création d'un ou plusieurs répertoire(s).

    Concernant la création du fichier, File contient là aussi des méthodes permettant de vérifier si le fichier existe, et de le créer si besoin.

    Essayer c'est bien, lire la doc avant c'est mieux , je t'invite donc à faire un petit tour ici, j'espère que l'anglais ne te fais pas peur .

    En combinant les méthodes de File, tu devrais pouvoir t’affranchir des problèmes d’existences ou non du fichier et du répertoire.

  3. #3
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Juste une question....

    le résultat de createNewFile() n'est jamais testé... pourquoi ?
    Le but de la fonction "createNewFile()" est de s'assurer que le fichier n'existait pas avant (et de le créer si c'est bien le cas, en retournant vrai)
    Atomically creates a new, empty file named by this abstract pathname if and only if a file with this name does not yet exist.
    Sinon, il n'y a aucun interêt à l'appeler !

    Le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (out != null) {
    				out.close();
    			}
    devrait être indiqué comme inutile par eclipse... à cet endroit du code, out est forcément non null (puisque créé avec un new juste avant).
    De toute manière, le oos.close() devrait s'occuper de la fermeture du stream.

    D'ailleurs à ce sujet... les try/catch ne sont pas bons... (surtout le catch)...
    A réécrire en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try {
        Log.d("TryCatch", "J'ecris"); // le tag c'est vraiment "TryCatch" ?
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(mFile));
        try {
            String test = "aaa";
            oos.writeObject(test);
        } finally {
            oos.close();
        }
    } catch (IOException e) { 
        Log.e("TryCatch","Erreur I/O",e);
    }
    Au début du code:
    Environment.getExternalStorageDirectory().getAbsolutePath() +
    "/Android/data/" + package + "/files/" + "test.txt";

    Est comment dire... bizarre
    getExternalStorageDirectory() va offrir un répertoire accessible en USB (pas toujours accessible d'ailleurs, si le téléphone est branché en USB-drive)
    Dans ce cas pourquoi accéder à "/Android/data" (sensé avoir des données privées à l'application) ? Pourquoi ne pas utiliser getExternalFilesDir(null) du context ?

    La construction part du principe que "/" est utilisé... perso... j'ai toujours un doute
    L'utilisation de 'package' fonctionne ? parceque c'est un mot clef reservé en Java il me semble non ?

    Utiliser un File pour créer les répertoires... un truc genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    File dir = new File(context.getExternalFilesDir(null),"files");
    dir.mkdirs();
    File dest = new File(dir,"test.txt");

  4. #4
    Membre actif Avatar de IsiTech
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Janvier 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Janvier 2012
    Messages : 105
    Points : 270
    Points
    270
    Par défaut
    Merci pour vos réponses.

    Ce que je souhaite est enregistrer des fichiers sur la mémoire externe pour l'espace disponible, qu'ils soient accessibles depuis un ordinateur, et qu'ils soient supprimés lors de la désinstallation de l'application.

    Dans le désordre, en effet les dossiers ne sont pas crées automatiquement, il faut donc les créer soit même.

    Pour le test (out != null), j'ai suivi un tutoriel d'un autre site donc j'ai pas cherché plus loin, mais c'est vrai que ce n'est pas nécessaire.

    Merci pour la réécriture du trycatch, je comprends mieux.

    Concernant le getExternalStorageDirectory() d'Environment, en effet getExternalFilesDir(null) de Context revient au même vu que je souhaitais écrire dans Android/data/ afin que ces fichiers soient supprimés lors de la désinstallation, donc c'est changé.

    "package" c'est un String histoire de pas afficher le package que j'utilise, il ne pose pas de problème. Avec getExternalFilesDir(null) je ne l'utilise plus de toute façon. Dans le doute j'ai aussi utilisé File.separator pour remplacer les "/".

    J'ai eu l'idée d'utiliser un explorateur de fichier sur mon smartphone et en effet les dossiers et le fichier sont bien crées, mais ils ne sont pas visibles à partir d'un ordinateur, d'où ma confusion.

    Merci pour votre aide, je comprend mieux le fonctionnement du stockage externe maintenant. Résolu !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'épaisseur des borders lors de la création d'un fichier excel.
    Par jmclej dans le forum Développement Web avec .NET
    Réponses: 2
    Dernier message: 31/05/2013, 15h43
  2. Réponses: 3
    Dernier message: 12/03/2010, 13h14
  3. Problême d'accent lors de la création d'un fichier txt
    Par maxmarie dans le forum Windows Mobile
    Réponses: 15
    Dernier message: 24/08/2007, 21h59
  4. [VB6]Problème lors de la création d'un fichier texte
    Par Kronoob dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 06/06/2006, 20h27
  5. Réponses: 3
    Dernier message: 26/02/2006, 23h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo