最初に書き込みプログラムを立ち上げ、そののち、読み込むプログラムを立ち上げるとファイルがロックしていてエラーとなります。どうすればいいでしょうか?プログラムのどちら側を変更してもかまいません。
よろしくお願いします。
【定期的に書き込む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
>最初に書き込みプログラムを立ち上げ、そののち、読み込むプログラムを立ち上げるとファイルがロックしていてエラーとなります。どうすればいいでしょうか?プログラムのどちら側を変更してもかまいません。
書き込むほうでロックしているから 開けないんでしょうね。
書いたら 閉じる。
そうすれば 大丈夫です。
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)
ファイルを共有できるように開くには、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
・StreamReaderで開いたファイルをロックしない
・Microsoft Officeなどが開いているファイルを開く
http://dobon.net/vb/dotnet/file/fileshare.html
---------
【定期的に書き込むVCプログラム】
は、その都度 fcloseした方が良いでしょう。
【1秒毎に読み込むVBプログラム】
は、開いたファイルをロックしないようにして読み
かつ、質問文のようにエラーが起こったら
再度読み込むような用にするべきだと思います。
リトライ回数は10回などに設定して
無限ループにならないように。
VCの書き込む側は、書いた後、ちゃんと ファイルを閉じてますでしょうか?
2012/05/25 13:00:39処理の流れとしては
ファイルを開いて
書いて
ファイルを閉じる
の繰り返しと ならなければ なりません。
ロック状態を解除できれば いいのですが、それには 閉じるのが一番かと思います。
2012/05/25 13:59:45