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 :

Ecrire dans un fichier txt sur carte SD


Sujet :

Android

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Ecrire dans un fichier txt sur carte SD
    Bonjour

    je débute actuellement dans le développement d’applications Android. J’ai besoin pour un projet d’écrire des octets dans un fichier. J’ai donc cherché à écrire un programme qui pour le moment écrit un petit texte dans un fichier situé sur la carte SD.

    Mais mon problème est que quand je lance mon programme sur mon Nexus 4, j'obtiens :
    java.io.IEOxception : open failed ENOENT No such file or directory
    Mon code est le suivant :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    public class MainActivity extends Activity {
     
      private String FILENAME = "sortie.txt";
      private String textToWrite = "Test il y a quelque chose dans le fichier";
      private File mFile = null;
      FileOutputStream output;
     
     
      @Override
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     
        // Creation d'un fichier sur la carte SD
        mFile = new File(Environment.getExternalStorageDirectory().getPath() + "/Android/data/ " + getPackageName() + "/files/" + FILENAME);
        Toast.makeText(this, "Creation ok. Chemin :\n"+ Environment.getExternalStorageDirectory().getPath(), Toast.LENGTH_LONG).show();
     
            try {
     
              // Si le fichier est lisible et qu'on peut écrire dedans
              if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
                  && !Environment.MEDIA_MOUNTED_READ_ONLY.equals(Environment.getExternalStorageState())) {
                // On crée un nouveau fichier. Si le fichier existe déjà, il ne sera pas créé
                mFile.createNewFile();
                output = new FileOutputStream(mFile);
                output.write(textToWrite.getBytes());
                if(output != null)
                  output.close();
              }
            } catch (FileNotFoundException e) {
              Toast.makeText(this, "Fichier non trouvé\n"+e.toString(), Toast.LENGTH_LONG).show();
              e.printStackTrace();
     
            } catch (IOException e) {
            	Toast.makeText(this, "Erreur\n"+e.toString(), Toast.LENGTH_LONG).show();
            	e.printStackTrace();
            }
      }
    }
    Sinon, je ne suis pas Root sur le téléphonne, je ne pense pas que cela soit important mais je le précise quand même.

    Si quelqu'un peut me dire pourquoi cela ne fonctionne pas.
    Merci d'avance

  2. #2
    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
    If you're using API Level 8 or greater, use getExternalCacheDir() to open a File that represents the external storage directory where you should save cache files. If the user uninstalls your application, these files will be automatically deleted. However, during the life of your application, you should manage these cache files and remove those that aren't needed in order to preserve file space.
    API Level 8 = Android 2.2 ... Ce qui est un grand minimum aujourd'hui (surtout sur Nexus 4 )
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Merci pour cette réponse, mais je ne sais pas comment utiliser cette méthode getExternalCacheDir().
    Car si j'essaye en laissant Environment.getExternalCacheDir().getPath(), j'ai une erreur et si je remplace Environment par Context, j'ai aussi une erreur.

  4. #4
    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
    Pourtant:
    c'est bien dans le context ! et on est dans un contexte puisqu'on fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Toast.makeText(this, "Erreur\n"+e.toString(), Toast.LENGTH_LONG).show();
    Bon sinon, j'ai un peu plus regardé le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mFile = new File(Environment.getExternalStorageDirectory().getPath() + "/Android/data/ " + getPackageName() + "/files/" + FILENAME);
        Toast.makeText(this, "Creation ok. Chemin :\n"+ Environment.getExternalStorageDirectory().getPath(), Toast.LENGTH_LONG).show();
    Tout cela me semble bizarre bizarre... reprenons ensemble...
    D'abord en rendant plus "lisible" la première grosse concaténation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    File rootCacheDir = new File(Environment.getExternalStorageDirectory(),"Android/data");
    File appCacheDir = new File(rootCacheDir,getPackageName());
    File filesDir = new File(appCacheDir,"files");
    File mFile = new File(filesDir,FILENAME);
    ou alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    File appCacheDir = getExternalCacheDir(); // <= revient à taper dans /Android/data/{packagename}
    File filesDir = new File(appCacheDir,"files");
    File mFile = new File(filesDir,FILENAME);
    Si appCacheDir existe de manière quasi-sûre, rien ne dit que filesDir lui existe !
    Donc la première chose à faire est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (!filesDir.mkdirs() && !filesDir.isDirectory())
       throw new IOException("Couldn't create file directory: "+filesDir);
    // voilà... ici on est sur que filesDir existe, et qu'on peut créer un fichier dedans.
    Ensuite je vois dans le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                mFile.createNewFile();
                output = new FileOutputStream(mFile);
    Encore une fois, il semble que certains auteurs de tutoriaux n'aient pas compris le but de "createNewFile()"... Le but de la fonction est de pouvoir agir de manière "atomique" sur le file-system... genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (f.createNewFile()) { 
        // ici c'est moi qui ai créé le fichier, et *que* moi, personne d'autre
    }
    sinon, FileOutputStream de toute manière va créer le fichier qu'il existe... ou non ! Donc le createNewFile() est inutile (d'ailleurs un appel à createNewFile() sans en tester la valeur de retour est complètement inutile).

    Pour terminer:
    A remplacer par un log correct sous Android:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Log.e("MonActivité","Failed to create file !",e);
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Merci beucoup nicroman, pour m'avoir bien détaillé la réponse.
    J'ai modifié mon code suite à vos conseils et maintenant je vois que mon fichier sortie.txt est bien créé grâce au "file explorer" d'Eclipse.

    Mais par contre comment puis-je ouvrir ce fichier pour vérifier qu'il contient bien le texte que j'ai voulu écrire dedans ?

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Finalement j'ai fait un adb pull et tout fonctionne bien.

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

Discussions similaires

  1. Ecrire dans un fichier txt sur carte SD
    Par balsoni dans le forum Android
    Réponses: 3
    Dernier message: 07/04/2013, 19h50
  2. Ecrire dans un fichier txt en 4gl
    Par patriceguic dans le forum Informix
    Réponses: 2
    Dernier message: 07/05/2007, 20h44
  3. Ecrire dans un fichier .txt
    Par chabRRR dans le forum Langage
    Réponses: 3
    Dernier message: 13/03/2007, 19h30
  4. Ecrire dans un fichier .txt
    Par yinyann86 dans le forum Pascal
    Réponses: 17
    Dernier message: 24/11/2006, 13h36
  5. Ecrire dans un fichier txt sans en effacer le contenu
    Par cari dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 14/12/2005, 18h11

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