一度に512ファイル以上のファイルをオープンするには

解決


あやきち  2004-12-20 18:15:10  No: 118410  IP: [192.*.*.*]

一度に512ファイル以上のファイルを同時にオープンすることは可能でしょうか?

なお使用している関数は
FreeFile関数で使用可能なファイル№を取得し
そのナンバーをもとにオープン関数のAppendでファイルのオープンを行っています。

編集 削除
030  2004-12-20 18:53:06  No: 118411  IP: [192.*.*.*]

MSDNのコピペです

FreeFile 関数
      

使用可能なファイル番号を整数型 (Integer) の値で返すファイル入出力関数です。

構文

FreeFile[(rangenumber)]

引数 rangenumber には、ファイル番号の範囲をバリアント型 (Variant) で指定します。指定した範囲から次に使用可能なファイル番号を返します。この引数は省略可能です。

0 (既定値)1 〜 255 の範囲のファイル番号が返されます。

1256 〜 511 の範囲のファイル番号が返されます。

解説

使用可能なファイル番号を取得するために FreeFile 関数を使用します。既に使われているファイル番号を重複して使うのを防ぐことができます。

編集 削除
あやきち  2004-12-20 19:13:23  No: 118412  IP: [192.*.*.*]

030さんすばやい回答どうもありがとうございます。

当初見積もっていたファイル数(200〜300)よりも多くなったため、
どうにかして現行PGで対応出来ないかと思い質問させて頂きました。

一応MSDNを調べてでそこまではたどりついたのですが
FileFree関数を用いての同時オープンは512ファイル以上出来ないというのは
VBの制限事項なのですね。

OpenTextFile等で代替えできるかどうか調べてみます。
どうもありがとうございました。m(__)m

編集 削除
ひろ  2004-12-20 19:39:15  No: 118413  IP: [192.*.*.*]

Openステートメントの仕様上 1〜511までしか無理ですね。

本当にそんなに沢山のファイルを「同時読み書き」する必要性があるのでしょうか?

なんとなく設計そのものに問題があるように思います。

案1:用が済んだファイルはすぐに閉じる。必要なら読み込んだ結果を変数に保持しておく
案2:データベースを使って、各テーブルにデータを入れる

編集 削除
あやきち  2004-12-20 20:06:46  No: 118414  IP: [192.*.*.*]

ひろさんわざわざありがとうございます。(^^)

>本当にそんなに沢山のファイルを「同時読み書き」する必要性があるのでしょうか?
>なんとなく設計そのものに問題があるように思います。

そのとおりなんでしょうね。。。
最初の処理方式を安易に考えた為、現在苦しんでいるので
設計に関して時間を掛けなかったのはかなり後悔しております。。。

>案1:用が済んだファイルはすぐに閉じる。必要なら読み込んだ結果を変数に保持しておく

当初そのような設計(1レコード読み込む毎に出力ファイルのオープンクローズ
を行っていた)をしていました。

しかしながら、入力ファイルの最大件数が約200万件(300M)程度あり、
ファイルのオープンクローズに非常に時間が掛かってしまったため、
処理を行う前に一度全対象ファイルのオープンをかけ処理が完了した後に
全てのファイルのクローズを行うように変更することで、
ファイルのオープンクローズの時間を短縮した経緯があります。

>案2:データベースを使って、各テーブルにデータを入れる
残念ながら、DBを使用していないため、上記の方法はとれません。。。

結局何を伝えたいのかよく分からない文章
(主に自分自身に対する愚痴ですが。。。)になってしまいましたが、
先人たちのよりよいアイデアを探したいと思います。

どうもありがとうございました。m(__)m

編集 削除
ねろ  2004-12-21 09:11:44  No: 118415  IP: [192.*.*.*]

怒られるかも知れないけれど、ファイルのオープンと読み書きの
速度を速くしたいのなら、VBのネイティブな関数は使い物になりません。
APIの「CreateFile」関数を使うことをお勧めします。
ファイルによっては100倍近く速くなります。
テキストファイルであれば、リッチテキストの
RichTextBox.LoadFile 
RichTextBOx.Savefile
も非表示で使用すると高速です。

それと全部開くか、一つずつ開いて閉じるかの2者択一ではないのでは、
ファイルが600有るとして、500個開いておき、読み書きしたいファイルが
開いているファイルの中に無かったら、1番使用率の少ないファイルを閉じて
新しいファイルを開くとか、かなり工夫は出来ると思いますが。

編集 削除