如何从SD卡中删除文件?

我正在创build一个文件作为附件发送到电子邮件。 现在我想在发送邮件后删除图片。 有没有办法删除文件?

我试过myFile.delete(); 但它并没有删除该文件。


我使用这个代码为Android,所以编程语言是Java使用通常的Android方式来访问SD卡。 当Intent在发送邮件后返回到屏幕时,我正在删除onActivityResult方法中的文件。

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

其中selectedFilePath是要删除的文件的path – 例如:

/sdcard/YourCustomDirectory/ExampleFile.mp3

如果您使用> 1.6 SDK,您也必须授予权限

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

AndroidManifest.xml文件中

更改为Android 4.4+

除了 特定软件包的目录之外 不允许应用程序写入 (删除,修改…) 外部存储。

正如Android文档所述:

除了合成权限所允许的软件包专用目录外,不得将应用程序写入辅助外部存储设备。“

然而, 讨厌的解决方法存在(见下面的代码) 。 在三星Galaxy S4上进行testing,但是这个修补程序在所有设备上都不起作用。 此外,我不会指望未来版本的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; } } 

Android上下文有以下方法:

 public abstract boolean deleteFile (String name) 

我相信这将做你想要的与上面列出的正确的应用程序权限。

recursion删除文件的所有子项…

 public static void DeleteRecursive(File fileOrDirectory) { if (fileOrDirectory.isDirectory()) { for (File child : fileOrDirectory.listFiles()) { DeleteRecursive(child); } } fileOrDirectory.delete(); } 
  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清单你必须获得许可进行修改..

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

这适用于我:(从图库中删除图像)

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

尝试这个。

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

来自Apache Commons

对不起:由于网站validation,我的代码之前有一个错误。

 String myFile = "/Name Folder/File.jpg"; String myPath = Environment.getExternalStorageDirectory()+myFile; File f = new File(myPath); Boolean deleted = f.delete(); 

我认为很清楚…首先你必须知道你的文件位置。 其次,,, Environment.getExternalStorageDirectory()是一个获取你的app目录的方法。 最后是处理文件的类文件…

我在4.4上运行的应用程序有类似的问题。 我所做的只是一种破解。

我重命名了这些文件,并在应用程序中忽略了它们。

即。

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

这对我有效。

 String myFile = "/Name Folder/File.jpg"; String my_Path = Environment.getExternalStorageDirectory()+myFile; File f = new File(my_Path); Boolean deleted = f.delete(); 
 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 } 
 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(); 

你可以删除一个文件如下:

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