SD पर फ़ाइलों और निर्देशिकाओं को प्रोग्रामेटिक रूप से कैसे स्थानांतरित, कॉपी और डिलीट करें?


91

मैं प्रोग्राम और एसडी कार्ड पर फ़ाइलों और निर्देशिकाओं को स्थानांतरित करना, कॉपी करना और हटाना चाहता हूं। मैंने एक Google खोज की है, लेकिन कुछ भी उपयोगी नहीं पा सका।

जवाबों:


26

मानक जावा I / O का उपयोग करेंEnvironment.getExternalStorageDirectory()बाहरी भंडारण की जड़ तक पहुंचने के लिए उपयोग करें (जो, कुछ उपकरणों पर, एक एसडी कार्ड है)।


ये फ़ाइलों की सामग्री की प्रतिलिपि बनाते हैं, लेकिन वास्तव में फ़ाइल की प्रतिलिपि नहीं बनाते हैं - अर्थात फाइलिंग सिस्टम मेटाडेटा की प्रतिलिपि नहीं बनाई गई ... मैं cpफ़ाइल को अधिलेखित करने से पहले बैकअप बनाने के लिए ऐसा करना चाहता हूं (शेल की तरह )। क्या यह संभव है?
संजय मनोहर

9
वास्तव में मानक जावा I / O, java.nio.file का सबसे प्रासंगिक हिस्सा, दुर्भाग्य से एंड्रॉइड (एपीआई स्तर 21) पर उपलब्ध नहीं है।
corwin.amber

1
@CommonsWare: क्या हम निजी फ़ाइलों को SD व्यावहारिक रूप से एक्सेस कर सकते हैं? या किसी भी निजी फ़ाइल को हटा दें?
साद बिलाल

@ सादबिलाल: एक एसडी कार्ड आमतौर पर हटाने योग्य भंडारण होता है , और आपके पास फाइल सिस्टम के माध्यम से हटाने योग्य भंडारण पर फाइलों तक मनमानी पहुंच नहीं होती है।
कॉमन्सवेयर फेयर

3
एंड्रॉइड के रिलीज़ के साथ 10 स्कोप्ड स्टोरेज नया मानदंड बन गया और फाइलों के साथ संचालन करने के सभी तरीके भी बदल गए हैं, करने के java.io तरीके अब काम नहीं करेंगे जब तक कि आप अपने मैनिफेस्ट में "true" मान के साथ "RequestLagacyStorage" न जोड़ें। विधि पर्यावरण
.getExternalStorageDirectory

158

प्रकट में सही अनुमतियाँ सेट करें

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

}

9
मेनिफ़ेस्ट में अनुमतियों को सेट करने के लिए मत भूलना <उपयोग-अनुमति एंड्रॉइड: नाम = "android.permission.WRITE_EXTERNAL_STORAGE" />
डैनियल लीही

5
इनपुटपाथ और आउटपुटपाथ के अंत में एक स्लैश जोड़ना न भूलें, Ex: / sdcard / NOT / sdcard
CONvid19

मैं स्थानांतरित करने की कोशिश की, लेकिन मैं cant.this मेरा कोड है MoveFile (file.getAbsolutePath (), myfile, Environment.getExternalStorageDirectory () + "/ CopyEcoTab /");
मेघना

3
इसके अलावा, AsyncTask या एक हैंडलर, आदि के माध्यम से पृष्ठभूमि थ्रेड पर इन पर अमल करना न भूलें
w3bshark

1
@DanielLeahy कैसे सुनिश्चित करें कि फ़ाइल को सफलतापूर्वक कॉपी किया गया है और फिर केवल मूल फ़ाइल को हटाएं?
राहुलराम २६०२

141

फ़ाइल ले जाएँ:

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

31
सिर ऊपर; "दोनों रास्ते एक ही आरोह बिंदु पर होते हैं। Android पर, आंतरिक संग्रहण और SD कार्ड के बीच प्रतिलिपि बनाने का प्रयास करते समय अनुप्रयोग इस प्रतिबंध से टकराते हैं।"
ज़ैमीज

renameToकिसी भी स्पष्टीकरण के बिना विफल रहता है
साशा 199568

अजीब बात है, यह एक फ़ाइल के बजाय वांछित नाम के साथ एक निर्देशिका बनाता है। इसके बारे में कोई विचार? फ़ाइल 'से' पठनीय है, और दोनों एसडी कार्ड में हैं।
xarlymg89

37

चलती फ़ाइलों के लिए कार्य:

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

}

फ़ाइल को कॉपी करने के लिए इसे किन संशोधनों की आवश्यकता है?
ब्लूमांगो

3
@BlueMango लाइन 10 को हटाएंfile.delete()
पीटर ट्रान

यह कोड 1 gb या 2 gb फ़ाइल जैसी बड़ी फ़ाइल के लिए काम नहीं करेगा।
विशाल सोजित्रा

@ विशाल क्यों नहीं?
लार्स

मुझे लगता है कि @Vishal का अर्थ है कि बड़ी फ़ाइल की प्रतिलिपि बनाना और हटाना उस फ़ाइल को ले जाने की तुलना में बहुत अधिक डिस्क स्थान और समय की आवश्यकता है।
लार्स

19

हटाएं

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

}

चाल

चाल कुछ भी नहीं है बस फ़ोल्डर को एक स्थान को दूसरे में कॉपी करें फिर फ़ोल्डर को हटा दें

प्रकट

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

11
  1. अनुमतियां:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  2. एसडी कार्ड रूट फ़ोल्डर प्राप्त करें:

    Environment.getExternalStorageDirectory()
  3. फ़ाइल हटाएँ: यह रूट फ़ोल्डर में सभी खाली फ़ोल्डर को हटाने के तरीके पर एक उदाहरण है:

    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. प्रतिलिपि फ़ाइल:

    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. फ़ाइल ले जाएँ = स्रोत फ़ाइल को कॉपी + हटाएं


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

6
File.renameTo केवल एक ही फाइल सिस्टम वॉल्यूम पर काम करता है। इसके अलावा आपको renameTo के परिणाम की जांच करनी चाहिए।
MyDogTom

5

स्क्वायर की Okio का उपयोग करके कॉपी फ़ाइल :

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

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


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

1

किसी फ़ाइल को स्थानांतरित करने के लिए इस एपीआई का उपयोग किया जा सकता है, लेकिन आपको एपीआई स्तर के रूप में कम से कम 26 की आवश्यकता होती है -

फ़ाइल ले जाएँ

लेकिन अगर आप डायरेक्टरी को आगे बढ़ाना चाहते हैं तो कोई सपोर्ट नहीं है इसलिए इस नेटिव कोड का इस्तेमाल किया जा सकता है

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

1

कोटलिन का उपयोग करके चलती फ़ाइल। एप्लिकेशन को गंतव्य निर्देशिका में फ़ाइल लिखने की अनुमति होनी चाहिए।

@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}")
    }
}

0

फ़ाइल या फ़ोल्डर ले जाएँ:

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();
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.