VS2005 VC,VBのプログラミングについて教えてください。ファイルを書き込むプログラムをVC、そのファイルを読み込むプログラムをVBで書いています。1行を上書きし、その1行を1秒毎に読み込みます。以下がその一部です。


最初に書き込みプログラムを立ち上げ、そののち、読み込むプログラムを立ち上げるとファイルがロックしていてエラーとなります。どうすればいいでしょうか?プログラムのどちら側を変更してもかまいません。

よろしくお願いします。

【定期的に書き込むVCプログラム】

fpw=fopen("c:\\SA3.txt","w");
イベントが発生したら書き込むルーチンにしてある
fseek(fpw,0,SEEK_SET);
fputs(strdummy,fpw);

【1秒毎に読み込むVBプログラム】
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

reader1 = New StreamReader("c:\SA3.txt", System.Text.Encoding.Default)

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim str1, str2, str3 As String

str1 = reader1.ReadLine()
reader1.BaseStream.Seek(0, SeekOrigin.Begin)
DataGridView1.Rows(0).Cells(1).Value = str1

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/06/01 12:50:09
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント25pt

>最初に書き込みプログラムを立ち上げ、そののち、読み込むプログラムを立ち上げるとファイルがロックしていてエラーとなります。どうすればいいでしょうか?プログラムのどちら側を変更してもかまいません。


書き込むほうでロックしているから 開けないんでしょうね。

書いたら 閉じる。
そうすれば 大丈夫です。

他1件のコメントを見る
id:taknt

VCの書き込む側は、書いた後、ちゃんと ファイルを閉じてますでしょうか?

処理の流れとしては

ファイルを開いて
書いて
ファイルを閉じる

の繰り返しと ならなければ なりません。

2012/05/25 13:00:39
id:taknt

ロック状態を解除できれば いいのですが、それには 閉じるのが一番かと思います。

2012/05/25 13:59:45
id:JULY No.2

回答回数966ベストアンサー獲得回数247

ポイント25pt

StreamReader locks the file - Visual Basic .NET
確かめてはいませんが、上記ページの2つ目の回答にある方法で解決できませんか?

Dim Stream As New FileStream( _
    "C:\foo.txt", _
    FileMode.Open, _
    FileAccess.Read, _
    FileShare.ReadWrite _
)
Using Reader As New StreamReader(Stream)

C 側は、fputs した時点では、ファイルに書き出されている保証がありません。taknt さんが、書いたら閉じる、という話をしていますが、閉じなくても fflush で書き出されます。
fflush (CRT)

id:a-kuma3 No.3

回答回数4973ベストアンサー獲得回数2154

ポイント25pt

ファイルを共有できるように開くには、WIN32 API を使う必要があります。

HANDLE hFile = CreateFile(
	_T("c:\\SA3.txt"),
	GENERIC_WRITE,
	FILE_SHARE_READ,		// ★これが共有の指定
	NULL,
	CREATE_ALWAYS,
	FILE_ATTRIBUTE_NORMAL,
	NULL );

SetFilePointer(hFile, 0, 0, FILE_BEGIN);

DWORD dwAccBytes;
WriteFile(hFile, dummystr, strlen(dummystr) + 1, &dwAccBytes, NULL);

fseek に相当するのは、SetFilePointer 、fputs に相当するのは、WriteFile です。

MSDN での、API の説明はこちら。
http://msdn.microsoft.com/ja-jp/library/cc429198
http://msdn.microsoft.com/ja-jp/library/cc429788
http://msdn.microsoft.com/ja-jp/library/cc429856

ウィンドウ周りの処理が入ってるので、ちょっとごちゃごちゃしてますけど、こんな感じで使います。
http://www.kumei.ne.jp/c_lang/sdk/sdk_74.htm
http://www.kumei.ne.jp/c_lang/sdk/sdk_75.htm


読みこむ側でも、共有モードの指定が必要なんですけど、No.2 の JULY さんの回答に書いてあるので、割愛。


ちょっと方向性が違っちゃうかもしれないですけど、データ共有するなら、ファイルじゃなくて、それ用の仕組みを使った方が、もっと良い。
例えば、ファイルマッピング。
http://www.kumei.ne.jp/c_lang/sdk2/sdk_123.htm

監視する側もループするのは、どうかなあ、って。
普通は、セマフォを使って、処理開始タイミングの同期を取ります。
http://www.kumei.ne.jp/c_lang/intro2/no_105.htm

id:pretaroe No.4

回答回数531ベストアンサー獲得回数75

ポイント25pt

・StreamReaderで開いたファイルをロックしない
・Microsoft Officeなどが開いているファイルを開く
http://dobon.net/vb/dotnet/file/fileshare.html

---------

【定期的に書き込むVCプログラム】
は、その都度 fcloseした方が良いでしょう。

【1秒毎に読み込むVBプログラム】
は、開いたファイルをロックしないようにして読み
かつ、質問文のようにエラーが起こったら
再度読み込むような用にするべきだと思います。

リトライ回数は10回などに設定して
無限ループにならないように。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません