Я получаю файлы вроде этого
String[] files = assetFiles.list("EngagiaDroid");
Как узнать, является ли это файлом или является каталогом?
Я хочу перебрать каталоги в папке с ресурсами, а затем скопировать все его содержимое.
Я получаю файлы вроде этого
String[] files = assetFiles.list("EngagiaDroid");
Как узнать, является ли это файлом или является каталогом?
Я хочу перебрать каталоги в папке с ресурсами, а затем скопировать все его содержимое.
Вы можете проверить, представляет ли файл каталог с помощью http://developer.android.com/reference/java/io/File.html#isDirectory(). Это то, что вы имеете в виду?
Я думаю, что более общее решение (если у вас есть подпапки и т.д.) будет что-то вроде этого (на основе решения, с которым вы связались, я добавил его там тоже):
...
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());
}
}
Я обнаружил этот вариант:
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()
Другой способ полагаться на исключения:
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, изображения и т.д.).
Вы можете использовать метод списка AssetManager. Любая директория в активе должна иметь хотя бы один файл, пустая директория будет игнорироваться при создании приложения. Таким образом, чтобы определить, является ли какой-то путь каталогом, используйте вот так:
AssetManager manager = activity.getAssets();
try{
String[] files = manager.list(path);
if (files.length > 0){
//directory
}
else{
//file
}
}
catch (Exception e){
//not exists.
}
Вы можете начать с файла Android