web-dev-qa-db-ja.com

SDカードからファイルを削除する方法は?

メールの添付ファイルとして送信するファイルを作成しています。ここで、メールを送信した後に画像を削除します。ファイルを削除する方法はありますか?

myFile.delete();を試しましたが、ファイルは削除されませんでした。


私はこのコードをAndroidに使用しているため、プログラミング言語はJavaであり、通常のAndroidの方法でSDカードにアクセスします。電子メールの送信後にonActivityResultが画面に返されるときに、Intentメソッドでファイルを削除しています。

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

ここで、selectedFilePathは削除するファイルのパスです-例:

/sdcard/YourCustomDirectory/ExampleFile.mp3

356
Niko Gamulin

また、1.6 SDKを使用している場合は許可を与える必要があります

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

AndroidManifest.xmlファイル内

78
neeloor2004

Android 4.4+の変更

アプリは許可されていませんtowrite(削除、変更...)からexternalストレージexceptパッケージ固有のディレクトリへ。

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; 
   } 
}
33
stevo.mit

Android Contextには次のメソッドがあります。

public abstract boolean deleteFile (String name)

これは、上記の適切なアプリの許可であなたが望むことを行うと信じています。

17
Yossi

ファイルのすべての子を再帰的に削除して......

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

        fileOrDirectory.delete();
    }
11
Xar E Ahmer

これは私のために働く:(ギャラリーから画像を削除する)

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

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(photoPath))));
9
Jiyeh
 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"/>
6
Vivek Elangovan

これを試して。

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

apache Commonsから

4
Rahul Giradkar

申し訳ありませんが、以前はサイトの検証のためにコードに誤りがあります。

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

String myPath = Environment.getExternalStorageDirectory()+myFile;  

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

明確だと思います...まず、ファイルの場所を知る必要があります。次に、Environment.getExternalStorageDirectory()はアプリのディレクトリを取得するメソッドです。最後に、ファイルを処理するクラスFile ...

1
Denis IJCU

4.4で実行されているアプリケーションでも同様の問題が発生しました。私がやったことは、一種のハックでした。

ファイルの名前を変更し、アプリケーションで無視しました。

すなわち。

File sdcard = Environment.getExternalStorageDirectory();
                File from = new File(sdcard,"/ecatAgent/"+fileV);
                File to = new File(sdcard,"/ecatAgent/"+"Delete");
                from.renameTo(to);
1
kkm
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 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());
  }
}
0
Makvin

これは私のために働いた。

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

String my_Path = Environment.getExternalStorageDirectory()+myFile;  

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