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


131

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

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


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


あなたは、そのようなあなたがなど、あなたがSDカードにアクセスしているか、使用している言語として、問題の詳細な情報を提供する必要がある
逆上

変更をディスクにフラッシュしていますか?
チャールズ・マー

10
@Amuck彼が明記していないので、彼がJavaを使用していると想定しても安全だと思います。
ジェレミーローガン

あなたが私に尋ねたら非常に疑わしいように
聞こえ

回答:


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

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

/sdcard/YourCustomDirectory/ExampleFile.mp3


私は..削除されていないインナー子供たちが..あなたはすべての内部childs.Seeに以下の私の答えを削除するには持っていると思う
ツァラE Ahmerは

2
残念ながら、これはAndroid 4.4以降では機能しません。以下の私の答えを参照してください。
stevo.mit 2014年

これが多くの人にとってどのように機能したのか、私にはわかりません。「削除済み」はAndroid Studioでグレー表示されます。
TheOnlyAnil 2015

ええ、私は「file:/// storage / ...」のようなパスを送信していましたが、機能しませんでした
Jemshit Iskenderov

1
@ stevo.mit解決策を見つけましたか?私はまた、Android 4.4以降のSDカードからファイルを削除できないという同じ問題に直面しています。しかし、同じコードが4.3 /で機能します
hasnain_ahmad

79

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

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

AndroidManifest.xml、ファイル


しかしための取り外し可能なあなたにも必要なSDカードストレージContentResolver
user25

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
注3では機能しません。エラー「MediaProvider:/mnt/extSdCard/test.zipを削除できませんでした」
iscariot

2
4.4.4にroot化されていないMoto Xがあり、/ sdcard / mydirectoryへの書き込みに問題はありません
Rob

「残念ながら、それは新しいバージョンのKitkatでは機能しなくなり、すべてロックダウンされました。」著者からの引用 "ghisler(Author)"
HendraWD '

Androidはどんどん閉じています。iOSの醜いコピーになってしまいます!!
ファントマックス2017

これは私にとって失敗します(Android 7.1)。それは常に戻りfalse、ファイルを削除しません:-(
Spikatrix

18

Androidコンテキストには次のメソッドがあります。

public abstract boolean deleteFile (String name)

これは、上記の適切なアプリの権限で必要なことを行うと考えています。


3
これが正解です。context.deleteFile(filename);
リサンドロ

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マニフェストでは、変更を行うための許可を得る必要があります。

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

ファイル[]の場合は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()、アプリディレクトリを取得するメソッドです。最後に、ファイルを処理するFileクラス...


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 2017

ファイルgetExternalStorageDirectory +を追加します "/ Music /"を追加します。これは私のパスです-> mypath = / storage / sdcard / Music /。ファイルが存在するか、存在しないかを確認して読み取ります。存在する場合は削除します。これは、ディレクトリ音楽のすべてのリスト音楽を削除している
ラムグエントゥアン

同じことを答えに追加してください!:)
Sanket Makani 2017

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以降の外部ストレージ(SDカードなど)のファイルに対しては機能しませんIIRC
Spikatrix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.