fichier.il existe() pour retourner false si le fichier n'existe pas
Dans une application Android, je suis en train de travailler sur, l'utilisateur doit être en mesure de créer un nouveau fichier CSV sur la carte SD, nommés à l'aide de texte d'entrée dans un EditText.
Le problème est que, après l'instanciation du Fichier à l'aide du répertoire et nom de fichier, fichier.exists() retourne faux, même lorsque le fichier existe bel et bien à cet endroit. J'ai parcouru la carte SD à l'aide d'un fichier Android navigateur et via l'Explorateur Windows et le fichier n'existe pas.
Est-ce la bonne façon de vérifier si le fichier existe déjà, et si oui, que suis-je en manquant de sorte qu'elle retourne vrai quand il existe?
String csvname = edittext.getText().toString() + ".csv";
File sdCard = Environment.getExternalStorageDirectory(); //path returns "/mnt/sdcard"
File dir = new File (sdCard.getAbsolutePath() + "/Android/data/" + getPackageName() + "/files/"); //path returns "/mnt/sdcard/Android/data/com.phx.license/files"
dir.mkdirs();
File file = new File(dir, csvname); //path returns "/mnt/sdcard/Android/data/com.phx.license/files/Test.csv"
if(!file.exists()) //WHY DOES IT SAY IT DOESN'T EXIST WHEN IT DOES?
{
...
}
- Le répertoire existe pas?
- getPackageName() renvoie la même chose à chaque fois?
- Oui, le répertoire existe
- Tahir Akhtar - getPackageName() renvoie la même chose à chaque fois, car il est toujours appelé à partir de la même package
- Ma suggestion est de l'exécuter dans le débogueur (ou de sortie de la console) et de voir exactement ce que chacune de ces méthodes renvoie.
- J'utilise Eclipse et ont débogué le diable hors de cette chose. En regardant le fichier.exists(), elle renvoie toujours faux, comme le fait fichier.getAbsoluteFile().exists().
- peut-être que vous n'avez pas les autorisations de lecture sur le fichier? Java est SecurityManager est impliqué lorsque vous appelez .exists() et il vérifie les autorisations de lecture. Normalement si le SecurityManager est activé, alors dans ce cas il y aura une exception, pas une rémunération normale, mais je ne sais pas comment cela fonctionne sur Android
- Vous devriez vraiment utiliser
File.separatorChar
au lieu de coder en dur avec une barre oblique. - J'ai ajouté <uses-permission android:name="android.la permission.WRITE_EXTERNAL_STORAGE" /> le fichier de manifeste. Pour autant que je sais, c'est tout ce qui est requis pour l'application à accéder au système de fichiers.
- merci pour la suggestion, je vais donner un coup de feu
- ce n'est probablement pas le problème, mais c'est une bonne pratique.
- Étant que les données externes répertoire, sachez que chaque fois que vous re-installer l'apk avec apt/Eclipse, il sera effacé si en cours d'exécution sur l'API >= 8. En fait si, j'ai une 2.2 appareil (LG Optimus one) et il ne se passe pas là, mais il n'sur l'émulateur.
- Vous avez raison, je devrais écrire le fichier à un non-spécifique à l'application de l'emplacement.
- pourquoi ne pas vous essayez d'imprimer le chemin d'accès au fichier par l'aide de la Chaîne.valueOf(fichier) et de voir si le chemin d'accès du fichier est correct. Il se pourrait que le chemin d'accès au fichier c'est être faite par la concaténation de tous les chemins qui peut être erroné. fichier.exists() ne devrait pas être de retour un mauvais résultat si quelque chose doit être mal.
- Dans la bad, la question
cd /sdcard; touch testfile
puis remplacerFile dir = new File (sdCard.getAbsolutePath());
etString csvname = "testfile";
. Recompiler et de l'exécuter.file.exists()
doit retourner vrai maintenant. Post debug résultats. - Sur le Samsung galaxy S, j'ai travaillé,
Environment.getExternalStorageDirectory();
retourne le chemin d'accès à la mémoire flash interne/mnt/sdcard
. La vraie carte sd externe a été monté surmnt/sdcard/sd
. Peut-être cela le problème?
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez createNewFile il ne fera que créer un fichier si il n'existe pas déjà.
Fichiers Java Documentation
public boolean createNewFile()
throws IOException
Atomiquement crée un nouveau fichier vide nommé par le présent résumé chemin si et seulement si un fichier portant ce nom n'existe pas encore. La vérification de l'existence du fichier et de la création du fichier si il n'existe pas une seule opération atomique à l'égard de tous les autres systèmes de fichiers les activités qui pourraient affecter le fichier.
Remarque: cette méthode ne doit pas être utilisé pour le verrouillage de fichier, que le protocole ne peut pas être fait pour fonctionner de manière fiable. Le FileLock installation devrait être utilisé à la place.
Retourne:
vrai si le fichier n'existe pas et a été créé avec succès, false si le nom de fichier existe déjà
Jette:
IOException - Si une erreur d'e/S s'est produite
SecurityException - Si un responsable de la sécurité existe et son SecurityManager.checkWrite(java.lang.String) méthode refuse l'accès en écriture au fichier
Depuis:
1.2
La création d'un nouveau fichier d'objet comme
new File(dir, csvname);
ne pas créer un nouveau fichier dans le système de fichiers.Vous avez besoin d'écrire des données de première.
exists()
retournera true.FileOutputStream f = new FileOutputStream(file);
pour créer le fichier, s'il existe, donc, je ne veux pas créer le fichier si il n'existe pas encore.new File(..)
) ne crée pas le fichier lui-même. SiFile.exists()
retourne false, alors le fichier n'existe pas encore. Vous pouvez le créer en appelantfile.createNewFile()
.file.createNewFile()
crée le fichier s'il n'existe pas, et renvoie false si elle ne. Puis l'appel defile.exists()
après renvoie la valeur true. Je crois que c'est ce que jzd essayais de dire aussi.J'ai eu exactement le même problème mais avec le fil sur hadoop où une étincelle de travail a été d'essayer d'exécuter une commande.
C'était un problème de permissions de fichier. Je troubleshooted par le code comme ci-dessous qui est en scala. existe et notExists les deux renvoie la valeur false, ce qui signifie que la jvm n'est pas en mesure de dire si le fichier existe ou pas.