압축 파일을 열었는데 갑자기 바탕화면에 모든 파일이 풀려버렸어요. 하나하나 지우다가 파일 개수를 확인하니 2,000개가 넘는다는 것을 확인하였습니다. 이 파일을 모두 지워버리고 싶은데, 문제는 기존에 바탕화면에 있었던 파일이나 폴더는 놔두고 지우고 싶습니다. 그리하여 간단한 소스코드를 안내해드릴게요.
네임스페이스는 namespace Microsoft.VisualBasic.FileIO 을 사용하였습니다. 그리고 사용할 수 있는 메서드는 다음과 같은데 필요에 따라 선택하세요.
public static void DeleteDirectory(string directory, UIOption showUI, RecycleOption recycle, UICancelOption onUserCancel);
//
// 요약:
// 디렉터리를 삭제합니다.
//
// 매개 변수:
// directory:
// 삭제할 디렉터리입니다.
//
// showUI:
// 작업 진행을 시각적으로 추적할지 여부를 지정합니다. 기본값은 UIOption.OnlyErrorDialogs입니다.
//
// recycle:
// 삭제한 파일을 휴지통으로 보낼지 여부를 지정합니다. 기본값은 RecycleOption.DeletePermanently입니다.
//
// 예외:
// T:System.ArgumentException:
// 경로가 길이가 0인 문자열이거나, 형식이 잘못되었거나, 공백만 포함하거나, 와일드카드 문자를 비롯한 잘못된 문자를 포함하는 경우 경로가 \\.\로
// 시작하는 디바이스 경로인 경우
//
// T:System.ArgumentNullException:
// directory이 Nothing 또는 빈 문자열인 경우
//
// T:System.IO.DirectoryNotFoundException:
// 디렉터리가 없거나 파일인 경우
//
// T:System.IO.IOException:
// 디렉터리나 하위 디렉터리의 파일이 사용되고 있는 경우
//
// T:System.NotSupportedException:
// 디렉터리 이름에 콜론(:)이 포함됩니다.
//
// T:System.IO.PathTooLongException:
// 경로가 시스템 정의 최대 길이를 초과하는 경우
//
// T:System.Security.SecurityException:
// 사용자에게 필요한 권한이 없는 경우
//
// T:System.OperationCanceledException:
// 사용자가 작업을 취소했거나 디렉터리를 삭제할 수 없는 경우
public static void DeleteDirectory(string directory, UIOption showUI, RecycleOption recycle);
//
// 요약:
// 디렉터리를 삭제합니다.
//
// 매개 변수:
// directory:
// 삭제할 디렉터리입니다.
//
// onDirectoryNotEmpty:
// 삭제될 디렉터리에 파일이나 디렉터리가 포함된 경우 수행해야 하는 작업을 지정합니다. 기본값은 DeleteDirectoryOption.DeleteAllContents입니다.
//
// 예외:
// T:System.ArgumentException:
// 경로가 길이가 0인 문자열이거나, 형식이 잘못되었거나, 공백만 포함하거나, 와일드카드 문자를 비롯한 잘못된 문자를 포함하는 경우 경로가 \\.\로
// 시작하는 디바이스 경로인 경우
//
// T:System.ArgumentNullException:
// directory이 Nothing 또는 빈 문자열인 경우
//
// T:System.IO.DirectoryNotFoundException:
// 디렉터리가 없거나 파일인 경우
//
// T:System.IO.IOException:
// 디렉터리나 하위 디렉터리의 파일이 사용되고 있는 경우
//
// T:System.NotSupportedException:
// 디렉터리 이름에 콜론(:)이 포함됩니다.
//
// T:System.IO.PathTooLongException:
// 경로가 시스템 정의 최대 길이를 초과하는 경우
//
// T:System.Security.SecurityException:
// 사용자에게 필요한 권한이 없는 경우
//
// T:System.OperationCanceledException:
// 사용자가 작업을 취소했거나 디렉터리를 삭제할 수 없는 경우
public static void DeleteDirectory(string directory, DeleteDirectoryOption onDirectoryNotEmpty);
//
// 요약:
// 파일을 삭제합니다.
//
// 매개 변수:
// file:
// 삭제할 파일의 이름과 경로입니다.
//
// showUI:
// 작업 진행을 시각적으로 추적할지 여부입니다. 기본값은 UIOption.OnlyErrorDialogs입니다.
//
// recycle:
// 삭제한 파일을 휴지통으로 보낼지 여부입니다. 기본값은 RecycleOption.DeletePermanently입니다.
//
// onUserCancel:
// 사용자가 작업을 취소하는 경우 예외를 throw할지 여부를 지정합니다. 기본값은 UICancelOption.ThrowException입니다.
//
// 예외:
// T:System.ArgumentException:
// 길이가 0인 문자열이거나, 공백만 포함하거나, 잘못된 문자를 포함하거나, 파일을 지정해야 하는 경로 마지막에 슬래시가 있거나, \\.\로
// 시작하는 디바이스 경로와 같은 여러 가지 이유 중 하나로 경로가 올바르지 않은 경우
//
// T:System.ArgumentNullException:
// file이 Nothing 또는 빈 문자열인 경우
//
// T:System.IO.PathTooLongException:
// 경로가 시스템 정의 최대 길이를 초과하는 경우
//
// T:System.NotSupportedException:
// 경로의 파일 이름이나 디렉터리 이름에 콜론(:)이 있거나 이름의 형식이 잘못된 경우
//
// T:System.IO.IOException:
// 파일이 사용 중인 경우
//
// T:System.Security.SecurityException:
// 경로를 보는 데 필요한 권한이 사용자에게 없는 경우
//
// T:System.IO.FileNotFoundException:
// 파일이 없습니다.
//
// T:System.UnauthorizedAccessException:
// 사용자에게 파일을 삭제할 권한이 없거나 파일이 읽기 전용인 경우
//
// T:System.OperationCanceledException:
// 사용자가 작업을 취소했고 onUserCancel이 Microsoft.VisualBasic.FileIO.UICancelOption.ThrowException으로
// 설정된 경우
public static void DeleteFile(string file, UIOption showUI, RecycleOption recycle, UICancelOption onUserCancel);
//
// 요약:
// 파일을 삭제합니다.
//
// 매개 변수:
// file:
// 삭제할 파일의 이름과 경로입니다.
//
// showUI:
// 작업 진행을 시각적으로 추적할지 여부입니다. 기본값은 UIOption.OnlyErrorDialogs입니다.
//
// recycle:
// 삭제한 파일을 휴지통으로 보낼지 여부입니다. 기본값은 RecycleOption.DeletePermanently입니다.
//
// 예외:
// T:System.ArgumentException:
// 길이가 0인 문자열이거나, 공백만 포함하거나, 잘못된 문자를 포함하거나, 파일을 지정해야 하는 경로 마지막에 슬래시가 있거나, \\.\로
// 시작하는 디바이스 경로와 같은 여러 가지 이유 중 하나로 경로가 올바르지 않은 경우
//
// T:System.ArgumentNullException:
// file이 Nothing 또는 빈 문자열인 경우
//
// T:System.IO.PathTooLongException:
// 경로가 시스템 정의 최대 길이를 초과하는 경우
//
// T:System.NotSupportedException:
// 경로의 파일 이름이나 디렉터리 이름에 콜론(:)이 있거나 이름의 형식이 잘못된 경우
//
// T:System.IO.IOException:
// 파일이 사용 중인 경우
//
// T:System.Security.SecurityException:
// 경로를 보는 데 필요한 권한이 사용자에게 없는 경우
//
// T:System.IO.FileNotFoundException:
// 파일이 없습니다.
//
// T:System.UnauthorizedAccessException:
// 사용자에게 파일을 삭제할 권한이 없거나 파일이 읽기 전용인 경우
public static void DeleteFile(string file, UIOption showUI, RecycleOption recycle);
//
// 요약:
// 파일을 삭제합니다.
//
// 매개 변수:
// file:
// 삭제할 파일의 이름과 경로입니다.
//
// 예외:
// T:System.ArgumentException:
// 길이가 0인 문자열이거나, 공백만 포함하거나, 잘못된 문자를 포함하거나, 파일을 지정해야 하는 경로 마지막에 슬래시가 있거나, \\.\로
// 시작하는 디바이스 경로와 같은 여러 가지 이유 중 하나로 경로가 올바르지 않은 경우
//
// T:System.ArgumentNullException:
// file이 Nothing 또는 빈 문자열인 경우
//
// T:System.IO.PathTooLongException:
// 경로가 시스템 정의 최대 길이를 초과하는 경우
//
// T:System.NotSupportedException:
// 경로의 파일 이름이나 디렉터리 이름에 콜론(:)이 있거나 이름의 형식이 잘못된 경우
//
// T:System.IO.IOException:
// 파일이 사용 중인 경우
//
// T:System.Security.SecurityException:
// 경로를 보는 데 필요한 권한이 사용자에게 없는 경우
//
// T:System.IO.FileNotFoundException:
// 파일이 없습니다.
//
// T:System.UnauthorizedAccessException:
// 사용자에게 파일을 삭제할 권한이 없거나 파일이 읽기 전용인 경우
public static void DeleteFile(string file);
다음과 같은 코드를 작성하였습니다. 처음에는 휴지통으로 옮기고 파일을 확인하고 지웠는데, 확인하는 시간도 아까워서 영구적인 삭제를 진행하였습니다. 리스트에 별도로 담은 이유는 혹시라도 파일을 잘못 삭제할까봐 확인차원이랍니다. 바탕화면에 있는 모든 파일을 확인하여 특정 조건에 맞는 경우 리스트에 할당하여, 리스트를 확인하고 지워버리는 예제입니다.
void BeomSang()
{
List<string> list = new List<string>();
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
string[] files = Directory.GetFiles(desktopPath, "*.*", System.IO.SearchOption.TopDirectoryOnly);
foreach (string s in files)
{
if (Regex.IsMatch(s, @"^" + desktopPath.Replace(@"\", @"\\") + @"\\PIC.{4}\.png$"))
{
list.Add(s);
//FileSystem.DeleteFile(s, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin);
//FileSystem.DeleteFile(s, UIOption.OnlyErrorDialogs, RecycleOption.DeletePermanently);
}
}
foreach (string s in list)
{
FileSystem.DeleteFile(s, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin);
}
}