কীভাবে প্রোগ্রামিয়ালি মুছে ফেলা যায়, এসডি-তে ফাইল এবং ডিরেক্টরি মুছে ফেলা যায়?


95

আমি এসডি কার্ডে ফাইল এবং ডিরেক্টরিগুলি প্রোগ্রামগতভাবে সরানো, অনুলিপি এবং মুছতে চাই। আমি একটি গুগল অনুসন্ধান করেছি তবে দরকারী কিছু খুঁজে পাচ্ছি না।

উত্তর:


27

স্ট্যান্ডার্ড জাভা I / O ব্যবহার করুনEnvironment.getExternalStorageDirectory()বাহ্যিক স্টোরেজ (যা কিছু ডিভাইসে, একটি এসডি কার্ড) এর মূলের কাছে যেতে ব্যবহার করুন ।


এগুলি ফাইলের সামগ্রীগুলি অনুলিপি করে তবে ফাইলটি সত্যই অনুলিপি করে না - অর্থাত্ ফাইলিং সিস্টেমের মেটাডেটা অনুলিপি করা হয়নি ... আমি cpকোনও ফাইল ওভাররাইট করার আগে ব্যাকআপ তৈরির জন্য এটি করার (শেলের মতো ) উপায় চাই । এটা কি সম্ভব?
সঞ্জয় মনোহর

9
আসলে জাভা আই / ও, স্ট্যান্ডার্ড জাভা আই / ও এর সর্বাধিক প্রাসঙ্গিক অংশটি দুর্ভাগ্যক্রমে অ্যান্ড্রয়েডে উপলব্ধ নয় (এপিআই স্তর 21)।
Corwin.amber

4
@ কমন্সওয়্যার: আমরা কী এসডি থেকে ব্যক্তিগত ফাইলগুলি ব্যবহারিকভাবে অ্যাক্সেস করতে পারি? বা কোনও ব্যক্তিগত ফাইল মুছবেন?
সাদ বিলাল

@ স্যাডবিলাল: একটি এসডি কার্ড সাধারণত অপসারণযোগ্য স্টোরেজ হয় এবং আপনার ফাইল সিস্টেমের মাধ্যমে অপসারণযোগ্য স্টোরেজে থাকা ফাইলগুলিতে স্বেচ্ছাসেবী অ্যাক্সেস নেই।
CommensWare

4
অ্যান্ড্রয়েড 10 এর মুক্তির সাথে সাথে স্কোপড স্টোরেজটি নতুন নিয়ম হয়ে উঠেছে এবং ফাইলগুলির সাথে অপারেশন করার সমস্ত পদ্ধতিও বদলে গেছে, জাভা.আইও-এর উপায়গুলি আর কাজ করবে না আপনি যদি না আপনার ম্যানিফেস্টে "সত্য" এর মান সহ "রিকোয়েস্টএলগেসিস্টোরেশন" যোগ করেন মেথড এনভায়রনমেন্ট.বিজেট এক্সটার্নালস্টোরেজডাইরেক্টরি () এছাড়াও চিত্রিত হয়েছে
মফোর ইমমানুয়েল

162

ম্যানিফেস্টে সঠিক অনুমতি সেট করুন

     <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" />
ড্যানিয়েল লেহে

4
এছাড়াও, ইনপুটপথ এবং আউটপুটপথের শেষে স্ল্যাশ যুক্ত করতে ভুলবেন না, প্রাক্তন: / এসডিকার্ড / নন / এসডিকার্ড
পেড্রো লোবিটো

আমি সরানোর চেষ্টা করেছি কিন্তু আমি cant.th এ আমার কোড মুভিফিল (file.getAbsolvePath (), মাইফাইল, এনভায়রনমেন্ট.জিট এক্সটার্নাল স্টোরেজ ডিরেক্টরী () + "/ কপিএকো ট্যাব /");
মেঘনা

4
এছাড়াও, এ্যাসিঙ্কটাস্ক বা একটি হ্যান্ডলার ইত্যাদির মাধ্যমে একটি পটভূমির থ্রেডগুলিতে এটি সম্পাদন করতে ভুলবেন না
w3bshark

4
@ ড্যানিয়েলহিয়া কীভাবে নিশ্চিত হয়ে যায় যে ফাইলটি সফলভাবে অনুলিপি করা হয়েছে এবং তারপরে কেবলমাত্র মূল ফাইলটি মুছবেন?
রাহুলর2602

142

ফাইল সরান:

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

32
একটি মাথা আপ; "উভয় পথই একই মাউন্ট পয়েন্টে রয়েছে Android অ্যান্ড্রয়েডে, অভ্যন্তরীণ স্টোরেজ এবং একটি এসডি কার্ডের মধ্যে অনুলিপি করার চেষ্টা করার সময় অ্যাপ্লিকেশনগুলি এই বিধিনিষেধের মধ্যে পড়তে পারে" "
zyamys

renameToকোনও ব্যাখ্যা ছাড়াই ব্যর্থ
sasha199568

আশ্চর্যের বিষয় হল এটি একটি ফাইলের পরিবর্তে পছন্দসই নামের সাথে একটি ডিরেক্টরি তৈরি করে। এটি সম্পর্কে কোন ধারণা? 'থেকে' ফাইলটি পঠনযোগ্য এবং এগুলির দুটিই এসডি কার্ডে রয়েছে।
xarlymg89

38

ফাইল সরানোর জন্য ফাংশন:

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

}

এই ফাইলটি অনুলিপি করার জন্য কি কি পরিবর্তন প্রয়োজন?
ব্লুমেঙ্গো

4
@ ব্লুম্যাঙ্গো 10 লাইন সরানfile.delete()
পিটার ট্রান

এই কোডটি 1 জিবি বা 2 জিবি ফাইলের মতো বড় ফাইলের জন্য কাজ করবে না।
বিশাল সোজিত্রা

@ বিষাল কেন?
LarsH

আমার ধারণা, ভিশালের অর্থ একটি বড় ফাইল অনুলিপি করা এবং মুছে ফেলার জন্য সেই ফাইলটি সরানোর চেয়ে অনেক বেশি ডিস্কের জায়গা এবং সময় প্রয়োজন।
LarsH

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 কেবল একই ফাইল সিস্টেমের ভলিউমে কাজ করে। এছাড়াও আপনার পুনঃনামকরণের ফলাফল পরীক্ষা করা উচিত।
মাইডোগটম

6

স্কোয়ারের 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());
        }
    }


2

কোটলিন ব্যবহার করে ফাইল সরানো হচ্ছে। গন্তব্য ডিরেক্টরিতে কোনও ফাইল লেখার জন্য অ্যাপের অনুমতি থাকতে হবে।

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

1

জামারিন অ্যান্ড্রয়েড

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

ফাইল বা ফোল্ডার সরান:

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();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.