人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: mai_mai_mail
●カテゴリ:コンピュータ インターネット
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● きゃづみぃ
●25ポイント

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


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

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


mai_mai_mailさんのコメント
質問の書き方が不足してたのかもしれません。2つのプログラムでファイルを通じてファイルの内容を渡すプログラムです。VCのプログラムは123と書き、VBのプログラムは123を読んで利用する。VCは常に違うデータを書き込みます。

きゃづみぃさんのコメント
VCの書き込む側は、書いた後、ちゃんと ファイルを閉じてますでしょうか? 処理の流れとしては ファイルを開いて 書いて ファイルを閉じる の繰り返しと ならなければ なりません。

きゃづみぃさんのコメント
ロック状態を解除できれば いいのですが、それには 閉じるのが一番かと思います。

2 ● JULY
●25ポイント

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)


3 ● a-kuma3
●25ポイント

ファイルを共有できるように開くには、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


4 ● pretaroe
●25ポイント

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

---------

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

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

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

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