Я хочу программно перемещать, копировать и удалять файлы и каталоги на SD-карте. Я выполнил поиск Google, но не нашел ничего полезного.
Как программно перемещать, копировать и удалять файлы и каталоги на SD?
Ответ 1
Использовать стандартные Java I/O. Используйте Environment.getExternalStorageDirectory()
, чтобы добраться до корня внешнего хранилища (которое на некоторых устройствах является SD-картой).
Ответ 2
установить правильные разрешения в манифесте
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
ниже - это функция, которая будет программно перемещать ваш файл
private void moveFile(String inputPath, String inputFile, String outputPath) {
InputStream in = null;
OutputStream out = null;
try {
//create output directory if it doesn't exist
File dir = new File (outputPath);
if (!dir.exists())
{
dir.mkdirs();
}
in = new FileInputStream(inputPath + inputFile);
out = new FileOutputStream(outputPath + inputFile);
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
in.close();
in = null;
// write the output file
out.flush();
out.close();
out = null;
// delete the original file
new File(inputPath + inputFile).delete();
}
catch (FileNotFoundException fnfe1) {
Log.e("tag", fnfe1.getMessage());
}
catch (Exception e) {
Log.e("tag", e.getMessage());
}
}
Чтобы удалить файл, используйте
private void deleteFile(String inputPath, String inputFile) {
try {
// delete the original file
new File(inputPath + inputFile).delete();
}
catch (Exception e) {
Log.e("tag", e.getMessage());
}
}
Чтобы скопировать
private void copyFile(String inputPath, String inputFile, String outputPath) {
InputStream in = null;
OutputStream out = null;
try {
//create output directory if it doesn't exist
File dir = new File (outputPath);
if (!dir.exists())
{
dir.mkdirs();
}
in = new FileInputStream(inputPath + inputFile);
out = new FileOutputStream(outputPath + inputFile);
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
in.close();
in = null;
// write the output file (You have now copied the file)
out.flush();
out.close();
out = null;
} catch (FileNotFoundException fnfe1) {
Log.e("tag", fnfe1.getMessage());
}
catch (Exception e) {
Log.e("tag", e.getMessage());
}
}
Ответ 3
Переместить файл:
File from = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/kaic1/imagem.jpg");
File to = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/kaic2/imagem.jpg");
from.renameTo(to);
Ответ 4
Функция для перемещения файлов:
private void moveFile(File file, File dir) throws IOException {
File newFile = new File(dir, file.getName());
FileChannel outputChannel = null;
FileChannel inputChannel = null;
try {
outputChannel = new FileOutputStream(newFile).getChannel();
inputChannel = new FileInputStream(file).getChannel();
inputChannel.transferTo(0, inputChannel.size(), outputChannel);
inputChannel.close();
file.delete();
} finally {
if (inputChannel != null) inputChannel.close();
if (outputChannel != null) outputChannel.close();
}
}
Ответ 5
Удалить
public static void deleteRecursive(File fileOrDirectory) {
if (fileOrDirectory.isDirectory())
for (File child : fileOrDirectory.listFiles())
deleteRecursive(child);
fileOrDirectory.delete();
}
проверьте эту ссылку для вышеуказанной функции.
Копировать
public static void copyDirectoryOneLocationToAnotherLocation(File sourceLocation, File targetLocation)
throws IOException {
if (sourceLocation.isDirectory()) {
if (!targetLocation.exists()) {
targetLocation.mkdir();
}
String[] children = sourceLocation.list();
for (int i = 0; i < sourceLocation.listFiles().length; i++) {
copyDirectoryOneLocationToAnotherLocation(new File(sourceLocation, children[i]),
new File(targetLocation, children[i]));
}
} else {
InputStream in = new FileInputStream(sourceLocation);
OutputStream out = new FileOutputStream(targetLocation);
// Copy the bits from instream to outstream
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
}
Переместить
move - это всего лишь скопировать папку в одно место в другое, а затем удалить папку, которой он
манифеста
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Ответ 6
File from = new File(Environment.getExternalStorageDirectory().getAbsolutePath().getAbsolutePath()+"/kaic1/imagem.jpg");
File to = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/kaic2/imagem.jpg");
from.renameTo(to);
Ответ 7
-
Права доступа:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-
Получить корневую папку SD-карты:
Environment.getExternalStorageDirectory()
-
Удалить файл: это пример того, как удалить все пустые папки в корневой папке:
public static void deleteEmptyFolder(File rootFolder){ if (!rootFolder.isDirectory()) return; File[] childFiles = rootFolder.listFiles(); if (childFiles==null) return; if (childFiles.length == 0){ rootFolder.delete(); } else { for (File childFile : childFiles){ deleteEmptyFolder(childFile); } } }
-
Скопировать файл:
public static void copyFile(File src, File dst) throws IOException { FileInputStream var2 = new FileInputStream(src); FileOutputStream var3 = new FileOutputStream(dst); byte[] var4 = new byte[1024]; int var5; while((var5 = var2.read(var4)) > 0) { var3.write(var4, 0, var5); } var2.close(); var3.close(); }
-
Переместить файл = копировать + удалить исходный файл
Ответ 8
Если вы используете Guava, вы можете использовать Files.move(источник, dest)
Ответ 9
/**
* Copy the local DB file of an application to the root of external storage directory
* @param context the Context of application
* @param dbName The name of the DB
*/
private void copyDbToExternalStorage(Context context , String dbName){
try {
File name = context.getDatabasePath(dbName);
File sdcardFile = new File(Environment.getExternalStorageDirectory() , "test.db");//The name of output file
sdcardFile.createNewFile();
InputStream inputStream = null;
OutputStream outputStream = null;
inputStream = new FileInputStream(name);
outputStream = new FileOutputStream(sdcardFile);
byte[] buffer = new byte[1024];
int read;
while ((read = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, read);
}
inputStream.close();
outputStream.flush();
outputStream.close();
}
catch (Exception e) {
Log.e("Exception" , e.toString());
}
}
Ответ 10
Скопировать файл с помощью Square Okio:
BufferedSink bufferedSink = Okio.buffer(Okio.sink(destinationFile));
bufferedSink.writeAll(Okio.source(sourceFile));
bufferedSink.close();
Ответ 11
Xamarin Android
public static bool MoveFile(string CurrentFilePath, string NewFilePath)
{
try
{
using (var f = new File(CurrentFilePath))
using (var i = new FileInputStream(f))
using (var o = new FileOutputStream(NewFilePath))
{
i.Channel.TransferTo(0, i.Channel.Size(), o.Channel);
f.Delete();
}
return true;
}
catch { return false; }
}
public static bool CopyFile(string CurrentFilePath, string NewFilePath)
{
try
{
using (var i = new FileInputStream(CurrentFilePath))
using (var o = new FileOutputStream(NewFilePath))
i.Channel.TransferTo(0, i.Channel.Size(), o.Channel);
return true;
}
catch { return false; }
}
public static bool DeleteFile(string FilePath)
{
try
{
using (var file = new File(FilePath))
file.Delete();
return true;
}
catch { return false; }
}
Ответ 12
Легко получить пути для внутренних и внешних путей SD-карты.
Для этого нам просто нужно использовать метод отражения и не нужно укоренять или подписывать приложение. Добавьте в манифесту следующее разрешение.
uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
Код:
final Class<?> surfaceControlClass = Class.forName("android.os.storage.StorageManager");
Method method1 = surfaceControlClass.getMethod("getVolumePaths")
method1.setAccessible(true);
final Object object = context.getSystemService(Context.STORAGE_SERVICE);
String[] volumes = method1.invoke(object)