2014-12-22 7 views
9

메모리 스트림의 C# 등의 이온 우편을 읽기 항목 파일 이름을 기반으로 항목. 어떻게해야합니까? 나는이 방법으로 메모리 스트림에 ZipFile에 압축을 풉니 다 Ionic.Zip을 사용하고

나는 아래의 코드를 호출하여 시도했지만 나는 말했다 ZipFile.Read(ms)에 오류가 발생합니다 :

Stream ms = GetReplayZipMemoryStream(); 
using (ZipFile zip = ZipFile.Read(ms)) 
{ 
    ZipEntry imageEntry = zip.Entries.First(x => x.FileName.EndsWith(".png")); 
    using (Stream s = imageEntry.OpenReader()) 
    { 
     var image = Image.FromStream(s); 
     pictureBox1.Image = image; 
    } 
} 

가 사전에 감사 ZipFile를 같은 것을 읽을 수 없습니다 도움!

+5

같은 컬렉션을하고 파일 이름을 바이트로 파일을받을 짓을 한 (mem 스트림에서) 더 이상 압축되지 않습니다. 연결된 압축되지 않은 파일이 있습니다. –

+0

Henk Holterman은 중첩 된 zip 파일을 다루지 않는 한 두 번째 조각에서 파일을 한 번 더 압축 해제하면 안됩니다. 압축을 풀려는 파일의 샘플 구조를 제공 할 수 있습니까? 또는 첫 번째 루프에서 모든 필터링을 수행하고 독서하려는 모든 파일을 단일 스트림으로 작성하지 않기 위해 이미지를 만들 수도 있습니다. –

+2

Henk이 만든 관찰 외에도 Ionic을 사용하지 말 것을 제안합니다. 어쨌든이 작업을 수행하려면 Zip을 사용하십시오. .NET은 이제 .zip 파일을 처리 할 수있는 내장 기능을 제공하는'ZipArchive' 클래스를 가지고 있습니다. 그리고 어떤 IMHO가 지금 가지고있는 코드보다 더 편리합니다. –

답변

0

@HenkHolerman이 맞습니다. 그 시점에서 더 이상 zip 파일이 없습니다. zip 파일의 내용을 임시 디렉토리로 추출한 다음 파일 시스템을 통해 이미지 파일을 조작하는 것이 좋습니다.

11

이 조금 오래된 질문 늦은 대답을 할 수 있지만 .Extract()``데이터를 완료 한 후 나는이

public static Dictionary<string, byte[]> Decompress(Stream targFileStream) 
{ 
    Dictionary<string, byte[]> files = new Dictionary<string, byte[]>(); 

    using(ZipFile z = ZipFile.Read(targFileStream)) 
    { 
     foreach (ZipEntry zEntry in z) 
     { 
      MemoryStream tempS = new MemoryStream(); 
      zEntry.Extract(tempS); 

      files.Add(zEntry.FileName, tempS.ToArray()); 
     } 
    } 

    return files; 
} 
+0

감사합니다. 나는 이것을 찾고 있었다. 나는 다른 가상 Extract() 함수를 보지 않았다. –