2013-03-08 3 views
4

바이트 배열이 있고 바이트 배열을 FileStream으로 읽고 싶습니다. 아래의 코드 내 샘플입니다 : 위의 방법에서바이트 배열을 FileStream으로 읽는 방법

string fileName = "test.txt"; 
byte[] file = File.ReadAllBytes(Server.MapPath("~/Files/" + fileName)); 
FileStream fs = new FileStream(); 
fs.ReadByte(file); 
object obj = LoadFile<object>(fs); 

public static T LoadFile<T>(FileStream fs) 
{ 
    using (GZipStream gzip = new GZipStream(fs, CompressionMode.Decompress)) 
    { 
     BinaryFormatter bf = new BinaryFormatter(); 
     return (T)bf.Deserialize(gzip); 
    } 
} 

, 나는 바이트 배열을 읽기를 사용하여 FileStream을 가지고 있지만 불운 fs.ReadByte는 바이트 배열을 읽을 수 없습니다. 어떤 도움이 바이트 배열을 "LoadFile"메서드에서 매개 변수로 사용하기 위해 FileStream으로 읽는 방법에 중점을 두십시오. 여기 File이 데이터베이스 나 다른 소스 같은 다른 곳에서로드 되었기 때문에 파일을 FileStream으로 직접 읽지 마십시오.

+0

왜 FileStream 대신 MemoryStream을 사용하지 않습니까? – Tomtom

+0

MemoryStream은 LoadFile 메서드에서 FileStream으로 사용할 수 있습니까? –

+0

코드를 컴파일하는 'FileStream'은 constuctor에서 0 개의 인수를 취하지 않습니다. –

답변

8
string fileName = "test.txt"; 
byte[] file = File.ReadAllBytes(Server.MapPath("~/Files/" + fileName)); 
MemoryStream memStream = new MemoryStream(); 
BinaryFormatter binForm = new BinaryFormatter(); 
memStream.Write(file, 0, file.Length); 
memStream.Seek(0, SeekOrigin.Begin); 
Object obj = (Object)binForm.Deserialize(memStream); 
+0

귀하의 메서드는 memStream을 사용하고 있지만 귀하의 코드에서 오류가 발생했습니다. "입력 스트림은 유효한 이진 형식이 아닙니다. 시작 내용 (바이트 단위)은 다음과 같습니다. 1F-8B-08-00-00-00-00-00-04-00-ED-BD-07- 60-1C-49-96 "때 개체에서 실행 obj = (Object) binForm.Deserialize (memStream); –

+0

현재이 코드를 사용하여 파일을 가져옵니다. 'byte [] file; using (var reader = new BinaryReader (stream)) { using (var reader = new BinaryReader (stream)) using (var 스트림 = 새 FileStream 서버 파일 경로, FileMode.Open, FileAccess.Read) = reader.ReadBytes ((int) stream.Length); } }' –

+0

파일이 압축 된 경우 (이것은'GZipStream'을 사용하기 때문에 발생한다고 생각됩니다), 그러면 이것이 작동하지 않는 것일 수 있습니다. – juharr

0

FileStream을 사용하기 전에 File.ReadAllBytes을 실행합니까?

string fileName = "test.txt"; 
using(FileStream fs = new FileStream(Server.MapPath("~/Files/" + fileName), FileMode.Open, FileAccess.Read)) 
{ 
    object obj = LoadFile<object>(fs); 
    fs.Close(); 
} 
+0

제 질문에, 바이트 배열이 서버의 파일에서 읽지 않는다고 언급했습니다. 그것은 데이터베이스 또는 다른 소스에서 가져온 그냥 바이트 배열입니다. 따라서 FileStream으로 직접 파일을 읽지 마십시오. –

+0

왜'FileStream에 파일을 직접 읽어서는 안되니? ' 디스크의 파일을 읽으려면'Server.MapPath ("~/Files /"+ fileName)'을 사용하고 있습니다. 디스크의 파일을 읽지 않으려는 경우 FileStream을 사용하지 마십시오. –

