- ベストアンサー
2GB以上のファイルを扱う方法
こんにちは ACCESSで、2GB以上のファイルを扱いたいのですが、 SEEKステートメントでは2GB以上のファイルポインタを 指定できません。 VBで巨大ファイルを扱える何かよい方法はありませんでしょうか? ※ファイル分割はしない方法でお願いします。
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
巨大なファイルを作ることはできたズラw これを応用したら、もしかして読める? Dim i As Long Dim h As Long Dim m As Long Dim l As Long Dim sz As Long sz = &H80000 h = CreateFile("c:\temp\big.txt", GENERIC_WRITE, _ 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0) m = GlobalAlloc(GMEM_FIXED, sz) For i = 1 To 100 Call WriteFile(h, m, ByVal sz, VarPtr(l), ByVal 0) Next Call GlobalFree(m) Call CloseHandle(h)
その他の回答 (10)
- todo36
- ベストアンサー率58% (728/1234)
あちゃ、GETで2Gを超えるシークは出来なかったです。 ReadFileで一気に読み込むのも重いので、SetFilePointerが有力でしょう。
お礼
ありがとう。 ステートメントの限界がわかったわ(笑)
- sha-girl
- ベストアンサー率52% (430/816)
CreateFileやReadFile APIをつかってはどうでしょうか。 ただし、VBの場合longだと 2147483647をこえると-2147483648から-1の値になるので 注意が必要です。 (vbでunsignedみたいなのってあったかも・・・) ちなみに試したことはありません。
お礼
ありがとう。 setfilepointerで何とかできそうですわ
- todo36
- ベストアンサー率58% (728/1234)
前回の回答は少し間違っていたけど、 3GB目から128byteは Dim wk(0 To 127) As Byte Open "hoge" For Random As #1 Len = 128 Get #1, 3@ * 1024@ * 1024@ * 1024@ / 128@ + 1, wk Close #1 で出来るはず。 Len節でレコードサイズを128byteで指定しているので Getの第2引数は128byte単位のレコード番号です。 開始位置が128で割り切れない場合は一工夫が必要です。
補足
Get #1, 3@ * 1024@ * 1024@ * 1024@ / 128@ + 1, wk ここでファイル名または番号が違います と出てしまうよ・・ 3@ を 1@にするとうまくいくんだけど・・・ オーバーフローでGETじゃ無理なんじゃ?・・・ ※Rnadomでなくてバイナリーモードでオープンしたいんですよねー
- 2ch
- ベストアンサー率51% (64/125)
お恥ずかしい アドレスまちがった
> Open "hoge" For Random As #1 Len = 128 FreeFile()関数を使用した方が無難と思われ(w
補足
・・・・ 3GBのアドレス位置から128バイトのバイナリレコードを読み込む方法教えて!! お願いします
- todo36
- ベストアンサー率58% (728/1234)
Dim wk(0 To 127) As Byte Open "hoge" For Random As #1 Len = 128 Get #1, 2@ * 1024@ * 1024@ * 1024@ / 128@, wk Close #1
補足
うーーむ・・・ 上の例ってRandomアクセスで2GBアドレスじゃないよね バイナリファイルで、3GBのアドレス位置から128バイト読みたいんだけど・・・ Get #1, 3@ * 1024@ * 1024@ * 1024@ ,wk こんな感じ うまい方法ないかな? オーバーフローしちゃうし、GETでも無理だね?
- 2ch
- ベストアンサー率51% (64/125)
恥ずかしながら、SEEK関数の便利さがよくわからなかった。 とりあえず、#3に便乗して、SetFilePointerのサンプル (googleでひっかかったところで、よさ気なところ) http://oshiete1.goo.ne.jp/kotaeru.php3?q=570918
補足
http://oshiete1.goo.ne.jp/kotaeru.php3?q=570918 ?? 2ch様! これってここのアドレスなんだけど・・ どういうこと? かな・・
- umota
- ベストアンサー率46% (150/324)
> ACCESSで、2GB以上のファイルを扱いたいのですが、 外部ファイルからデータを取込みたいということかな? VBでのファイル操作に関して言えば SEEK 関数の引数に指定できる範囲は 1 ~ 2,147,483,647 (long) なので仕様として不可能です。 API関数 "SetFilePointer" を使用すれば可能かも?
お礼
win32apiですかー サンプルとなるSRCがあったら教えてください。 よろしくお願いします。 ちなみに外部ファイルでバイナリの4GBのファイルから 2GB以上のアドレスからデータを取得したいのです。 ※ファイル分割しない方法でお願いします。
- 2ch
- ベストアンサー率51% (64/125)
今のソースはどうなっているんだ?
補足
どうも 今のソースはこうなっているよ Dim wk(128) As Byte Seek #1, pos <--ここのposに、2GB以上のアドレスを記述したい。 Get #1, , wk seekステートメントじゃ無理なのは知っている。 なので、可変長のバイナリファイルの外部ファイルを2GBアドレス以上のファイルポインターを指定してデータを読み込む方法はないのかね? たとえば、関数じたいを作るとか、APIを使用するとか そういう例があったら公開してほしい。 2ch様よろしくお願いします!
- deadline
- ベストアンサー率63% (1239/1943)
ハードディスクのフォーマットがFAT32の場合、2GBを超えるサイズのファイルを作ることが出来ないのですが・・・。 OSは何でしょうか?(Windowsだろうと思いますが、9x/Meなのか、2000/XPなのか?)
補足
ファイルシステムはNTFSですので4GBのファイルです。 よろしくお願いします。 OSはwindows2000serverです。
お礼
ありがとう。 上の例で試したら50MBのファイルができたよ。 ヒントをありがとう。 何とかできそうですよ。 ただ、アドレスを直接していするとオーバフローするので ちとやり方を変えちゃったけどね。