こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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

投稿日時 - 2003-06-10 04:19:09

QNo.570918

すぐに回答ほしいです

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

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

投稿日時 - 2003-06-12 13:07:18

お礼

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

投稿日時 - 2003-06-15 17:11:02

ANo.10

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(11)

ANo.11

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

投稿日時 - 2003-06-13 11:27:40

お礼

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

投稿日時 - 2003-06-15 17:11:55

ANo.9

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

ちなみに試したことはありません。

投稿日時 - 2003-06-12 11:54:08

お礼

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

投稿日時 - 2003-06-15 17:07:12

ANo.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で割り切れない場合は一工夫が必要です。

投稿日時 - 2003-06-12 11:21:16

補足

Get #1, 3@ * 1024@ * 1024@ * 1024@ / 128@ + 1, wk

ここでファイル名または番号が違います と出てしまうよ・・

3@ を 1@にするとうまくいくんだけど・・・

オーバーフローでGETじゃ無理なんじゃ?・・・

※Rnadomでなくてバイナリーモードでオープンしたいんですよねー

投稿日時 - 2003-06-13 02:57:51

ANo.7

2ch

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

参考URL:http://www.angel.ne.jp/~mike/tips.html

投稿日時 - 2003-06-12 09:51:54

ANo.6

> Open "hoge" For Random As #1 Len = 128

FreeFile()関数を使用した方が無難と思われ(w

投稿日時 - 2003-06-11 13:08:47

補足

・・・・

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

お願いします

投稿日時 - 2003-06-12 02:29:57

ANo.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

投稿日時 - 2003-06-11 11:49:00

補足

うーーむ・・・
上の例ってRandomアクセスで2GBアドレスじゃないよね

バイナリファイルで、3GBのアドレス位置から128バイト読みたいんだけど・・・

Get #1, 3@ * 1024@ * 1024@ * 1024@ ,wk
こんな感じ

うまい方法ないかな?
オーバーフローしちゃうし、GETでも無理だね?

投稿日時 - 2003-06-12 02:25:36

ANo.4

2ch

恥ずかしながら、SEEK関数の便利さがよくわからなかった。

とりあえず、#3に便乗して、SetFilePointerのサンプル
(googleでひっかかったところで、よさ気なところ)

http://oshiete1.goo.ne.jp/kotaeru.php3?q=570918

投稿日時 - 2003-06-11 09:58:34

補足

http://oshiete1.goo.ne.jp/kotaeru.php3?q=570918 ??

2ch様! これってここのアドレスなんだけど・・
どういうこと? かな・・

投稿日時 - 2003-06-12 01:56:26

ANo.3

> ACCESSで、2GB以上のファイルを扱いたいのですが、
外部ファイルからデータを取込みたいということかな?

VBでのファイル操作に関して言えば
SEEK 関数の引数に指定できる範囲は
1 ~ 2,147,483,647 (long)
なので仕様として不可能です。
API関数 "SetFilePointer" を使用すれば可能かも?

投稿日時 - 2003-06-10 21:44:15

お礼

win32apiですかー
サンプルとなるSRCがあったら教えてください。
よろしくお願いします。

ちなみに外部ファイルでバイナリの4GBのファイルから
2GB以上のアドレスからデータを取得したいのです。

※ファイル分割しない方法でお願いします。

投稿日時 - 2003-06-11 02:40:58

ANo.2

2ch

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

投稿日時 - 2003-06-10 12:37:45

補足

どうも
今のソースはこうなっているよ

Dim wk(128) As Byte

Seek #1, pos <--ここのposに、2GB以上のアドレスを記述したい。
Get #1, , wk


seekステートメントじゃ無理なのは知っている。

なので、可変長のバイナリファイルの外部ファイルを2GBアドレス以上のファイルポインターを指定してデータを読み込む方法はないのかね?
たとえば、関数じたいを作るとか、APIを使用するとか
そういう例があったら公開してほしい。

2ch様よろしくお願いします!

投稿日時 - 2003-06-11 01:12:57

ANo.1

ハードディスクのフォーマットがFAT32の場合、2GBを超えるサイズのファイルを作ることが出来ないのですが・・・。

OSは何でしょうか?(Windowsだろうと思いますが、9x/Meなのか、2000/XPなのか?)

投稿日時 - 2003-06-10 04:48:10

補足

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

投稿日時 - 2003-06-10 09:38:26

あなたにオススメの質問