如何从SD卡删除文件?


131

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

我已经尝试过,myFile.delete();但是没有删除文件。


我正在将此代码用于Android,因此编程语言是Java,使用通常的Android方法访问SD卡。发送电子邮件后,将an返回到屏幕onActivityResult时,我正在方法中删除文件Intent


您需要提供有关的问题,比如哪些语言你使用,你如何存取SD卡等更多信息
横行

您正在刷新磁盘更改吗?
Charles Ma

10
@Amuck我认为可以确定他正在使用Java,因为他没有指定。
杰里米·洛根

如果您问我,这听起来非常可疑...
Studocwho

Answers:


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

其中selectedFilePath是要删除的文件的路径,例如:

/sdcard/YourCustomDirectory/ExampleFile.mp3


我觉得孩子内不会被删除..你必须删除所有内部childs.See下面..我的答案
扎尔ËAhmer

2
不幸的是,这不适用于Android 4.4+。请参阅下面的答案。
stevo.mit,2014年

我不明白这是如何工作的。在Android Studio中,“已删除”显示为灰色。
TheOnlyAnil 2015年

是的,我发送的路径“ file:/// storage / ...”不起作用
Jemshit Iskenderov

1
@ stevo.mit找到了解决方案吗?我也面临同样的问题,无法从Android 4.4以上版本的sdcard删除文件。但相同的代码适用于4.3 /
hasnain_ahmad

79

另外,如果您使用的是> 1.6 SDK,则必须授予权限

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

AndroidManifest.xml文件中


但对于可移动 SD卡存储,您还需要ContentResolver
user25 '18年

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 2014年

2
我在4.4.4上拥有无根的Moto X,并且可以毫无问题地写入/ sdcard / mydirectory
Rob,

“不幸的是,它在新版本的Kitkat上不再起作用,它已全部锁定。” 引用作者“ ghisler(作者)”
HendraWD '16

Android越来越关门了。我们最终将得到一个丑陋的iOS版本!
Phantômaxx

这对我来说失败(Android 7.1)。它总是返回false并且不会删除文件:-(
Spikatrix

18

Android上下文具有以下方法:

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

这对我有用:(从Gallery中删除图像)

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 2015年

基本上,它向所有与该意图匹配的接收方发送/广播意图(要执行的操作)。链接
Jiyeh 2015年

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"/>

在以下情况下,files []可以为null: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 /。检查文件是否存在或不存在并读取。删除(如果存在)。这是删除所有列表中的音乐目录音乐
林阮遵

添加相同的答案!:)
Sanket Makani's

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
您的两个示例几乎相同。同样,投票率最高的答案也恰恰说明了这一点。再也看不到这个答案增加了问题。另外,这对于从Android Kitkat开始IIRC的外部存储(如SD卡)中的文件不起作用
Spikatrix
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.