2011-02-12 3 views
1

디렉토리 내에있는 모든 이미지가있는 문자열 배열을 채우고 싶습니다. 지금은 JPG 형식Directory.GetAllImageFiles 어떻게해야합니까?

Dim List() as string = Directory.GetFiles(Path, "*.jpg") 

으로 모든 이미지를 얻기 위해 다음 사용까지

지금은 그것을 확장하고 모든 이미지 포맷을 좀하고 싶습니다.

"ImageFormat 열거 형"과 결합 된 directory.GetFiles를 사용할 수 있습니까?

+0

가 쉬운 옵션이 없습니다 :

string[] files = Directory.GetFiles(folderPath); foreach(string file in files) { System.Drawing.Image img = null; try { img = System.Drawing.Image.FromFile(file); } catch { // do nothing } if (img != null) { // did something img.Dispose(); } } 

내가 파일을 처리하기 전에,이 파일이 처리되는 제한하는 기능을 사용하여 한 조각 ... 를 잊어 버렸 밝혀졌습니다. 'ImageFormat'에는 확장 기능이 없습니다. 그것들을 정적 배열이나 사전에 하드 코딩해야합니다. – Andrey

답변

1

안녕 당신은 내가 http://msdn.microsoft.com/en-us/library/wz42302f.aspx에서 커뮤니티 콘텐츠로 발견 된이를 사용할 수 있습니다.

private static string[] GetFiles(string sourceFolder, string filters) 
{ 
    return filters.Split('|').SelectMany(filter => System.IO.Directory.GetFiles(sourceFolder, filter)).ToArray(); 
} 

게으른 평가를 사용하는 대안 (닷넷 4.0 만) :

private static IEnumerable<string> GetFiles(string sourceFolder, string filters) 
{ 
    return filters.Split('|').SelectMany(filter => System.IO.Directory.EnumerateFiles(sourceFolder, filter)); 
} 

당신은 그것을 사용할 수 있습니다 GetFiles("dir", "*.jpg|*.gif|*.jpeg|*.bmp|*.png")입니다. 그것은 본질적으로 각 필터에 대한 검색이므로 이 아닌만큼 효율적입니다.

마지막 버전입니다 (단 닷넷 4.0이지만 2.0 솔루션을 최소로 할 수있다) :

private static IEnumerable<string> GetImageFiles(string sourceFolder) 
{ 
    return from file in System.IO.Directory.EnumerateFiles(sourceFolder) 
      let extension = Path.GetExtension(file) 
      where extension == ".jpg" || extension == ".gif" || extension == ".png" 
      select file; 
} 

는 나는 한 번만 루프 때문에 마지막 하나는 빠른 믿습니다. 그러나 이는 패턴 검색이 Directory에 구현되는 방식과 OS 검색 방법에 따라 다릅니다. 내가하지 않은 성능 테스트가 필요합니다.

+0

더 빠른 것은 저장 장치의 종류에 달려 있습니다. 대부분의 파일을 필터링하면 낮은 대역폭의 네트워크에서 여러 검색이 더 빠를 수 있지만 로컬 하드 디스크에서는 단일 검색이 더 빠르다는 이미지를 만들 수 있습니다. – CodesInChaos

+0

@CodeInChaos 그래, 그것은 사물의 범위에 달려 있습니다. 패턴이있는'GetFiles'가 Windows Vista/7의 색인을 사용하거나 파일 트리가 접미사 trie와 같은 패턴 일치를 지원하면 호출을 여러 번하더라도 필터를 제공하는 것이 매우 빠를 수 있습니다. –

0

이것은 .net 솔루션입니다.

나는 C#에서 비슷한 것을했다. 이 솔루션은 처리 할 이미지의 드롭 오프 지점으로 폴더를 사용했습니다. 각 유형의 파일을 이미지로로드하는 것은 모든 경우에 올바른 해결책이 아니지만 각 파일을로드 가능한 이미지로 확인하려고합니다.

private bool IsImage(FileInfo file) 
{ 
    bool imageFile = false; 
    if ((file.Extension.ToLower() ==".jpg")|| 
     (file.Extension.ToLower() ==".gif")|| 
     (file.Extension.ToLower() == ".bmp") || 
     (file.Extension.ToLower() ==".png")) 
    { 
     imageFile = true; 
    } 

    return imageFile; 
} 
관련 문제