কীভাবে এসডি কার্ড থেকে একটি ফাইল মুছবেন?


131

আমি কোনও ইমেলের সংযুক্তি হিসাবে প্রেরণের জন্য একটি ফাইল তৈরি করছি। এখন আমি ইমেল প্রেরণের পরে চিত্রটি মুছতে চাই। ফাইল মুছে ফেলার কোনও উপায় আছে?

আমি চেষ্টা করেছি myFile.delete();কিন্তু এটি ফাইল মোছেনি।


আমি এই কোডটি অ্যান্ড্রয়েডের জন্য ব্যবহার করছি, তাই প্রোগ্রামিং ভাষাটি জাভা হ'ল এসডি কার্ড অ্যাক্সেসের জন্য সাধারণ অ্যান্ড্রয়েড উপায়গুলি ব্যবহার করে। আমি কোনও onActivityResultপদ্ধতিতে ফাইলটি মুছে ফেলছি , যখন Intentকোনও ইমেল প্রেরণের পরে পর্দায় ফিরে আসে।


আপনি সমস্যা, যেমন কোন ভাষা হিসেবে আপনি ব্যবহার করছেন, কেমন SD কার্ড অ্যাক্সেস, ইত্যাদি সম্পর্কে আরও তথ্যের প্রদান করতে
আজিমপুরে

আপনি কি ডিস্কে পরিবর্তনগুলি ফ্লাশ করছেন?
চার্লস মা

10
@ আমাক আমি মনে করি যে তিনি জাভা ব্যবহার করছেন সেহেতু এটি নিরাপদ বলে তিনি নির্দিষ্ট করেননি।
জেরেমি লোগান

আপনি আমাকে জিজ্ঞাসা করলে খুব সন্দেহজনক মনে হচ্ছে ...
স্টুডো

উত্তর:


359
File file = new File(selectedFilePath);
boolean deleted = file.delete();

যেখানে নির্বাচিত ফাইলপথ হ'ল ফাইলটি মুছতে চান - উদাহরণস্বরূপ:

/sdcard/YourCustomDirectory/ExampleFile.mp3


আমি মনে করি অভ্যন্তরীণ বাচ্চাদের মুছে ফেলা হয়নি .. আপনাকে সমস্ত অভ্যন্তরীণ বাচ্চাদের মুছতে হবে my নীচে আমার উত্তরটি দেখুন ..
জার ই আহমের

2
দুর্ভাগ্যক্রমে এটি অ্যান্ড্রয়েড 4.4+ এ কাজ করবে না। আমার উত্তর নীচে দেখুন।
stevo.mit

আমি বুঝতে পারছি না কিভাবে এটি অনেকের জন্য কাজ করেছিল। "মুছে ফেলা" অ্যান্ড্রয়েড স্টুডিওতে ধূসর দেখায়।
TheOnlyAnil

হ্যাঁ আমি "ফাইল: /// সঞ্চয়স্থান / ..." এর মতো পথে পাঠাচ্ছিলাম যা কার্যকর হয়নি
জেমশিত ইস্কেন্দরভ

1
@ stevo.mit আপনি কি সমাধান খুঁজে পেয়েছেন? আমি একই সমস্যার মুখোমুখি আছি অ্যান্ড্রয়েড ৪.৪++ এর উপরে এসডিকার্ড থেকে ফাইল মুছতে পারছি না। তবে একই কোডটি 4.3 /
হাসনাইন_হমাদ

79

এছাড়াও আপনি> 1.6 এসডিকে ব্যবহার করছেন তবে আপনাকে অনুমতি দিতে হবে

uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"

মধ্যে AndroidManifest.xmlফাইল


তবে অপসারণযোগ্য এসডি কার্ড স্টোরেজের জন্য আপনার প্রয়োজনContentResolver
ইউজার 25

35

Android 4.4+ এর জন্য পরিবর্তন করুন +

