Android: Как определить каталог в папке ресурсов? - PullRequest
4 голосов
/ 08 июня 2011

Я получаю такие файлы

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

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

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

Ответы [ 6 ]

5 голосов
/ 20 сентября 2011

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

...

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

}
1 голос
/ 02 марта 2015

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

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

0 голосов
/ 18 апреля 2018

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

    AssetManager manager = activity.getAssets();
    try{
        String[] files = manager.list(path);
        if (files.length > 0){
            //directory
        }
        else{
            //file
        }
    }
    catch (Exception e){
        //not exists.
    }
0 голосов
/ 19 октября 2017

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

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 ()); , если вы хотите проверить папку корневых ресурсов. Но имейте в виду, что папка корневых ресурсов содержит также другие каталоги / файлы (например, webkit, изображения и т. Д.)

0 голосов
/ 08 июня 2011

Вы можете начать с Android-файла

0 голосов
/ 08 июня 2011

Вы можете проверить, представляет ли файл каталог, используя http://developer.android.com/reference/java/io/File.html#isDirectory(). Это то, что вы имеете в виду?

...