Làm cách nào để xóa một tập tin từ thẻ SD?


131

Tôi đang tạo một tệp để gửi dưới dạng tệp đính kèm vào email. Bây giờ tôi muốn xóa hình ảnh sau khi gửi email. Có cách nào để xóa các tập tin?

Tôi đã thử myFile.delete();nhưng nó không xóa tập tin.


Tôi đang sử dụng mã này cho Android, vì vậy ngôn ngữ lập trình là Java sử dụng các cách thông thường của Android để truy cập thẻ SD. Tôi đang xóa tệp trong onActivityResultphương thức, khi một tệp Intentđược trả về màn hình sau khi gửi email.


Bạn cần cung cấp thêm thông tin về sự cố, chẳng hạn như ngôn ngữ bạn đang sử dụng, cách bạn truy cập thẻ SD, v.v.
Amok

bạn đang xóa các thay đổi vào đĩa?
Charles Ma

10
@Amuck Tôi nghĩ an toàn khi cho rằng anh ta sử dụng Java vì anh ta không chỉ định.
Jeremy Logan

Nghe có vẻ rất đáng ngờ nếu bạn hỏi tôi ...
Studocwho

Câu trả lời:


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

trong đó selectFilePath là đường dẫn của tệp bạn muốn xóa - ví dụ:

/sdcard/YourCustomDirectory/ExampleFile.mp3


Tôi nghĩ rằng những đứa trẻ bên trong không bị xóa .. bạn phải xóa tất cả những đứa trẻ bên trong. Xem câu trả lời của tôi dưới đây ..
Zar E Ahmer

2
Thật không may, điều này sẽ không hoạt động trên Android 4.4 trở lên. Xem câu trả lời của tôi dưới đây.
stevo.mit

Tôi không hiểu làm thế nào điều này làm việc cho nhiều người. "đã xóa" trông có vẻ xám xịt trong Android Studio.
TheOnlyAnil

vâng tôi đã gửi đường dẫn như "file: /// Storage / ..." không hoạt động
Jemshit Iskenderov

1
@ stevo.mit bạn đã tìm ra giải pháp chưa? Tôi cũng đang đối mặt với cùng một vấn đề không thể xóa tệp khỏi sdcard trên Android 4.4 trở lên. Nhưng cùng một mã làm việc cho 4.3 /
hasnain_ahmad

79

Ngoài ra, bạn phải cấp phép nếu bạn đang sử dụng> 1.6 SDK

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

trong AndroidManifest.xmltập tin


nhưng để lưu trữ Thẻ SD có thể tháo rời bạn cũng cầnContentResolver
user25

35

Thay đổi cho Android 4.4 trở lên

Apps đang không được phép để ghi (xóa, sửa đổi ...) để bên ngoài lưu trữ trừ để họ gói cụ thể thư mục.

Như tài liệu Android nêu:

"Không được phép ghi ứng dụng vào các thiết bị lưu trữ ngoài thứ cấp, ngoại trừ trong các thư mục dành riêng cho gói của chúng như được cho phép bởi các quyền tổng hợp."

Tuy nhiên cách giải quyết khó chịu tồn tại (xem mã dưới đây) . Đã thử nghiệm trên Samsung Galaxy S4, nhưng cách khắc phục này không hoạt động trên tất cả các thiết bị. Ngoài ra, tôi sẽ không tin vào cách giải quyết này có sẵn trong các phiên bản Android trong tương lai .

Có một bài viết tuyệt vời giải thích (4.4+) thay đổi quyền lưu trữ bên ngoài .

Bạn có thể đọc thêm về cách giải quyết ở đây . Mã nguồn giải pháp là từ trang web này .

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
Không làm việc cho note3. Tôi đã gặp lỗi "MediaProvider: Không thể xóa /mnt/extSdCard/test.zip"
iscariot

2
Tôi có một chiếc Moto X chưa được đăng ký vào ngày 4.4.4 và không gặp vấn đề gì khi ghi vào / sdcard / mydirectory
Rob

"Thật không may, nó không hoạt động nữa trên các phiên bản mới hơn của Kitkat, tất cả đã bị khóa." trích dẫn từ tác giả "ghisler (Tác giả)"
HendraWD

Android đang đóng cửa ngày càng nhiều. Chúng tôi sẽ kết thúc với một bản sao xấu xí của iOS !!
Phantômaxx

Điều này không thành công với tôi (Android 7.1). Nó luôn trả về falsevà không xóa tệp :-(
Spikatrix

18

Bối cảnh Android có phương pháp sau:

public abstract boolean deleteFile (String name)

Tôi tin rằng điều này sẽ làm những gì bạn muốn với các ứng dụng đầu vào đúng như được liệt kê ở trên.


3
Đây phải là câu trả lời chính xác. context.deleteFile(filename);
Lisandro

11

Xóa đệ quy tất cả con của tệp ...

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

    fileOrDirectory.delete();
}

9

Điều này làm việc cho tôi: (Xóa hình ảnh khỏi Thư viện)

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

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

2
Bối cảnh.sendBroadcast () làm gì?
Megaetron

Về cơ bản, nó sẽ gửi / phát sóng ý định (thao tác sẽ được thực hiện) cho tất cả các máy thu phù hợp với Mục đích này. liên kết
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());
 }

Mã này sẽ giúp bạn .. Và trong Bản kê khai Android, bạn phải có Giấy phép để thực hiện sửa đổi ..

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

các tệp [] có thể là null nếu:file.exists:true file.isDirectory:true file.canRead:false file.canWrite:false
ilw

Tôi đoán các bạn hoàn toàn không biết rằng một số điện thoại Android hạn chế quyền truy cập ghi vào thẻ sd.

4

Thử cái này.

File file = new File(FilePath);
FileUtils.deleteDirectory(file);

từ Apache Commons


1

Xin lỗi: Có lỗi trong mã của tôi trước đây vì xác thực trang web.

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

String myPath = Environment.getExternalStorageDirectory()+myFile;  

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

Tôi nghĩ là rõ ràng ... Đầu tiên bạn phải biết vị trí tập tin của bạn. Thứ hai ,,, Environment.getExternalStorageDirectory()là một phương pháp lấy thư mục ứng dụng của bạn. Cuối cùng, lớp Tệp xử lý tệp của bạn ...


1

Tôi gặp vấn đề tương tự với một ứng dụng chạy trên 4.4. Những gì tôi đã làm là một loại hack.

Tôi đã đổi tên các tập tin và bỏ qua chúng trong ứng dụng của tôi.

I E.

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

0

Điều này làm việc cho tôi.

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
                    }

Bạn cần cung cấp một số giải thích về mã của bạn! :)
Sanket Makani

Đọc tệp getExternalStorageDirectory + thêm "/ Music /" đó là đường dẫn của tôi -> mypath = / Storage / sdcard / Music /. Kiểm tra tập tin tồn tại hoặc không tồn tại và đọc nó. xóa nếu tồn tại. Đây là xóa tất cả danh sách nhạc trong thư mục Âm nhạc
Lâm Nguyễn Tuấn

Thêm tương tự vào câu trả lời! :)
Sanket Makani

0

Bạn có thể xóa một tập tin như sau:

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

Hoặc, hãy thử điều này:

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

1
Cả hai ví dụ của bạn đều khá giống nhau. Ngoài ra, câu trả lời được bình chọn cao nhất cho biết chính xác để làm điều này. Không thể xem thêm câu trả lời này thêm câu hỏi. Ngoài ra, điều này sẽ không hoạt động đối với các tệp trong bộ nhớ ngoài (như thẻ SD) từ Android Kitkat trở đi IIRC
Spikatrix
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.