Apps আছে অনুমোদিত নয় করার লেখ (মুছতে, সংশোধন ...) থেকে বহিরাগত স্টোরেজ ব্যতীত তাদের জন্য প্যাকেজ-নির্দিষ্ট ডিরেক্টরি।

অ্যান্ড্রয়েড ডকুমেন্টেশন যেমন বলে:

"অ্যাপ্লিকেশনগুলিকে সংশ্লেষিত অনুমতি দ্বারা অনুমোদিত প্যাকেজ-নির্দিষ্ট ডিরেক্টরিগুলি ব্যতীত, গৌণ বাহ্যিক স্টোরেজ ডিভাইসে লেখার অনুমতি দেওয়া উচিত নয়" "

তবে দুষ্টু workaround বিদ্যমান (নীচে কোড দেখুন) । স্যামসুং গ্যালাক্সি এস 4-তে পরীক্ষিত, তবে এই ফিক্সটি সমস্ত ডিভাইসে কার্যকর হয় না। এছাড়াও ভবিষ্যতের সংস্করণের Android এর সংস্করণগুলিতে এই কাজের সুযোগটি পাওয়া যায় বলে আমি মনে করি না

বাহ্যিক স্টোরেজ অনুমতি পরিবর্তনের ব্যাখ্যা করে একটি দুর্দান্ত নিবন্ধ রয়েছে (৪.৪+)

আপনি এখানে workaround সম্পর্কে আরও পড়তে পারেন । ওয়ার্কআরাউন্ড উত্স কোডটি এই সাইট থেকে ।

public class MediaFileFunctions 
{
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static boolean deleteViaContentProvider(Context context, String fullname) 
    { 
      Uri uri=getFileUri(context,fullname); 

      if (uri==null) 
      {
         return false;
      }

      try 
      { 
         ContentResolver resolver=context.getContentResolver(); 

         // change type to image, otherwise nothing will be deleted 
         ContentValues contentValues = new ContentValues(); 
         int media_type = 1; 
         contentValues.put("media_type", media_type); 
         resolver.update(uri, contentValues, null, null); 

         return resolver.delete(uri, null, null) > 0; 
      } 
      catch (Throwable e) 
      { 
         return false; 
      } 
   }

   @TargetApi(Build.VERSION_CODES.HONEYCOMB)
   private static Uri getFileUri(Context context, String fullname) 
   {
      // Note: check outside this class whether the OS version is >= 11 
      Uri uri = null; 
      Cursor cursor = null; 
      ContentResolver contentResolver = null;

      try
      { 
         contentResolver=context.getContentResolver(); 
         if (contentResolver == null)
            return null;

         uri=MediaStore.Files.getContentUri("external"); 
         String[] projection = new String[2]; 
         projection[0] = "_id"; 
         projection[1] = "_data"; 
         String selection = "_data = ? ";    // this avoids SQL injection 
         String[] selectionParams = new String[1]; 
         selectionParams[0] = fullname; 
         String sortOrder = "_id"; 
         cursor=contentResolver.query(uri, projection, selection, selectionParams, sortOrder); 

         if (cursor!=null) 
         { 
            try 
            { 
               if (cursor.getCount() > 0) // file present! 
               {   
                  cursor.moveToFirst(); 
                  int dataColumn=cursor.getColumnIndex("_data"); 
                  String s = cursor.getString(dataColumn); 
                  if (!s.equals(fullname)) 
                     return null; 
                  int idColumn = cursor.getColumnIndex("_id"); 
                  long id = cursor.getLong(idColumn); 
                  uri= MediaStore.Files.getContentUri("external",id); 
               } 
               else // file isn't in the media database! 
               {   
                  ContentValues contentValues=new ContentValues(); 
                  contentValues.put("_data",fullname); 
                  uri = MediaStore.Files.getContentUri("external"); 
                  uri = contentResolver.insert(uri,contentValues); 
               } 
            } 
            catch (Throwable e) 
            { 
               uri = null; 
            }
            finally
            {
                cursor.close();
            }
         } 
      } 
      catch (Throwable e) 
      { 
         uri=null; 
      } 
      return uri; 
   } 
}

