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.

2
demandé sur Benjamin 2011-06-08 11:53:33

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?

-1
répondu Asahi 2011-06-08 07:59:27

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());
    }

}
3
répondu DannyA 2011-09-20 13:58:13

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()

1
répondu Vladyslav Savchenko 2015-03-02 13:43:59

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.)

0
répondu Cosmin 2017-10-19 10:35:45

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.
    }
0
répondu dexiang 2018-04-18 05:16:07

vous pouvez commencer à partir de Fichier Android

-1
répondu Muhammad Zeeshan 2011-06-08 07:59:54