Копирование каталогов, подкаталогов и файлов на sd-карту-android
Я использую следующий код для копирования определенного каталога и его содержимого на sd-карту. Каталог помещается в папку res/raw
.
Ниже приведен код, который я использую:
public class CopyActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
copyFilesToSdCard();
}
static String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
final static String TARGET_BASE_PATH = extStorageDirectory+"/Android/data/";
private void copyFilesToSdCard() {
copyFileOrDir("");
}
private void copyFileOrDir(String path) {
AssetManager assetManager = this.getAssets();
String assets[] = null;
try {
Log.i("tag", "copyFileOrDir() "+path);
assets = assetManager.list(path);
if (assets.length == 0) {
copyFile(path);
} else {
String fullPath = TARGET_BASE_PATH + path;
Log.i("tag", "path="+fullPath);
File dir = new File(fullPath);
if (!dir.exists())
if (!dir.mkdirs());
Log.i("tag", "could not create dir "+fullPath);
for (int i = 0; i < assets.length; ++i) {
String p;
if (path.equals(""))
p = "";
else
p = path + "/";
copyFileOrDir( p + 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;
String newFileName = null;
try {
Log.i("tag", "copyFile() "+filename);
in = assetManager.open(filename);
if (filename.endsWith(".jpg")) // extension was added to avoid compression on APK file
newFileName = TARGET_BASE_PATH + filename.substring(0, filename.length()-4);
else
newFileName = TARGET_BASE_PATH + 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", "Exception in copyFile() of "+newFileName);
Log.e("tag", "Exception in copyFile() "+e.toString());
}
}
}
Исключение:
Exception in copyFile() of /mnt/sdcard/Android/data/raw/edu/anees.txt
Exception in copyFile() java.io.FileNotFoundException:
/mnt/sdcard/Android/data/raw/edu/anees.txt: open failed: ENOENT (No such file or directory)
Может кто-нибудь, пожалуйста, дайте мне знать, что вызывает эту проблему и решение для того же.
Ref: Как скопировать файлы из папки "assets"на SD-карту?
EDIT
Я мог бы разрешить исключение с помощью одного из советы относительно разрешения, которое было опубликовано в качестве одного из ответов здесь.
Теперь я сталкиваюсь с другой проблемой, которая заключается в следующем:
В следующем журнале говорится, что я не могу создать папку по следующему пути:
Log.i("tag", "could not create dir "+fullPath);// fullPath = /mnt/sdcard/Android/data/raw
Я не хочу, чтобы данные хранились внутри /mnt / sdcard / Android / data / raw, но вместо этого я хочу, чтобы содержимое папки raw внутри активов копировалось в путь /mnt/sdcard/Android/data, что не происходит с фрагментом кода, который я использую из ссылки. ссылку я дал. Какие-нибудь очевидные причины, которые могли бы вызвать это с кодом, который я дал?