จะลบไฟล์จากการ์ด SD ได้อย่างไร?


131

ฉันกำลังสร้างไฟล์เพื่อส่งเป็นไฟล์แนบไปกับอีเมล ตอนนี้ฉันต้องการลบภาพหลังจากส่งอีเมล มีวิธีลบไฟล์หรือไม่?

ฉันลองแล้วmyFile.delete();แต่มันไม่ได้ลบไฟล์


ฉันใช้รหัสนี้สำหรับ Android ดังนั้นภาษาโปรแกรมจึงเป็น Java โดยใช้วิธีการเข้าถึงการ์ด SD ตามปกติของ Android ฉันกำลังลบไฟล์ด้วยonActivityResultวิธีนี้เมื่อไฟล์Intentถูกส่งกลับไปที่หน้าจอหลังจากส่งอีเมล


คุณต้องให้ข้อมูลเพิ่มเติมเกี่ยวกับปัญหาเช่นภาษาที่คุณใช้วิธีการเข้าถึงการ์ด SD เป็นต้น
Amok

คุณกำลังล้างการเปลี่ยนแปลงลงในดิสก์หรือไม่
Charles Ma

10
@Amuck ฉันคิดว่ามันปลอดภัยที่จะสมมติว่าเขาใช้ Java เนื่องจากเขาไม่ได้ระบุ
Jeremy Logan

ฟังดูน่าสงสัยมากถ้าคุณถามฉัน ...
Studocwho

คำตอบ:


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

โดยที่ selectedFilePath เป็นเส้นทางของไฟล์ที่คุณต้องการลบ - ตัวอย่างเช่น:

/sdcard/YourCustomDirectory/ExampleFile.mp3


ฉันคิดว่า Inner children ไม่ได้ถูกลบ .. คุณต้องลบ inner child ทั้งหมดดูคำตอบของฉันด้านล่าง ..
AndroidGeek

2
น่าเสียดายที่สิ่งนี้ใช้ไม่ได้กับ Android 4.4+ ดูคำตอบของฉันด้านล่าง
stevo.mit

ฉันไม่เข้าใจวิธีการทำงานสำหรับหลาย ๆ คน "ลบ" เป็นสีเทาใน Android Studio
TheOnlyAnil

ใช่ฉันกำลังส่งเส้นทางเช่น "file: /// storage / ... " ซึ่งใช้งานไม่ได้
Jemshit Iskenderov

1
@ stevo.mit คุณพบวิธีแก้ปัญหาหรือไม่? ฉันกำลังประสบปัญหาเดียวกันไม่สามารถลบไฟล์จาก sdcard เหนือ Android 4.4+ แต่รหัสเดียวกันทำงานสำหรับ 4.3 /
hasnain_ahmad

79

นอกจากนี้คุณต้องให้สิทธิ์หากคุณใช้> 1.6 SDK

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

ในAndroidManifest.xmlไฟล์


แต่สำหรับการจัดเก็บ SD Card แบบถอดได้คุณก็ต้องใช้เช่นกันContentResolver
25

35

เปลี่ยนสำหรับ Android 4.4+

ปพลิเคชันจะไม่ได้รับอนุญาตที่จะเขียน (ลบ, แก้ไข ... )เพื่อภายนอกจัดเก็บยกเว้นของพวกเขาแพคเกจเฉพาะไดเรกทอรี

ตามที่เอกสารของ Android ระบุ:

"แอปต้องไม่ได้รับอนุญาตให้เขียนไปยังอุปกรณ์จัดเก็บข้อมูลภายนอกรองยกเว้นในไดเรกทอรีเฉพาะแพ็กเกจตามที่อนุญาตโดยสิทธิ์สังเคราะห์"

อย่างไรก็ตามการแก้ปัญหาที่น่ารังเกียจอยู่(ดูรหัสด้านล่าง) ทดสอบกับ Samsung Galaxy S4 แต่การแก้ไขนี้ใช้ไม่ได้กับทุกอุปกรณ์ ฉันจะไม่นับวิธีแก้ปัญหานี้ในAndroid เวอร์ชันอนาคต

มีความเป็นบทความดีดีอธิบายการเปลี่ยนแปลง (4.4 ขึ้นไป) สิทธิ์ในการจัดเก็บข้อมูลภายนอก

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการแก้ปัญหาที่นี่ ซอร์สโค้ดวิธีแก้ปัญหามาจากไซต์นี้

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
ไม่ทำงานกับ note3 ฉันได้รับข้อผิดพลาด "MediaProvider: ไม่สามารถลบ /mnt/extSdCard/test.zip"
iscariot

