2009-09-30 4 views
63

は、私は、Web上で次のコードが見つかりました:信頼性の高い方法は、[]

private byte [] StreamFile(string filename) 
{ 
    FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read); 

    // Create a byte array of file stream length 
    byte[] ImageData = new byte[fs.Length]; 

    //Read block of bytes from stream into the byte array 
    fs.Read(ImageData,0,System.Convert.ToInt32(fs.Length)); 

    //Close the File Stream 
    fs.Close(); 
    return ImageData; //return the byte data 
} 

が、C#で[]のバイトにファイルを変換するために使用するのに十分な信頼性を、またはそこにありますこれを行う良い方法は?

+3

'Close'が実際に呼び出されるように、残りのコードを囲むtry-finally文の最後に' fs.Close() 'を入れてください。 – Joren

答えて

174
byte[] bytes = System.IO.File.ReadAllBytes(filename); 

これはすべきことです。 ReadAllBytesはファイルを開き、その内容を新しいバイト配列に読み込んで閉じます。その方法にはMSDN pageがあります。

+0

これはファイルロックを引き起こしますか? –

+0

私は、バイト[]に値が設定されると、ファイルはまだロックされませんか? –

+2

いいえ、そうではありません。バイト配列が読み込まれるとすぐにファイルが閉じられます。 –

3

は一般的なバージョンとして十分に見えます。あなたが十分に具体的なものであれば、ニーズに合わせて修正することができます。ファイルなどの例外やエラー状況が、存在しないか、読み取ることができないため

等も、テスト

あなたはまた、いくつかのスペースを節約するために、次のことが可能です。

byte[] bytes = System.IO.File.ReadAllBytes(filename); 
21
byte[] bytes = File.ReadAllBytes(filename) 

か...

+0

'var'をばかげた使用のためにDownvotedしました。 –

+0

さあ。とにかく、気分が良くなったら、私はそれを変更します。 –

+9

真剣に?この場合、 'var'は完全に受け入れ可能です - 戻り値の型はメソッドの名前に明示されています... –

2

その他はあなたが使用できることに注目したビルトインFile.ReadAllBytes。組み込みメソッドは結構ですが、それはあなたが上記の投稿のコードは二つの理由から、脆弱であることは注目に値します:

  1. StreamIDisposableです - あなたは閉じられているファイルを確実にするために使用した句でFileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read)初期化を配置する必要があります。これを行わないと、ファイルがロックされたままであることを意味する、障害が発生した場合にストリームが開いたままであり、後で他の問題が発生する可能性があります。
  2. fs.Readは、要求したバイト数よりも少ないバイト数を読み取ることがあります。一般的に、Streamインスタンスの.Readメソッドは少なくとも1バイトを読み込みますが、必ずしもすべてのバイトを読み込む必要はありません。すべてのバイトが読み取られるまで、読み込みを再試行するループを作成する必要があります。 This pageはこれをより詳細に説明しています。
9

誰もがすでに言ったことを繰り返すが、ファイル操作のために、次のチートシートhandlyを保つまでもありません:

  1. System.IO.File.ReadAllBytes(filename);
  2. File.Exists(filename)
  3. Path.Combine(folderName, resOfThePath);
  4. Path.GetFullPath(path); // converts a relative path to absolute one
  5. Path.GetExtension(path);
1

これらすべての回答は.ReadAllBytes()です。もう一つは、同様の(彼らは自分のコードをリファクタリングしようとしていたので、私は、重複を言うことはありません)質問はそうここに頼まれた:

File.ReadAllBytes throws OutOfMemoryException with big files (tested with 630 MB file 
and it failed) – juanjo.arana Mar 13 '13 at 1:31 
Best way to read a large file into a byte array in C#?

コメントは.ReadAllBytes()に関する記事の一つになりました

私にはより良いアプローチ、BinaryReaderで、このようなものになるだろう:

public static byte[] FileToByteArray(string fileName) 
{ 
    byte[] fileData = null; 

    using (FileStream fs = new File.OpenRead(fileName)) 
    { 
     var binaryReader = new BinaryReader(fs); 
     fileData = binaryReader.ReadBytes((int)fs.Length); 
    } 
    return fileData; 
} 

しかし、それは私だけです...

もちろん、これはすべて、一度読み込んだbyte[]を処理するメモリがあると仮定し、処理する前にファイルがあることを確認するためにFile.Existsチェックを入れなかった。

関連する問題