C#ファイル情報を読み込む3つのステップ
9869 ワード
原文リンク:http://developer.51cto.com/art/200908/145675.htm
通常のC#開発では、どのようにしてC#でファイル情報を読み取りますか?C#は私たちに非常に強力なクラスライブラリ(また.NETを称賛しました)を提供して、中には私たちが考えることができるほとんどのクラスと私たちが考えていないクラスがパッケージされています.ストリームはファイルを読み取る一般的な手段で、ストリームを使って読み取ります.はい、そうです.では、本当にファイルのデータを読みますか.本当に完全に読めますか?
通常、C#を使用してファイル情報を読み込むには、次の手順に従います.
1、FileのOpenReadを宣言して使用してファイルフローオブジェクトをインスタンス化する.
FileStream fs = File.OpenRead(filename);
または
FileStream fs = FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
2、ファイルの内容を格納するバイト配列を用意し、fs.Lengthは以下のようにファイルの実際のサイズを得る.
byte[] data = new byte[fs.Length];
3、読み込みを開始し、ファイルストリームを呼び出す方法でdata配列にデータを読み出す
fs.Read (data, 0, data.Length);
私たちは3つの文だけを書いてC#でファイル情報を読み取ることができて、しかも中の内容はそのまま読んで、本当に簡潔です!このコードは本当にあなたが予想したように仕事をすることができますか?答えは:ほとんどできます!
ほとんどの場合、上記のコードはよく機能していますが、Readメソッドには戻り値があることに注意しなければなりません.戻り値がある以上、必ず理屈があります.上記のように書けば、戻り値のない関数になることができます.値を返す目的は、実際に読み取ったファイルのサイズを判断し、ファイルが完全に読み終わったかどうかを判断する機会を与えることです.したがって、上記のコードは、ファイル内のすべてのバイトを必ず読み終えたとは保証できません(多くの場合、読み終わったが).次の方法は、ファイルが完全に読み出されることを保証するために、上記の方法よりも安全な方法を提供する.
ストリームの実際の長さ、例えばネットワークストリームを知らない場合があります.この場合、ストリーム内のデータが完全に読み出されるまで、同様の方法でストリームを読み取ることができる.キャッシュを初期化してから、ストリームから読み出されたストリーム情報をメモリストリームに書き込むことができます.次のようにします.
C#がファイル情報を読み取ることを実現した例は簡単で、効果も明らかではありませんが(ほとんどが正しい)、あなたはとっくにできるかもしれませんが、大丈夫です.この文章はもともと初心者に書いたものです.
コードの例を見てみましょう.
上記の方法では、指定したキャッシュ長を使用してストリームを読み出す方法を提供しています.多くの場合、Stream.Lengthを直接使用してストリームの長さを得ることができますが、すべてのストリームが得られるかどうかは分かりません.このような方法により、C#読み取りファイル情報の簡潔さと完全性を容易に実現することができる.
通常のC#開発では、どのようにしてC#でファイル情報を読み取りますか?C#は私たちに非常に強力なクラスライブラリ(また.NETを称賛しました)を提供して、中には私たちが考えることができるほとんどのクラスと私たちが考えていないクラスがパッケージされています.ストリームはファイルを読み取る一般的な手段で、ストリームを使って読み取ります.はい、そうです.では、本当にファイルのデータを読みますか.本当に完全に読めますか?
通常、C#を使用してファイル情報を読み込むには、次の手順に従います.
1、FileのOpenReadを宣言して使用してファイルフローオブジェクトをインスタンス化する.
FileStream fs = File.OpenRead(filename);
または
FileStream fs = FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
2、ファイルの内容を格納するバイト配列を用意し、fs.Lengthは以下のようにファイルの実際のサイズを得る.
byte[] data = new byte[fs.Length];
3、読み込みを開始し、ファイルストリームを呼び出す方法でdata配列にデータを読み出す
fs.Read (data, 0, data.Length);
私たちは3つの文だけを書いてC#でファイル情報を読み取ることができて、しかも中の内容はそのまま読んで、本当に簡潔です!このコードは本当にあなたが予想したように仕事をすることができますか?答えは:ほとんどできます!
ほとんどの場合、上記のコードはよく機能していますが、Readメソッドには戻り値があることに注意しなければなりません.戻り値がある以上、必ず理屈があります.上記のように書けば、戻り値のない関数になることができます.値を返す目的は、実際に読み取ったファイルのサイズを判断し、ファイルが完全に読み終わったかどうかを判断する機会を与えることです.したがって、上記のコードは、ファイル内のすべてのバイトを必ず読み終えたとは保証できません(多くの場合、読み終わったが).次の方法は、ファイルが完全に読み出されることを保証するために、上記の方法よりも安全な方法を提供する.
public static void SafeRead(Stream stream, byte[] data)
{
int offset = 0;
int remaining = data.Length;
//
while (remaining > 0)
{
int read = stream.Read(data, offset, remaining);
if (read <= 0)
throw new EndOfStreamException(" "
+ read.ToString() + " !");
//
remaining -= read;
//
offset += read;
}
}
ストリームの実際の長さ、例えばネットワークストリームを知らない場合があります.この場合、ストリーム内のデータが完全に読み出されるまで、同様の方法でストリームを読み取ることができる.キャッシュを初期化してから、ストリームから読み出されたストリーム情報をメモリストリームに書き込むことができます.次のようにします.
public static byte[] ReadFully(Stream stream)
{
// 32k
byte[] buffer = new byte[32768];
using (MemoryStream ms = new MemoryStream())
{ // Dispose
//
while (true)
{
int read = stream.Read(buffer, 0, buffer.Length);
// 3M
if (read <= 0)
return ms.ToArray();
ms.Write(buffer, 0, read);
}
}
}
C#がファイル情報を読み取ることを実現した例は簡単で、効果も明らかではありませんが(ほとんどが正しい)、あなたはとっくにできるかもしれませんが、大丈夫です.この文章はもともと初心者に書いたものです.
コードの例を見てみましょう.
public static byte[] Read2Buffer(Stream stream, int BufferLen)
{
// ,
if (BufferLen < 1)
{
BufferLen = 0x8000;
}
//
byte[] buffer = new byte[BufferLen];
int read = 0;
int block;
// ,
while ((block = stream.Read(buffer,
read, buffer.Length - read)) > 0)
{
//
read += block;
// ,
if (read == buffer.Length)
{
//
int nextByte = stream.ReadByte();
//
if (nextByte == -1)
{
return buffer;
}
//
byte[] newBuf = new byte[buffer.Length * 2];
Array.Copy(buffer, newBuf, buffer.Length);
newBuf[read] = (byte)nextByte;
buffer = newBuf;// buffer ( ),
// buffer
read++;
}
}
// ret while buffer,
byte[] ret = new byte[read];
Array.Copy(buffer, ret, read);
return ret;
}
上記の方法では、指定したキャッシュ長を使用してストリームを読み出す方法を提供しています.多くの場合、Stream.Lengthを直接使用してストリームの長さを得ることができますが、すべてのストリームが得られるかどうかは分かりません.このような方法により、C#読み取りファイル情報の簡潔さと完全性を容易に実現することができる.