1
নোট 3 এর জন্য কাজ করছেন না। আমি ত্রুটি পেয়েছি "মিডিয়াপ্রাইডার: /mnt/extSdCard/test.zip মুছতে পারেনি"
ইসক্রিয়ট

2
আমার ৪.৪.৪-তে একটি আনরোটেড মোটো এক্স রয়েছে এবং আমার / এসডিকার্ড / মাইডাইরেক্টরিতে কোনও সমস্যা নেই
রব

"দুর্ভাগ্যক্রমে এটি কিটকটের নতুন সংস্করণগুলিতে আর কাজ করে না, এগুলি সমস্ত লক হয়ে গেছে।" লেখক "গিসলার (লেখক)" থেকে উদ্ধৃত
হেন্দ্রডাব্লুডি

অ্যান্ড্রয়েড নিজেকে আরও বেশি করে বন্ধ করে দিচ্ছে। আমরা iOS এর কুরুচিপূর্ণ অনুলিপিটি শেষ করব!
ফ্যান্ট্যামেক্সএক্স

এটি আমার জন্য ব্যর্থ (অ্যান্ড্রয়েড 7.1)। এটি সর্বদা ফিরে আসে falseএবং ফাইলটি মুছবে না :-(
স্পিক্যাট্রিক্স

18

অ্যান্ড্রয়েড প্রসঙ্গে নিম্নলিখিত পদ্ধতি রয়েছে:

public abstract boolean deleteFile (String name)

আমি বিশ্বাস করি এটি উপরের তালিকাভুক্ত সঠিক অ্যাপ প্রিমেশন সহ আপনি যা করতে চান তা করবে।


3
এটি সঠিক উত্তর হওয়া উচিত। context.deleteFile(filename);
লিসান্দ্রো

11

ফাইলের সমস্ত শিশুদের পুনরাবৃত্তভাবে মুছুন ...

public static void DeleteRecursive(File fileOrDirectory) {
    if (fileOrDirectory.isDirectory()) {
        for (File child : fileOrDirectory.listFiles()) {
            DeleteRecursive(child);
        }
    }

    fileOrDirectory.delete();
}

9

এটি আমার জন্য কাজ করে: (গ্যালারী থেকে চিত্র মুছুন)

File file = new File(photoPath);
file.delete();

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(photoPath))));

2
কনটেক্সট.সেটড্রোডকাস্ট () কী করে?
মেগেট্রন

মূলত, এটি এই অভিপ্রায়টির সাথে মেলে সমস্ত প্রেরকদের উদ্দেশ্যে উদ্দেশ্য (সম্প্রচারিত করার জন্য) প্রেরণ / সম্প্রচার করে। লিঙ্ক
জিয়াহ

6
 public static boolean deleteDirectory(File path) {
    // TODO Auto-generated method stub
    if( path.exists() ) {
        File[] files = path.listFiles();
        for(int i=0; i<files.length; i++) {
            if(files[i].isDirectory()) {
                deleteDirectory(files[i]);
            }
            else {
                files[i].delete();
            }
        }
    }
    return(path.delete());
 }

এই কোডটি আপনাকে সহায়তা করবে .. এবং অ্যান্ড্রয়েড ম্যানিফেস্টে আপনাকে সংশোধন করার অনুমতি নিতে হবে ..

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

ফাইলগুলি [] file.exists:true file.isDirectory:true file.canRead:false file.canWrite:false
নালাগুলি

আমার ধারণা আপনি ছেলেরা সম্পূর্ণ অসচেতন যে কিছু অ্যান্ড্রয়েড ফোন এসডি কার্ডে লেখার অ্যাক্সেসকে সীমাবদ্ধ করে।


1

দুঃখিত: সাইটের বৈধতার কারণে আমার কোডে আগে একটি ভুল হয়েছে।

