Android: Comment détecter un répertoire dans le dossier assets?
je récupère des fichiers comme celui-ci
String[] files = assetFiles.list("EngagiaDroid");
Comment savoir s'il s'agit d'un fichier ou d'un répertoire?
je veux faire une boucle dans les répertoires du dossier assets puis copier tout son contenu.
6 réponses
vous pouvez vérifier si un fichier représente un répertoire en utilisant http://developer.android.com/reference/java/io/File.html#isDirectory (). C'est ce que tu veux dire?
je pense qu'une solution plus générale (dans le cas où vous avez des sous-dossiers, etc.) serait quelque chose comme ceci (basé sur la solution à laquelle vous vous êtes lié, Je l'ai ajouté là aussi):
...
copyFileOrDir("myrootdir");
...
private void copyFileOrDir(String path) {
AssetManager assetManager = this.getAssets();
String assets[] = null;
try {
assets = assetManager.list(path);
if (assets.length == 0) {
copyFile(path);
} else {
String fullPath = "/data/data/" + this.getPackageName() + "/" + path;
File dir = new File(fullPath);
if (!dir.exists())
dir.mkdir();
for (int i = 0; i < assets.length; ++i) {
copyFileOrDir(path + "/" + assets[i]);
}
}
} catch (IOException ex) {
Log.e("tag", "I/O Exception", ex);
}
}
private void copyFile(String filename) {
AssetManager assetManager = this.getAssets();
InputStream in = null;
OutputStream out = null;
try {
in = assetManager.open(filename);
String newFileName = "/data/data/" + this.getPackageName() + "/" + filename;
out = new FileOutputStream(newFileName);
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
in.close();
in = null;
out.flush();
out.close();
out = null;
} catch (Exception e) {
Log.e("tag", e.getMessage());
}
}
j'ai découvert cette variante:
try {
AssetFileDescriptor desc = getAssets().openFd(path); // Always throws exception: for directories and for files
desc.close(); // Never executes
} catch (Exception e) {
exception_message = e.toString();
}
if (exception_message.endsWith(path)) { // Exception for directory and for file has different message
// Directory
} else {
// File
}
c'est un as plus rapide .liste()
Another way using on exceptions:
private void checkAssets(String path, AssetManager assetManager) {
String TAG = "CheckAssets";
String[] fileList;
String text = "";
if (assetManager != null) {
try {
fileList = assetManager.list(path);
} catch (IOException e) {
Log.e(TAG, "Invalid directory path " + path);
return;
}
} else {
fileList = new File(path).list();
}
if (fileList != null && fileList.length > 0) {
for (String pathInFolder : fileList) {
File absolutePath = new File(path, pathInFolder);
boolean isDirectory = true;
try {
if (assetManager.open(absolutePath.getPath()) != null) {
isDirectory = false;
}
} catch (IOException ioe) {
isDirectory = true;
}
text = absolutePath.getAbsolutePath() + (isDirectory ? " is Dir" : " is File");
Log.d(TAG, text);
if (isDirectory) {
checkAssets(absolutePath.getPath(), assetManager);
}
}
} else {
Log.e(TAG, "Invalid directory path " + path);
}
}
et puis il suffit d'appeler checkAssets("mondossier", getAssets()); ou checkAssets("", getAssets()); si vous voulez vérifier la racine du dossier des actifs. Mais sachez que le dossier root assets contient aussi d'autres répertoires/fichiers (par ex. webkit, images, etc.)
vous pouvez utiliser la méthode de liste D'AssetManager. N'importe quel répertoire dans asset devrait avoir un fichier au moins, répertoire vide sera ignoré lors de la construction de votre application. Ainsi, pour déterminer si un chemin est un répertoire, utilisez comme ceci:
AssetManager manager = activity.getAssets();
try{
String[] files = manager.list(path);
if (files.length > 0){
//directory
}
else{
//file
}
}
catch (Exception e){
//not exists.
}