Android: Как определить каталог в папке с ресурсами?

Я получаю файлы вроде этого

String[] files = assetFiles.list("EngagiaDroid"); 

Как узнать, является ли это файлом или является каталогом?

Я хочу перебрать каталоги в папке с ресурсами, а затем скопировать все его содержимое.

Ответ 2

Я думаю, что более общее решение (если у вас есть подпапки и т.д.) будет что-то вроде этого (на основе решения, с которым вы связались, я добавил его там тоже):

...

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

Я обнаружил этот вариант:

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
}

Это быстрее, чем .list()

Ответ 4

Другой способ полагаться на исключения:

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

а затем просто вызовите checkAssets ( "someFolder", getAssets()); или checkAssets ("", getAssets());, если вы хотите проверить root папке с ресурсами. Но имейте в виду, что папка с корневыми ресурсами содержит также другие каталоги/файлы (например, webkit, изображения и т.д.).

Ответ 5

Вы можете использовать метод списка AssetManager. Любая директория в активе должна иметь хотя бы один файл, пустая директория будет игнорироваться при создании приложения. Таким образом, чтобы определить, является ли какой-то путь каталогом, используйте вот так:

    AssetManager manager = activity.getAssets();
    try{
        String[] files = manager.list(path);
        if (files.length > 0){
            //directory
        }
        else{
            //file
        }
    }
    catch (Exception e){
        //not exists.
    }