String myFile = "/Name Folder/File.jpg";  

String myPath = Environment.getExternalStorageDirectory()+myFile;  

File f = new File(myPath);
Boolean deleted = f.delete();

আমি মনে করি পরিষ্কার ... প্রথমে আপনার ফাইলের অবস্থান অবশ্যই জেনে রাখা উচিত। দ্বিতীয়ত ,,, Environment.getExternalStorageDirectory()এমন একটি পদ্ধতি যা আপনার অ্যাপ ডিরেক্টরিটি পায়। শেষ অবধি ক্লাস ফাইল যারা আপনার ফাইল পরিচালনা করে ...


1

৪.৪-তে চলমান একটি অ্যাপ্লিকেশন নিয়ে আমার একই সমস্যা ছিল। আমি যা করেছি তা হ্যাকের মতো ছিল।

আমি ফাইলগুলির নাম পরিবর্তন করে এনে আমার অ্যাপ্লিকেশনটিতে সেগুলি উপেক্ষা করেছি।

অর্থাত।

File sdcard = Environment.getExternalStorageDirectory();
                File from = new File(sdcard,"/ecatAgent/"+fileV);
                File to = new File(sdcard,"/ecatAgent/"+"Delete");
                from.renameTo(to);

0

এটি আমার পক্ষে কাজ করেছে।

String myFile = "/Name Folder/File.jpg";  

String my_Path = Environment.getExternalStorageDirectory()+myFile;  

File f = new File(my_Path);
Boolean deleted = f.delete();

0
private boolean deleteFromExternalStorage(File file) {
                        String fileName = "/Music/";
                        String myPath= Environment.getExternalStorageDirectory().getAbsolutePath() + fileName;

                        file = new File(myPath);
                        System.out.println("fullPath - " + myPath);
                            if (file.exists() && file.canRead()) {
                                System.out.println(" Test - ");
                                file.delete();
                                return false; // File exists
                            }
                            System.out.println(" Test2 - ");
                            return true; // File not exists
                    }

আপনার কোড সম্পর্কে আপনাকে কিছু ব্যাখ্যা সরবরাহ করতে হবে! :)
সংকেত মাকানী

GetExternStorageDirectory ফাইলটি পড়ুন + যোগ করুন / সঙ্গীত / "এটি আমার পথ -> মাইপথ = / স্টোরেজ / এসডিকার্ড / সঙ্গীত /। ফাইলের অস্তিত্ব আছে বা নেই এবং এটি পড়ুন Check উপস্থিত থাকলে মুছুন। এটি ডিরেক্টরি সংগীতের সমস্ত তালিকার সংগীত মুছে ফেলা হবে
Lâm Nguyễn Tuấn

উত্তরে একই যোগ করুন! :)
সংকেত মাকানী

0

আপনি নিম্নলিখিত হিসাবে একটি ফাইল মুছতে পারেন:

File file = new File("your sdcard path is here which you want to delete");
file.delete();
if (file.exists()){
  file.getCanonicalFile().delete();
  if (file.exists()){
    deleteFile(file.getName());
  }
}

-1
File filedel = new File("/storage/sdcard0/Baahubali.mp3");
boolean deleted1 = filedel.delete();

বা, এটি চেষ্টা করুন:

String del="/storage/sdcard0/Baahubali.mp3";
File filedel2 = new File(del);
boolean deleted1 = filedel2.delete();

1
আপনার উভয় উদাহরণ বেশ একই। এছাড়াও, সর্বোচ্চ ভোট দেওয়া উত্তর এটি করতে ঠিক বলেছে tells এই উত্তরটি আরও কী যুক্ত করে তা দেখতে পাচ্ছেন না। এছাড়াও, এটি অ্যান্ড্রয়েড কিটক্যাট থেকে বাইরের স্টোরেজে (এসডি কার্ডের মতো) ফাইলগুলির জন্য আইআইআরসি
স্পিক্যাট্রিক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.