2014-12-15 3 views
2

확장명이 하나 뿐인 단일 파일 형식을 삭제하는 다음과 같은 해결책이 있습니다. 그러나 나는 예를 들어, 여러 개의 파일 확장자를 통합 할 수있는 방법을 찾기 위해 노력하고있다 : 당신은 배열에서 확장자가 다음 디렉토리에서 모든 파일을 가져와 같은 각 확장 비교할 수 .wma, .mp3, .wav여러 파일 형식의 파일 삭제 C#

DirectoryInfo di = new DirectoryInfo(@"C:\"); 
FileInfo[] files = di.GetFiles("*.mpeg") 
        .Where(p => p.Extension == ".mpeg").ToArray(); 
foreach (FileInfo file in files) 
    try 
    { 
     file.Attributes = FileAttributes.Normal; 
     File.Delete(file.FullName); 
    } 
    catch { } 

답변

10

"확장명이 설정되어있는 위치"로 변경하고 GetFiles 호출에서 패턴을 제거하는 것만 큼 문제가됩니다. 또한이 ToArray()를 호출 할 필요는 없습니다 - 바로 결과를 반복 :

var extensions = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase) 
    { ".wma", ".mp3", ".wav" }; 

var files = new DirectoryInfo(@"c:\").GetFiles() 
            .Where(p => extensions.Contains(p.Extension)); 
foreach (var file in files) 
{ 
    // try/catch if you really need, but I'd recommend catching a more 
    // specific exception 
    file.Attributes = FileAttributes.Normal; 
    File.Delete(file.FullName);  
} 
+0

고맙습니다.이 질문은 파일 복사에 적용될 수 있습니까? – dames

+0

@dames : 파일 이름을 선택하는 것뿐입니다. 당신이 그들과 함께하는 일은 당신에게 달려 있습니다. –

+0

음, 파일을 선택하여 특정 위치로 옮기고 싶습니다. 그러나 모든 형식을 통합하는이 접근법에서 수행하십시오. – dames

4

:

를 당신은 대소 문자를 구분 비교를하려면
string[] fileExtensions = new[] { ".wma", ".mp3", ".wave" }; 
DirectoryInfo di = new DirectoryInfo(@"C:\"); 
FileInfo[] files = di.GetFiles() 
        .Where(p => fileExtensions.Contains(p.Extension)).ToArray(); 

후 사용

FileInfo[] files = di.GetFiles() 
        .Where(p => fileExtensions.Contains 
        (p.Extension, StringComparer.InvariantCultureIgnoreCase)).ToArray(); 
5

당신은 모두를 저장할 수 있습니다 컬렉션의 확장을 빚 및 사용 Enumerable.Contains : 그 전에 아마 (DirectoryInfo.GetFiles으로) 메모리에있는 모든 파일 이름을로드 할 필요가 없기 때문에이 경우에 더 효율적이다 내가 DirectoryInfo.EnumerateFiles을 사용했습니다

string[] allowedExtensions = { ".mpeg", ".wma", ".mp3", ".wave" }; 
FileInfo[] files = di.EnumerateFiles() 
.Where(p => allowedExtensions.Contains(p.Extension, StringComparer.InvariantCultureIgnoreCase)) 
.ToArray(); 

주 처리를 시작할 수 있습니다. StringComparer.InvariantCultureIgnoreCase은 자체 설명해야합니다.

+0

나는 그것이하지만 반환하기 전에 메모리에있는 GetFiles로드 모든 파일을 말하는 줄 알았는데 것을 지적 할 필요가 펠트 파일 이름 만 반환합니다. – Sam

0
di.GetFiles().Where(
    p => p.Extension == ".mpeg" || 
    p.Extension == ".mp3" || 
    p.Extension == ".wave");