전체 폴더와 내용을 삭제하는 방법?
응용 프로그램 사용자가 DCIM 폴더 (SD 카드에 있고 하위 폴더가 있음)를 삭제할 수 있기를 원합니다.
그렇다면 어떻게 가능합니까?
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();
}
}
다음과 같이 파일과 폴더를 재귀 적으로 삭제할 수 있습니다.
void deleteRecursive(File fileOrDirectory) {
if (fileOrDirectory.isDirectory())
for (File child : fileOrDirectory.listFiles())
deleteRecursive(child);
fileOrDirectory.delete();
}
명령 줄 인수를 사용하여 전체 폴더와 내용을 삭제할 수 있습니다.
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/");
Kotlin에서는 패키지 deleteRecursively()
에서 확장을 사용할 수 있습니다kotlin.io
val someDir = File("/path/to/dir")
someDir.deleteRecursively()
파일 만 포함 된 폴더에 대해서는 접근 방식이 적절하지만 하위 폴더가 포함 된 시나리오를 찾으려면 재귀가 필요합니다.
또한 반환 값을 캡처하여 파일을 삭제할 수 있는지 확인해야합니다.
포함
<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();
}
아래 방법을 사용하여 파일과 하위 디렉토리가 포함 된 전체 기본 디렉토리를 삭제하십시오. 이 메소드를 다시 한 번 호출 한 후 기본 디렉토리의 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();
}
재귀 적으로 물건을 삭제할 필요가 없다면 다음과 같이 시도하십시오.
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();
}
}
}
많은 답변이 있지만 조금 다르기 때문에 직접 추가하기로 결정했습니다. 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();
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();
}
}
android.os.FileUtils 참조, API 21에 숨겨져 있음
public static boolean deleteContents(File dir) {
File[] files = dir.listFiles();
boolean success = true;
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
success &= deleteContents(file);
}
if (!file.delete()) {
Log.w("Failed to delete " + file);
success = false;
}
}
}
return success;
}
이것은 내가하는 일입니다 ... (간결하고 테스트 됨)
...
deleteDir(new File(dir_to_be_deleted));
...
// delete directory and contents
void deleteDir(File file) {
if (file.isDirectory())
for (String child : file.list())
deleteDir(new File(file, child));
file.delete(); // delete child file or empty directory
}
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");
}
}
Java에 서브 디렉토리 나 파일이 있으면 디렉토리를 삭제할 수 없습니다. 이 두 줄 간단한 솔루션을 사용해보십시오. 디렉토리 안의 디렉토리와 컨테스트가 삭제됩니다.
File dirName = new File("directory path");
FileUtils.deleteDirectory(dirName);
gradle 파일 에이 줄을 추가하고 프로젝트를 동기화하십시오.
compile 'org.apache.commons:commons-io:1.3.2'
디렉토리에서 모든 파일을 삭제하는 간단한 방법 :
호출만으로 디렉토리에서 모든 이미지를 삭제하는 일반적인 기능입니다
deleteAllImageFile (컨텍스트);
public static void deleteAllFile(Context context) {
File directory = context.getExternalFilesDir(null);
if (directory.isDirectory()) {
for (String fileName: file.list()) {
new File(file,fileName).delete();
}
}
}
내가 아는 가장 안전한 코드 :
private boolean recursiveRemove(File file) {
if(file == null || !file.exists()) {
return false;
}
if(file.isDirectory()) {
File[] list = file.listFiles();
if(list != null) {
for(File item : list) {
recursiveRemove(item);
}
}
}
if(file.exists()) {
file.delete();
}
return !file.exists();
}
파일이 있는지 확인하고 널을 처리하며 디렉토리가 실제로 삭제되었는지 확인
설명서 에 따르면 :
이 추상 경로명이 디렉토리를 나타내지 않는 경우,이 메소드는 null를 돌려줍니다.
그래서 만약 당신이 확인해야 listFiles
하다 null
와 그렇지 않은 경우에만 계속
boolean deleteDirectory(File path) {
if(path.exists()) {
File[] files = path.listFiles();
if (files == null) {
return false;
}
for (File file : files) {
if (file.isDirectory()) {
deleteDirectory(file);
} else {
boolean wasSuccessful = file.delete();
if (wasSuccessful) {
Log.i("Deleted ", "successfully");
}
}
}
}
return(path.delete());
}
재미를 위해 비 재귀 구현이 있습니다.
/**
* Deletes the given folder and all its files / subfolders.
* Is not implemented in a recursive way. The "Recursively" in the name stems from the filesystem command
* @param root The folder to delete recursively
*/
public static void deleteRecursively(final File root) {
LinkedList<File> deletionQueue = new LinkedList<>();
deletionQueue.add(root);
while(!deletionQueue.isEmpty()) {
final File toDelete = deletionQueue.removeFirst();
final File[] children = toDelete.listFiles();
if(children == null || children.length == 0) {
// This is either a file or an empty directory -> deletion possible
toDelete.delete();
} else {
// Add the children before the folder because they have to be deleted first
deletionQueue.addAll(Arrays.asList(children));
// Add the folder again because we can't delete it yet.
deletionQueue.addLast(toDelete);
}
}
}
나는 이것의 속도에 걸렸지 만 디렉토리 구조가있는 폴더를 삭제합니다.
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;
}
도움이 되었기를 바랍니다.
//To delete all the files of a specific folder & subfolder
public static void deleteFiles(File directory, Context c) {
try {
for (File file : directory.listFiles()) {
if (file.isFile()) {
final ContentResolver contentResolver = c.getContentResolver();
String canonicalPath;
try {
canonicalPath = file.getCanonicalPath();
} catch (IOException e) {
canonicalPath = file.getAbsolutePath();
}
final Uri uri = MediaStore.Files.getContentUri("external");
final int result = contentResolver.delete(uri,
MediaStore.Files.FileColumns.DATA + "=?", new String[]{canonicalPath});
if (result == 0) {
final String absolutePath = file.getAbsolutePath();
if (!absolutePath.equals(canonicalPath)) {
contentResolver.delete(uri,
MediaStore.Files.FileColumns.DATA + "=?", new String[]{absolutePath});
}
}
if (file.exists()) {
file.delete();
if (file.exists()) {
try {
file.getCanonicalFile().delete();
} catch (IOException e) {
e.printStackTrace();
}
if (file.exists()) {
c.deleteFile(file.getName());
}
}
}
} else
deleteFiles(file, c);
}
} catch (Exception e) {
}
}
여기도 해결책입니다. 갤러리도 새로 고칩니다.
그것을 해결하는 또 다른 (현대적인) 방법.
public class FileUtils {
public static void delete(File fileOrDirectory) {
if(fileOrDirectory != null && fileOrDirectory.exists()) {
if(fileOrDirectory.isDirectory() && fileOrDirectory.listFiles() != null) {
Arrays.stream(fileOrDirectory.listFiles())
.forEach(FileUtils::delete);
}
fileOrDirectory.delete();
}
}
}
API 26 이후 Android에서
public class FileUtils {
public static void delete(File fileOrDirectory) {
if(fileOrDirectory != null) {
delete(fileOrDirectory.toPath());
}
}
public static void delete(Path path) {
try {
if(Files.exists(path)) {
Files.walk(path)
.sorted(Comparator.reverseOrder())
.map(Path::toFile)
// .peek(System.out::println)
.forEach(File::delete);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
폴더에서 버튼과 폴더 안의 모든 항목을 삭제하십시오.
my_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File folder_path = new File(Environment.getExternalStorageDirectory() + "/your_folder_name/");
if (file.exists()) {
String deleteCmd = "rm -r " + folder_path;
Runtime runtime = Runtime.getRuntime();
try {
runtime.exec(deleteCmd);
} catch (IOException ignored) {
}
}
}
});
짧은 콜틴 버전
fun File.deleteDirectory(): Boolean {
return if (exists()) {
listFiles()?.forEach {
if (it.isDirectory) {
it.deleteDirectory()
} else {
it.delete()
}
}
delete()
} else false
}
참고 URL : https://stackoverflow.com/questions/4943629/how-to-delete-a-whole-folder-and-content
'IT story' 카테고리의 다른 글
선행 0으로 Java 문자열을 형식화하는 방법은 무엇입니까? (0) | 2020.05.29 |
---|---|
Mac OSX Lion에서 PostgreSQL 9.0.4를 완전히 제거 하시겠습니까? (0) | 2020.05.29 |
톰캣 VS 부두 (0) | 2020.05.29 |
Android 및 XMPP : 현재 사용 가능한 솔루션 (0) | 2020.05.29 |
REST 웹 서비스에서 일괄 작업을 처리하기위한 패턴? (0) | 2020.05.29 |