212

アプリケーションのユーザーが DCIM フォルダー (SD カード上にあり、サブフォルダーを含む) を削除できるようにしたいと考えています。

これは可能ですか?

4

24 に答える 24

549

次のように、ファイルとフォルダーを再帰的に削除できます。

void deleteRecursive(File fileOrDirectory) {
    if (fileOrDirectory.isDirectory())
        for (File child : fileOrDirectory.listFiles())
            deleteRecursive(child);

    fileOrDirectory.delete();
}
于 2011-06-21T13:09:39.593 に答える
323

DCIM フォルダはシステム フォルダであるため削除できません。電話で手動で削除すると、そのフォルダーの内容は削除されますが、DCIM フォルダーは削除されません。以下の方法で内容を削除できます。

コメントに従って更新

File dir = new File(Environment.getExternalStorageDirectory()+"Dir_name_here"); 
if (dir.isDirectory()) 
{
    String[] children = dir.list();
    for (int i = 0; i < children.length; i++)
    {
       new File(dir, children[i]).delete();
    }
}
于 2011-02-09T10:45:01.760 に答える
71

コマンドライン引数を使用して、フォルダー全体とその内容を削除できます。

public static void deleteFiles(String path) {

    File file = new File(path);

    if (file.exists()) {
        String deleteCmd = "rm -r " + path;
        Runtime runtime = Runtime.getRuntime();
        try {
            runtime.exec(deleteCmd);
        } catch (IOException e) { }
    }
}

上記のコードの使用例:

deleteFiles("/sdcard/uploads/");
于 2011-03-16T07:53:12.513 に答える
16

以下の方法を使用して、ファイルとそのサブディレクトリを含むメイン ディレクトリ全体を削除します。このメソッドをもう一度呼び出した後、メイン ディレクトリの delete() ディレクトリを再度呼び出します。

// For to Delete the directory inside list of files and inner Directory
public static boolean deleteDir(File dir) {
    if (dir.isDirectory()) {
        String[] children = dir.list();
        for (int i=0; i<children.length; i++) {
            boolean success = deleteDir(new File(dir, children[i]));
            if (!success) {
                return false;
            }
        }
    }

    // The directory is now empty so delete it
    return dir.delete();
}
于 2014-10-01T10:46:34.963 に答える
14

あなたのアプローチは、ファイルのみを含むフォルダーには適していますが、サブフォルダーも含むシナリオを探している場合は、再帰が必要です

また、ファイルの削除が許可されていることを確認するために、戻り値の戻り値をキャプチャする必要があります

含む

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

あなたのマニフェストで

void DeleteRecursive(File dir)
{
    Log.d("DeleteRecursive", "DELETEPREVIOUS TOP" + dir.getPath());
    if (dir.isDirectory())
    {
        String[] children = dir.list();
        for (int i = 0; i < children.length; i++)
        {
            File temp = new File(dir, children[i]);
            if (temp.isDirectory())
            {
                Log.d("DeleteRecursive", "Recursive Call" + temp.getPath());
                DeleteRecursive(temp);
            }
            else
            {
                Log.d("DeleteRecursive", "Delete File" + temp.getPath());
                boolean b = temp.delete();
                if (b == false)
                {
                    Log.d("DeleteRecursive", "DELETE FAIL");
                }
            }
        }

    }
    dir.delete();
}
于 2011-02-20T19:35:27.443 に答える
10

答えはたくさんありますが、少し違うので、自分の答えを追加することにしました。それはOOPに基づいています;)

クラスDirectoryCleanerを作成しました。これは、ディレクトリをクリーンアップする必要があるたびに役立ちます。

public class DirectoryCleaner {
    private final File mFile;

    public DirectoryCleaner(File file) {
        mFile = file;
    }

    public void clean() {
        if (null == mFile || !mFile.exists() || !mFile.isDirectory()) return;
        for (File file : mFile.listFiles()) {
            delete(file);
        }
    }

    private void delete(File file) {
        if (file.isDirectory()) {
            for (File child : file.listFiles()) {
                delete(child);
            }
        }
        file.delete();

    }
}

次の方法でこの問題を解決するために使用できます。

File dir = new File(Environment.getExternalStorageDirectory(), "your_directory_name");
new DirectoryCleaner(dir).clean();
dir.delete();
于 2015-02-06T14:39:33.853 に答える
7

再帰的に削除する必要がない場合は、次のようなことを試すことができます。

File file = new File(context.getExternalFilesDir(null), "");
    if (file != null && file.isDirectory()) {
        File[] files = file.listFiles();
        if(files != null) {
            for(File f : files) {   
                f.delete();
            }
        }
    }
于 2011-05-29T07:03:46.557 に答える
5
public static void deleteDirectory( File dir )
{

    if ( dir.isDirectory() )
    {
        String [] children = dir.list();
        for ( int i = 0 ; i < children.length ; i ++ )
        {
         File child =    new File( dir , children[i] );
         if(child.isDirectory()){
             deleteDirectory( child );
             child.delete();
         }else{
             child.delete();

         }
        }
        dir.delete();
    }
}
于 2013-03-21T12:48:04.973 に答える
3
private static void deleteRecursive(File dir)
{
    //Log.d("DeleteRecursive", "DELETEPREVIOUS TOP" + dir.getPath());
    if (dir.isDirectory())
    {
        String[] children = dir.list();
        for (int i = 0; i < children.length; i++)
        {
            File temp = new File(dir, children[i]);
            deleteRecursive(temp);
        }

    }

    if (dir.delete() == false)
    {
        Log.d("DeleteRecursive", "DELETE FAIL");
    }
}
于 2014-01-13T07:28:02.793 に答える
3

最も速くて簡単な方法:

public static boolean deleteFolder(File removableFolder) {
        File[] files = removableFolder.listFiles();
        if (files != null && files.length > 0) {
            for (File file : files) {
                boolean success;
                if (file.isDirectory())
                    success = deleteFolder(file);
                else success = file.delete();
                if (!success) return false;
            }
        }
        return removableFolder.delete();
}
于 2021-02-09T20:21:01.773 に答える
0

私はこれをそのペースで入れましたが、それは任意のディレクトリ構造を持つフォルダーを削除します。

public int removeDirectory(final File folder) {

    if(folder.isDirectory() == true) {
        File[] folderContents = folder.listFiles();
        int deletedFiles = 0;

        if(folderContents.length == 0) {
            if(folder.delete()) {
                deletedFiles++;
                return deletedFiles;
            }
        }
        else if(folderContents.length > 0) {

            do {

                File lastFolder = folder;
                File[] lastFolderContents = lastFolder.listFiles();

                //This while loop finds the deepest path that does not contain any other folders
                do {

                    for(File file : lastFolderContents) {

                        if(file.isDirectory()) {
                            lastFolder = file;
                            lastFolderContents = file.listFiles();
                            break;
                        }
                        else {

                            if(file.delete()) {
                                deletedFiles++;
                            }
                            else {
                                break;
                            }

                        }//End if(file.isDirectory())

                    }//End for(File file : folderContents)

                } while(lastFolder.delete() == false);

                deletedFiles++;
                if(folder.exists() == false) {return deletedFiles;}

            } while(folder.exists());
        }
    }
    else {
        return -1;
    }

    return 0;

}

お役に立てれば。

于 2017-09-07T00:18:55.467 に答える