如何以编程方式移动、复制和删除 SD 上的文件和目录?

我想以编程方式移动,复制和删除文件和目录上的 SD 卡。我在谷歌上搜索了一下,但是没有找到任何有用的东西。

200159 次浏览

Use standard Java I/O. Use Environment.getExternalStorageDirectory() to get to the root of external storage (which, on some devices, is an SD card).

set the correct permissions in the manifest

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

below is a function that will programmatically move your file

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


}

To Delete the file use

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

To copy

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


}

Delete

public static void deleteRecursive(File fileOrDirectory) {


if (fileOrDirectory.isDirectory())
for (File child : fileOrDirectory.listFiles())
deleteRecursive(child);


fileOrDirectory.delete();


}

check this link for above function.

Copy

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

move is nothing just copy the folder one location to another then delete the folder thats it

manifest

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Move file:

File from = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/kaic1/imagem.jpg");
File to = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/kaic2/imagem.jpg");
from.renameTo(to);
File from = new File(Environment.getExternalStorageDirectory().getAbsolutePath().getAbsolutePath()+"/kaic1/imagem.jpg");
File to = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/kaic2/imagem.jpg");
from.renameTo(to);

If you are using Guava, you can use Files.move(from, to)

Function for moving files:

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


}
/**
* 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());
}
}
  1. Permissions:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
  2. Get SD card root folder:

    Environment.getExternalStorageDirectory()
    
  3. Delete file: this is an example on how to delete all empty folders in a root folder:

    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);
    }
    }
    }
    
  4. Copy file:

    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();
    }
    
  5. Move file = copy + delete source file

Copy file using Square's Okio:

BufferedSink bufferedSink = Okio.buffer(Okio.sink(destinationFile));
bufferedSink.writeAll(Okio.source(sourceFile));
bufferedSink.close();

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

To move a file this api can be used but you need atleat 26 as api level -

move file

But if you want to move directory no support is there so this native code can be used

    import org.apache.commons.io.FileUtils;


import java.io.IOException;
import java.io.File;


public class FileModule {


public void moveDirectory(String src, String des) {
File srcDir = new File(src);
File destDir = new File(des);
try {
FileUtils.moveDirectory(srcDir,destDir);
} catch (Exception e) {
Log.e("Exception" , e.toString());
}
}


public void deleteDirectory(String dir) {
File delDir = new File(dir);
try {
FileUtils.deleteDirectory(delDir);
} catch (IOException e) {
Log.e("Exception" , e.toString());
}
}
}

Moving file using kotlin. App has to have permission to write a file in destination directory.

@Throws(FileNotFoundException::class, IOError::class)
private fun moveTo(source: File, dest: File, destDirectory: File? = null) {


if (destDirectory?.exists() == false) {
destDirectory.mkdir()
}


val fis = FileInputStream(source)
val bufferLength = 1024
val buffer = ByteArray(bufferLength)
val fos = FileOutputStream(dest)
val bos = BufferedOutputStream(fos, bufferLength)
var read = fis.read(buffer, 0, read)
while (read != -1) {
bos.write(buffer, 0, read)
read = fis.read(buffer) // if read value is -1, it escapes loop.
}
fis.close()
bos.flush()
bos.close()


if (!source.delete()) {
HLog.w(TAG, klass, "failed to delete ${source.name}")
}
}

Move File or Folder:

public static void moveFile(File srcFileOrDirectory, File desFileOrDirectory) throws IOException {
File newFile = new File(desFileOrDirectory, srcFileOrDirectory.getName());
try (FileChannel outputChannel = new FileOutputStream(newFile).getChannel(); FileChannel inputChannel = new FileInputStream(srcFileOrDirectory).getChannel()) {
inputChannel.transferTo(0, inputChannel.size(), outputChannel);
inputChannel.close();
deleteRecursive(srcFileOrDirectory);
}
}


private static void deleteRecursive(File fileOrDirectory) {
if (fileOrDirectory.isDirectory())
for (File child : Objects.requireNonNull(fileOrDirectory.listFiles()))
deleteRecursive(child);
fileOrDirectory.delete();
}

In Kotlin you can use copyTo() extension function,

sourceFile.copyTo(destFile, true)

You can use this folder with file path & destination path

public void copyFile(String sourcePath, String destinationPath) throws IOException {
FileInputStream inStream = new FileInputStream(sourcePath);
FileOutputStream outStream = new FileOutputStream(destinationPath);
FileChannel inChannel = inStream.getChannel();
FileChannel outChannel = outStream.getChannel();
inChannel.transferTo(0, inChannel.size(), outChannel);
inStream.close();
outStream.close();
}