- PR -

iniファイル読込でエラー

投稿者投稿内容
おひろ
ベテラン
会議室デビュー日: 2003/07/23
投稿数: 63
投稿日時: 2004-03-29 11:44
VB.NETで開発したプログラムAとプログラムBが1つのiniファイルを使用しています。
A,Bとも起動は非同期なのですが、ときどきこのiniファイル読込処理で異常が発生してしまいます。
ログを見ているとAとBが同時に起動された場合に起きているような気がするのですが、
以下のようなファイルOPEN、CLOSEをした場合に同時OPENによるエラーが発生すること
がありえるでしょうか。

--- 以下ロジック
strFullPath = Application.StartupPath & "\KYTsystem.ini"
'' 初期設定ファイルが存在しない時、
If Dir(strFullPath, FileAttribute.Normal) = "" Then
'' 戻り値の設定
InitInfo_Get = False
End If
'' 初期設定ファイルオープン
intFileNo = FreeFile()
FileOpen(intFileNo, strFullPath, OpenMode.Input)
-- 中略 UNTIL文でファイル内容を読み込む --
FileClose(intFileNo)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-29 11:51
 FileOpen関数のマニュアルを読み直してみてください。

 共有ロックのオプションが無指定なので、デフォルトのLockReadWriteが使われています。
おひろ
ベテラン
会議室デビュー日: 2003/07/23
投稿数: 63
投稿日時: 2004-03-29 13:32
Jittaさん、ありがとうございます。

> 共有ロックのオプションが無指定なので、デフォルトのLockReadWriteが使われています。

FileOpen関数を確認してみたのですが、
------
Share
省略できます。開くファイルに対するほかのプロセスからのアクセスを制御する、Shared、Lock Read、Lock Write、または Lock Read Write のいずれかの列挙 (Enum) 型です。既定値は Shared です。
------
と、既定値は「Shared」となっているようなのですが。。。

今回のように複数のプログラムから1つのファイルを読む場合は
"Access"をReadに、"Share"をSharedに明示的に設定すべきなのでしょうか。

よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2004-03-29 13:37
引用:

おひろさんの書き込み (2004-03-29 13:32) より:

FileOpen関数を確認してみたのですが、
------
Share
省略できます。開くファイルに対するほかのプロセスからのアクセスを制御する、Shared、Lock Read、Lock Write、または Lock Read Write のいずれかの列挙 (Enum) 型です。既定値は Shared です。
------
と、既定値は「Shared」となっているようなのですが。。。



これはヘルプのどこからの引用でしょうか??
VB.NET/.NET Frameworkのバージョンは?

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vastmOpen.asp

Visual Basic 言語リファレンス の FileOpen 関数の引数Shareの説明によると

> Share
> 省略できます。開くファイルに対する他のプロセスからのアクセスを制御する、Shared、
> Lock Read、Lock Write、または Lock Read Write のいずれかの列挙 (Enum) 型です。
> 既定値は Lock Read Write です。

とあり、既定値はLock Read Write とありますけど・・・。
おひろ
ベテラン
会議室デビュー日: 2003/07/23
投稿数: 63
投稿日時: 2004-03-29 14:07
よねKENさん、ありがとうございます。

> これはヘルプのどこからの引用でしょうか??
> VB.NET/.NET Frameworkのバージョンは?

私のパソコンのVisual Studio .NETを起動して、ヘルプにてFileOpen関数を表示するとそのような記述が出てきます。
バージョンは
Development Environment2002 Version7.0.9486
Microsoft .NET Framework 1.0.3705
です。

どこかのバージョンから変わったのでしょうか?

ところで、このオプションが
ReadLockWriteになっていれば他の処理がファイルオープン中はエラーになり、
Sharedになっていれば複数の処理から1ファイルを同時に開ける、ということ
で問題ないでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-29 14:19
引用:

おひろさんの書き込み (2004-03-29 14:07) より:

どこかのバージョンから変わったのでしょうか?

ところで、このオプションが
ReadLockWriteになっていれば他の処理がファイルオープン中はエラーになり、
Sharedになっていれば複数の処理から1ファイルを同時に開ける、ということ
で問題ないでしょうか?


 ???変わったんですかねぇ???構文説明のところでは、OpenShare.Defaultとなっているので、「デフォルトってなんだぁ!」な気分ですが。。。

 Sharedを明示的に指定すれば、複数からのアクセスも、処理できるでしょう。


 ところで、この関数は下位互換の為にあるので、新規に作成しているアプリケーションなら、System.IO.Streamクラスからの派生クラスを使用されることを、おすすめします。
おひろ
ベテラン
会議室デビュー日: 2003/07/23
投稿数: 63
投稿日時: 2004-03-29 14:28
Jittaさん、よねKENさん、ありがとうございます。

バージョンにより変わっているのかどうか、というのは謎ですが
とりあえず明示的にSharedを指定して回避いたします。
System.IO.Streamクラスの使用も検討してみます。

ありがとうございました。

NowhereMan
会議室デビュー日: 2004/03/29
投稿数: 10
投稿日時: 2004-03-29 17:19
VS.NET 2002のヘルプでは、「既定値は Shared」
VS.NET 2003のヘルプでは、「既定値は Lock Read Write」
となっているようです。

スキルアップ/キャリアアップ(JOB@IT)