ファイルの読み書きについて質問です。
ファイルサイズが4GBを超えるファイルを扱うため、
Streamクラスを使用しています。
が、4GBを超えた位置でSeekをすると意図していない位置にシークされてしまいます。
IStream::Seek()
が、同じ位置でReadをすると、意図している位置にポインタが移動します。
なにかご存じの方いらっしゃいますか?
IStreamは情報が少なくて困っています。
Readについては以下のサイトを見つけました。
http://msdn.microsoft.com/ja-jp/library/cc389764.aspx
環境VS2003.NET MFCを使用しています。
素直にSetFilePointerExを使うと言う方法では駄目なんでしょうか?
MSのサイトの方はOLEDBを対象にした話みたいですし、
実際に.NET FrameworkのStreamクラスを使うと言う話と
OLEDBの話も繋がらないような気がします。
Streamクラス とIStream は別物ですけど本当はどちらのご質問でしょうか?
もしかして、混同して使ってませんか?
すいません、混同していました。IStreamです。
http://74.125.153.132/search?
q=cache:NfVH6tLFdAIJ:lamoo.s53.xrea.com/develop/gdiplus/Stream.h+Stream.h+class+Stream&c
d=2&hl=ja&ct=clnk&gl=jp
上記サイトを参考に、IStreamをラッパして使用しています。
FileStream* pfStream;
pfStream = new FileStream(”ファイルパス”, STGM_READ);
for(int i = 0; i < 100; i++)
{
// 情報読み込み
unsigned int signature;
pfStream->Read(&signature, sizeof(unsigned int));
//あるデータは飛ばす
pfStream->Seek(HogeDataSize, STREAM_SEEK_CUR);
}
ファイルの中の情報を取得する際、任意のデータを飛ばしながら読み込んでいると、
4GBを超えた際にRead&Seekをすると意図していない位置にシークされています。
なにか4GBの制限があるのでしょうか?
HogeDataSize
こいつの定義と使用方法(4G以上の値の入れ方)は?
情報不足でした。
//あるデータは飛ばす
UINT64 HogeDataSize = XXX;
pfStream->Seek(HogeDataSize, STREAM_SEEK_CUR);
XXXは固定値です。
①unsigned int signature を読みこむ。
②HogeDataSize分をシークする。
を繰り返しています。
Readするストリーム位置が4GBを超えるとおかしくなります。
なぜゆえに UINT64 なの?
http://msdn.microsoft.com/ja-
jp/library/system.runtime.interopservices.comtypes.istream.seek.aspx
あ、INT64でしたね。
INT64 HogeDataSizeに直してみましたが結果は同じでした。
以下のように処理を変更すると4GB後も正常に動作しました。
次のsignatureの読み込み位置まで常に頭からシークするようにしました。
①unsigned int signature を読みこむ。
②頭からsignature + HogeDataSize分をシークする。
若干処理が遅くなりそうですが、解決策がなさそうなので
とりあえずこれでいこうと思います。
皆様、ありがとうございました。