2009-04-09 2 views
17

내 TCP 클라이언트가 패킷 내 이미지를 수신합니다. 이미지는 zlib로 압축됩니다.이 작업은 이미지 압축을 풀고 양식에 저장하는 것입니다.C# NET 3.5의 바이트 []에서 파일 저장

압축 된 이미지를 현재 디렉토리에 저장하고 압축을 풀고 양식에 압축 해제 된 파일을로드 할 계획입니다.

첫 번째 문제는 (압축 된) 파일을 저장하는 것입니다. zlib은 압축 해제하여 저장할 수 있습니다.

아래의 코드는 압축 파일을로드하고 압축 해제 후 저장합니다.

private void decompressFile(string inFile, string outFile) 
    { 
     System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create); 
     zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream); 
     System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open);   
     try 
     { 
      CopyStream(inFileStream, outZStream); 
     } 
     finally 
     { 
      outZStream.Close(); 
      outFileStream.Close(); 
      inFileStream.Close(); 
     } 
    } 

    public static void CopyStream(System.IO.Stream input, System.IO.Stream output) 
    { 
     byte[] buffer = new byte[2000]; 
     int len; 
     while ((len = input.Read(buffer, 0, 2000)) > 0) 
     { 
      output.Write(buffer, 0, len); 
     } 
     output.Flush(); 
    } 

바이트 [] 배열을 해당 함수에 직접 전달하는 방법은 무엇입니까? 압축 된 파일로 저장하고 압축 된 파일의 위치로 함수를 호출 할 계획이지만 바이트 [] 배열에서 파일을 저장하는 방법이나 바이트 []를 전달하는 방법을 알지 못합니다. 배열을 입력 파일로 사용하십시오.

도움이 될 것입니다.

감사합니다.

+0

? CopyStream 함수에? –

+0

또한 에서 ((len = input.Read (buffer, 0, 2000))> 0) { output.Write (buffer, 0, len); } 버퍼를 쓰려는 위치를 다시 조정할 필요가 없습니까? 항상 위치 0에서 쓰려고합니다. –

+1

CopyStream 함수는 정확합니다. 여분의 매개 변수는 버퍼에서 복사 할 위치를 제어합니다. 그러나 우리는 항상 루프를 통해 매번 버퍼의 위치 0부터 시작하여 복사합니다. 결과적으로, 우리는 항상 버퍼의 위치 0부터 시작하여 출력에 쓰려고합니다. – Yuliy

답변

79

static void System.IO.File.WriteAllBytes (string path, byte [] bytes) 메서드를 사용하십시오.

byte[] buffer = new byte[200]; 
File.WriteAllBytes(@"c:\data.dmp", buffer); 
+3

문자를 이스케이프하는 것을 잊었습니다;). 매개 변수는 @ "c : \ data.dmp"또는 "c : \\ data.dmp"이어야합니다. –

+0

인코딩은 어떻게됩니까? 샘플의 경우 파일 (ANSI, UTF-8)을 bytearray로 읽은 다음 새 파일 이름 – Kiquenet

+3

와우를 작성하십시오. 왜 항상 그렇게 쉬울 수 없습니까? +1 – cbmeeks

1

받은 바이트 배열을 MemoryStream에 고정시키고 임시 파일을 사용하지 않고 즉석에서 압축/압축 해제하십시오.

5
public static void SaveFile(this Byte[] fileBytes, string fileName) 
{ 
    FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite); 
    fileStream.Write(fileBytes, 0, fileBytes.Length); 
    fileStream.Close(); 
} 
0

당신이 코드를 다른 사람이 이미 언급 한 것 외에도

private void t1() 
    { 
     FileStream f1 = new FileStream("C:\\myfile1.txt", FileMode.Open); 
     int length = Convert.ToInt16(f1.Length); 
     Byte[] b1 = new Byte[length]; 
     f1.Read(b1, 0, length); 
     File.WriteAllBytes("C:\\myfile.txt",b1); 
     f1.Dispose(); 
    } 
+0

FileStream을 삭제하는 것을 잊어 버리고 있습니다. – Noldorin

+2

Anirudh, 대신 'using'문을 사용하는 데 익숙해 져야합니다. 위의 에리히의 대답을 참조하십시오. –

3

을 시도 할 수 있습니다, 또한 모든 객체는 IDisposable을 구현하기 때문에 당신이 절을 '사용'사용하는 것이 좋습니다 것입니다.

using(FileStream outFileStream = new ...) 
using(ZOutputStream outZStream = new ...) 
using(FileStream inFileStream = new ...) 
{ 
    CopyStream(inFileStream, outZStream); 
} 
당신이 바이트 []를 전달하려는 곳으로 내가 이해하지 못했다
관련 문제