+0

맞아. 바이트 배열 만 있고 모든 파일에서로드되지 않습니다. 그래서 이걸로 나를 도울 수 있니? "LoadFile"메서드에는 FileStream이 필요하므로 데이터베이스의 바이트 배열 만 있습니다. 그래서 어떻게 내 "LoadFile"메서드에 사용할 수 있습니까? –

5

오해가 어디에 있는지 잘 모르겠습니다. FileStream은 디스크의 파일을 나타냅니다. 디스크에 쓰지 않고도 "바이트를 읽을 수 없습니다"그리고 디스크에서 읽지 않으면 읽을 수 없습니다.

아마 원하는 내용은 임의의 내용을 포함 할 수있는 MemoryStream입니다.

두 스트림에서 파생됩니다.

+0

예. 나는 FileStream이 바이트를 직접 읽을 수 없다고 말했다. MemoryStream에 Byte Array가 포함될 수 있다면 어떻게하면 "LoadFile"메서드에 사용할 수 있습니까? –

+1

'Load'를'Stream'으로 바꾸거나'byte' 배열을 파일에 쓰고 그로부터'FileStream'을 만듭니다. – juharr

+0

둘 다 Stream에서 파생되므로 * 모든 스트림을 전달할 수 있습니다.상속의 유용성을 경험하려고합니다 :) – usr

0

예! 이제 더 많은 연구를 한 후에 좋은 해결책을 얻었습니다. 필자는 "바이트 배열을 FileStream에 읽는 법"을 게시했습니다. 바이트 배열을 FileStream으로 읽어 들일 수는 없지만, 드라이버에서 바이트 배열로 파일을 읽는 데만 사용됩니다. 그래서 코드에 약간의 변화가 생겼습니다. 이제 FileStream을 사용하여 파일을 읽습니다. 어떻게 파일을 만들었습니까?

이 컨텍스트에서 나는 개체가 있습니다. 개체는 당신이 원하는대로 무엇이든됩니다!

나는 컬렉션을 신 s 오브젝트로 사용합니다.

Collection<object> list = new Collection<object>(); 
//Now I will write this list to a file. fileName is what you want and be sure that folder Files is exist on server or at the root folder of your project 
WriteFile(list, Server.MapPath("~/Files/" + fileName)); 
//The method to write object to file is here 
public static void WriteFile<T>(T obj, string path) 
{ 
    FileStream serializeStream = new FileStream(path, FileMode.Create); 
    BinaryFormatter bf = new BinaryFormatter(); 
    bf.Serialize(serializeStream, obj); 
    serializeStream.Flush(); 
    serializeStream.Close(); 
} 

개체를 파일에 기록한 후에 개체로 다시 읽는 방법이 필요합니다. 내가 파일에 모든 유형의 객체를 작성하고 다음 다시 원래의 객체를 읽을 수있는 지금입니다, 위의 몇 가지 단계를 수행 한 후

public static Collection<object> ReatFile(string fileName){ 
      //I have to read the file which I have wrote to an byte array    
      byte[] file; 
      using (var stream = new FileStream(Server.MapPath("~/Files/" + fileName), FileMode.Open, FileAccess.Read)) 
      { 
       using (var reader = new BinaryReader(stream)) 
       { 
        file = reader.ReadBytes((int)stream.Length); 

       } 

      } 
      //And now is what I have to do with the byte array of file is to convert it back to object which I have wrote it into a file 
      //I am using MemoryStream to convert byte array back to the original object. 
      MemoryStream memStream = new MemoryStream(); 
      BinaryFormatter binForm = new BinaryFormatter(); 
      memStream.Write(file, 0, file.Length); 
      memStream.Seek(0, SeekOrigin.Begin); 
      Object obj = (Object)binForm.Deserialize(memStream); 
      Collection<object> list = (Collection<object>)obj; 
      return list; 
} 

: 그래서이 방법을 쓰기 않습니다. 어떤 도움을 주셔서 너무 감사드립니다.

관련 문제