2
ฉันมี Moto X ที่ยังไม่ได้รูทบน 4.4.4 และไม่มีปัญหาในการเขียนไปที่ / sdcard / mydirectory
Rob

"น่าเสียดายที่มันไม่สามารถใช้งานได้กับ Kitkat เวอร์ชันใหม่ ๆ อีกต่อไป แต่มันก็ถูกล็อคหมดแล้ว" อ้างจากผู้เขียน "ghisler (ผู้แต่ง)"
HendraWD

Android กำลังปิดตัวเองมากขึ้นเรื่อย ๆ เราจะจบลงด้วย iOS ที่น่าเกลียด !!
Phantômaxx

สิ่งนี้ล้มเหลวสำหรับฉัน (Android 7.1) มันจะส่งคืนfalseและไม่ลบไฟล์เสมอ :-(
Spikatrix

18

Android Context มีวิธีการดังต่อไปนี้:

public abstract boolean deleteFile (String name)

ฉันเชื่อว่าสิ่งนี้จะทำในสิ่งที่คุณต้องการด้วยสิทธิ์ของแอพที่ถูกต้องตามรายการข้างต้น


3
นี่น่าจะเป็นคำตอบที่ถูกต้อง context.deleteFile(filename);
Lisandro

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
context.sendBroadcast () ทำอะไร
Megaetron

โดยทั่วไปจะส่ง / ออกอากาศเจตนา (การดำเนินการที่จะดำเนินการ) ไปยังผู้รับทั้งหมดที่ตรงกับความตั้งใจนี้ ลิงค์
Jiyeh

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

รหัสนี้จะช่วยคุณ .. และใน Android Manifest คุณต้องได้รับอนุญาตให้ทำการแก้ไข ..

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

ไฟล์ [] สามารถเป็นค่าว่างได้หาก:file.exists:true file.isDirectory:true file.canRead:false file.canWrite:false
ilw

ฉันเดาว่าพวกคุณไม่รู้เลยว่าโทรศัพท์ Android บางรุ่น จำกัด การเข้าถึงการเขียนลงในการ์ด sd


1

ขออภัย: มีข้อผิดพลาดในรหัสของฉันก่อนหน้านี้เนื่องจากการตรวจสอบไซต์

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

String myPath = Environment.getExternalStorageDirectory()+myFile;  

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

ฉันคิดว่าชัดเจน ... ก่อนอื่นคุณต้องรู้ตำแหน่งไฟล์ของคุณ ประการที่สองEnvironment.getExternalStorageDirectory()คือวิธีที่ได้รับไดเรกทอรีแอปของคุณ สุดท้ายไฟล์คลาสที่จัดการไฟล์ของคุณ ...


1

ฉันมีปัญหาคล้ายกันกับแอปพลิเคชันที่ทำงานบน 4.4 สิ่งที่ฉันทำคือการแฮ็ก

ฉันเปลี่ยนชื่อไฟล์และไม่สนใจไฟล์เหล่านั้นในแอปพลิเคชันของฉัน

กล่าวคือ.

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
                    }

คุณต้องให้คำอธิบายเกี่ยวกับรหัสของคุณ! :)
Sanket Makani

อ่านไฟล์ getExternalStorageDirectory + เพิ่ม "/ Music /" มันเป็นเส้นทางของฉัน -> mypath = / storage / sdcard / Music / ตรวจสอบว่าไฟล์มีอยู่หรือไม่มีอยู่แล้วอ่าน ลบถ้ามีอยู่ นี่คือการลบรายการเพลงทั้งหมดในไดเร็กทอรี Music
LâmNguyễnTuấn

เพิ่มคำตอบเหมือนกัน! :)
Sanket Makani

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
ทั้งสองตัวอย่างของคุณค่อนข้างเหมือนกัน นอกจากนี้คำตอบที่ได้รับการโหวตสูงสุดก็บอกให้ทำเช่นนี้ ไม่เห็นว่าคำตอบนี้เพิ่มคำถามอะไรอีก นอกจากนี้จะใช้ไม่ได้กับไฟล์ในที่จัดเก็บข้อมูลภายนอก (เช่นการ์ด SD) จาก Android Kitkat เป็นต้นไป IIRC
Spikatrix
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.