Bagaimana cara memindahkan, menyalin, dan menghapus file dan direktori di SD secara terprogram?

93

Saya ingin memindahkan, menyalin, dan menghapus file dan direktori secara terprogram pada kartu SD. Saya telah melakukan pencarian Google tetapi tidak dapat menemukan sesuatu yang berguna.

Tony
sumber

Jawaban:

27

Gunakan Java I / O standar . Gunakan Environment.getExternalStorageDirectory()untuk mengakses root penyimpanan eksternal (yang, pada beberapa perangkat, adalah kartu SD).

CommonsWare
sumber
Ini menyalin konten file tetapi tidak benar-benar menyalin file - yaitu metadata sistem pengarsipan tidak disalin ... Saya ingin cara melakukan ini (seperti shell cp) untuk membuat cadangan sebelum saya menimpa file. Apa itu mungkin?
Sanjay Manohar
9
Sebenarnya bagian paling relevan dari Java I / O standar, java.nio.file, sayangnya tidak tersedia di Android (API level 21).
corwin.amber
1
@CommonsWare: Bisakah kita mengakses file pribadi dari SD secara pragmatis? atau hapus file pribadi?
Saad Bilal
@SaadBilal: Kartu SD biasanya merupakan penyimpanan yang dapat dilepas , dan Anda tidak memiliki akses sewenang-wenang ke file pada penyimpanan yang dapat dilepas melalui sistem file.
CommonsWare
3
dengan dirilisnya penyimpanan terbatas android 10 menjadi norma baru dan semua Metode melakukan operasi dengan file juga telah berubah, cara kerja java.io tidak akan berfungsi lagi kecuali Anda menambahkan "RequestLagacyStorage" dengan nilai "benar" di Manifes Anda Method Environment.getExternalStorageDirectory () juga dihilangkan
Mofor Emmanuel
160

setel izin yang benar di manifes

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

di bawah ini adalah fungsi yang akan memindahkan file Anda secara terprogram

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

}

Untuk menghapus penggunaan file

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

Untuk menyalin

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

}
Daniel Leahy
sumber
9
Jangan lupa untuk menyetel izin dalam manifes <using-permission android: name = "android.permission.WRITE_EXTERNAL_STORAGE" />
Daniel Leahy
5
Juga, jangan lupa untuk menambahkan garis miring di akhir inputPath dan outputPath, Contoh: / sdcard / NOT / sdcard
Pedro Lobito
saya mencoba untuk pindah tetapi saya tidak bisa. ini adalah kode saya moveFile (file.getAbsolutePath (), myfile, Environment.getExternalStorageDirectory () + "/ CopyEcoTab /");
Meghna
3
Juga, jangan lupa untuk menjalankan ini pada thread latar belakang melalui AsyncTask atau Handler, dll.
w3bshark
1
@DanielLeahy Bagaimana cara memastikan bahwa file telah berhasil disalin dan kemudian hanya menghapus file aslinya?
Rahulrr2602
142

Pindahkan file:

File from = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/kaic1/imagem.jpg");
File to = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/kaic2/imagem.jpg");
from.renameTo(to);
WonderSoftwares
sumber
32
A kepala; "Kedua jalur berada di titik pemasangan yang sama. Di Android, aplikasi kemungkinan besar akan mencapai batasan ini saat mencoba menyalin antara penyimpanan internal dan kartu SD."
zyamys
renameTogagal tanpa penjelasan apa pun
sasha199568
Anehnya, ini membuat direktori dengan nama yang diinginkan, bukan file. Ada ide tentang itu? File 'dari' dapat dibaca, dan keduanya ada di kartu SD.
xarlymg89
38

Fungsi untuk memindahkan file:

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

}
asivura.dll
sumber
Modifikasi apa yang diperlukan untuk MENGOPI file?
BlueMango
3
@BlueMango Hapus baris 10file.delete()
Peter Tran
Kode ini tidak akan berfungsi untuk file besar seperti file 1 gb atau 2 gb.
Vishal Sojitra
@Vishal Mengapa tidak?
LarsH
Saya kira @Vishal berarti menyalin-dan-menghapus file besar membutuhkan lebih banyak ruang dan waktu disk daripada memindahkan file itu.
LarsH
19

Menghapus

public static void deleteRecursive(File fileOrDirectory) {

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

    fileOrDirectory.delete();

    }

periksa ini tautan untuk fungsi di atas.

Salinan

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

}

Pindah

memindahkan tidak hanya menyalin folder satu lokasi ke lokasi lain kemudian menghapus folder itu

nyata

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
duggu
sumber
11
  1. Izin:

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

    Environment.getExternalStorageDirectory()
    
  3. Hapus file: ini adalah contoh cara menghapus semua folder kosong di folder root:

    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. Salin 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. Pindah file = salin + hapus file sumber

Ken
sumber
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);
xnagyg.dll
sumber
6
File.renameTo hanya berfungsi pada volume sistem file yang sama. Anda juga harus memeriksa hasil renameTo.
MyDogTom
6

Salin file menggunakan Square's Okio :

BufferedSink bufferedSink = Okio.buffer(Okio.sink(destinationFile));
bufferedSink.writeAll(Okio.source(sourceFile));
bufferedSink.close();
LetItRock
sumber
3
/**
     * 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());
        }
    }
JR
sumber
3

Jika Anda menggunakan Guava, Anda dapat menggunakan Files.move (dari, ke)

MyDogTom
sumber
Tautannya rusak.
LarsH
1
@ LarsH Saya memperbaiki tautan ke Guava JavaDoc.
MyDogTom
1

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; }
}
Pierre
sumber
1

Untuk memindahkan file, api ini dapat digunakan tetapi Anda membutuhkan setidaknya 26 sebagai level api -

pindahkan file

Tetapi jika Anda ingin memindahkan direktori, tidak ada dukungan sehingga kode asli ini dapat digunakan

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

Memindahkan file menggunakan kotlin. Aplikasi harus memiliki izin untuk menulis file di direktori tujuan.

@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}")
    }
}
Brownsoo Han
sumber
1

Pindahkan File atau 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();
}
Ahamadullah Saikat
sumber