• ベストアンサー

2GB以上のファイルを扱う方法

こんにちは ACCESSで、2GB以上のファイルを扱いたいのですが、 SEEKステートメントでは2GB以上のファイルポインタを 指定できません。 VBで巨大ファイルを扱える何かよい方法はありませんでしょうか? ※ファイル分割はしない方法でお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • 2ch
  • ベストアンサー率51% (64/125)
回答No.10

巨大なファイルを作ることはできたズラ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)

spider2002
質問者

お礼

ありがとう。 上の例で試したら50MBのファイルができたよ。 ヒントをありがとう。  何とかできそうですよ。 ただ、アドレスを直接していするとオーバフローするので ちとやり方を変えちゃったけどね。

その他の回答 (10)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.11

あちゃ、GETで2Gを超えるシークは出来なかったです。 ReadFileで一気に読み込むのも重いので、SetFilePointerが有力でしょう。

spider2002
質問者

お礼

ありがとう。 ステートメントの限界がわかったわ(笑)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.9

CreateFileやReadFile APIをつかってはどうでしょうか。 ただし、VBの場合longだと 2147483647をこえると-2147483648から-1の値になるので 注意が必要です。 (vbでunsignedみたいなのってあったかも・・・) ちなみに試したことはありません。

spider2002
質問者

お礼

ありがとう。 setfilepointerで何とかできそうですわ

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.8

前回の回答は少し間違っていたけど、 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で割り切れない場合は一工夫が必要です。

spider2002
質問者

補足

Get #1, 3@ * 1024@ * 1024@ * 1024@ / 128@ + 1, wk ここでファイル名または番号が違います と出てしまうよ・・ 3@ を 1@にするとうまくいくんだけど・・・ オーバーフローでGETじゃ無理なんじゃ?・・・ ※Rnadomでなくてバイナリーモードでオープンしたいんですよねー

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.7

お恥ずかしい アドレスまちがった

参考URL:
http://www.angel.ne.jp/~mike/tips.html
noname#4564
noname#4564
回答No.6

> Open "hoge" For Random As #1 Len = 128 FreeFile()関数を使用した方が無難と思われ(w

spider2002
質問者

補足

・・・・ 3GBのアドレス位置から128バイトのバイナリレコードを読み込む方法教えて!! お願いします

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.5

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

spider2002
質問者

補足

うーーむ・・・ 上の例ってRandomアクセスで2GBアドレスじゃないよね バイナリファイルで、3GBのアドレス位置から128バイト読みたいんだけど・・・ Get #1, 3@ * 1024@ * 1024@ * 1024@ ,wk こんな感じ うまい方法ないかな? オーバーフローしちゃうし、GETでも無理だね?

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.4

恥ずかしながら、SEEK関数の便利さがよくわからなかった。 とりあえず、#3に便乗して、SetFilePointerのサンプル (googleでひっかかったところで、よさ気なところ) http://oshiete1.goo.ne.jp/kotaeru.php3?q=570918

spider2002
質問者

補足

http://oshiete1.goo.ne.jp/kotaeru.php3?q=570918 ?? 2ch様! これってここのアドレスなんだけど・・ どういうこと? かな・・

  • umota
  • ベストアンサー率46% (150/324)
回答No.3

> ACCESSで、2GB以上のファイルを扱いたいのですが、 外部ファイルからデータを取込みたいということかな? VBでのファイル操作に関して言えば SEEK 関数の引数に指定できる範囲は 1 ~ 2,147,483,647 (long) なので仕様として不可能です。 API関数 "SetFilePointer" を使用すれば可能かも?

spider2002
質問者

お礼

win32apiですかー サンプルとなるSRCがあったら教えてください。 よろしくお願いします。 ちなみに外部ファイルでバイナリの4GBのファイルから 2GB以上のアドレスからデータを取得したいのです。 ※ファイル分割しない方法でお願いします。

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.2

今のソースはどうなっているんだ?

spider2002
質問者

補足

どうも 今のソースはこうなっているよ Dim wk(128) As Byte Seek #1, pos <--ここのposに、2GB以上のアドレスを記述したい。 Get #1, , wk seekステートメントじゃ無理なのは知っている。 なので、可変長のバイナリファイルの外部ファイルを2GBアドレス以上のファイルポインターを指定してデータを読み込む方法はないのかね? たとえば、関数じたいを作るとか、APIを使用するとか そういう例があったら公開してほしい。 2ch様よろしくお願いします!

  • deadline
  • ベストアンサー率63% (1239/1943)
回答No.1

ハードディスクのフォーマットがFAT32の場合、2GBを超えるサイズのファイルを作ることが出来ないのですが・・・。 OSは何でしょうか?(Windowsだろうと思いますが、9x/Meなのか、2000/XPなのか?)

spider2002
質問者

補足

ファイルシステムはNTFSですので4GBのファイルです。 よろしくお願いします。 OSはwindows2000serverです。

関連するQ&A