16

バイト配列があり、そのバイト配列を 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 に読み込む方法に焦点を当ててください。ここにあるファイルはデータベースや他のソースなどの別の場所からロードされるため、ファイルを直接 FileStream に読み込まないでください。

4

4 に答える 4

18
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);
于 2013-03-08T11:07:43.047 に答える
7

どこが誤解なのかわからない。FileStream は、ディスク上のファイルを表します。ディスクに書き込まずに「バイトを読み取る」ことはできず、ディスクから読み取らずに読み取ることはできません。

たぶん、あなたが望むのは、任意のコンテンツを含むことができる MemoryStream です。

どちらも Stream から派生します。

于 2013-03-08T11:03:11.053 に答える
1

うん!さらに調査を行った結果、良い解決策が得られました。トピックとして「バイト配列を FileStream に読み込む方法」を投稿しました。バイト配列を FileStream に読み込むことはできません。ドライバー上のファイルをバイト配列に読み込むために使用するだけです。そのため、コードを少し変更し、FileStream を使用して読み取るファイルを取得しました。ファイルの作り方

このコンテキストでは、オブジェクトがあります。オブジェクトはあなたが望むものです!

コレクションをサンブル オブジェクトとして使用します。

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;
}

上記のいくつかの手順を実行した後、任意の型オブジェクトをファイルに書き込んでから、元のオブジェクトに読み戻すことができるようになりました。私がそこに得た助けに感謝します。

于 2013-03-08T15:17:14.803 に答える
0

なぜあなたFile.ReadAllBytesはあなたの使用の前に走るのFileStreamですか?

string fileName = "test.txt";
using(FileStream fs = new FileStream(Server.MapPath("~/Files/" + fileName), FileMode.Open, FileAccess.Read))
{
    object obj = LoadFile<object>(fs);
    fs.Close();
}
于 2013-03-08T11:02:12.953 に答える