アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (11件中1~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)
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/06/15 17:11

あちゃ、GETで2Gを超えるシークは出来なかったです。


ReadFileで一気に読み込むのも重いので、SetFilePointerが有力でしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/06/15 17:11

CreateFileやReadFile APIをつかってはどうでしょうか。


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

ちなみに試したことはありません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/06/15 17:07

前回の回答は少し間違っていたけど、


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でなくてバイナリーモードでオープンしたいんですよねー

補足日時:2003/06/13 02:57
    • good
    • 0

お恥ずかしい


アドレスまちがった

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

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



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

この回答への補足

・・・・

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

お願いします

補足日時:2003/06/12 02:29
    • good
    • 0

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でも無理だね?

補足日時:2003/06/12 02:25
    • good
    • 0

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



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

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

この回答への補足

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

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

補足日時:2003/06/12 01:56
    • good
    • 0

> ACCESSで、2GB以上のファイルを扱いたいのですが、


外部ファイルからデータを取込みたいということかな?

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

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

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

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

お礼日時:2003/06/11 02:40

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

この回答への補足

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

Dim wk(128) As Byte

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


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

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

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

補足日時:2003/06/11 01:12
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています