- 締切済み
CSVファイルを開いている状態での書込処理について
OS:windows2000pro VB:VB6.0sp5 ファイル:c:\work\test0411.csv (workフォルダはEveryone共有:端末Aのみ) 端末:ABともにファイル共有を除き同環境 端末Aにて、システム(VBにて作成:下記参照)にて 上記ファイル(test0411.csv)に一定周期で書込を行っています Private Sub output(ByVal ofile As String) On Error GoTo trap handle = FreeFile() Open ofile For Append As #handle (中略) Print #handle, _ Close #handle Exit Sub trap: 'MsgBox Err.number & "," & Err.Description, vbInformation, "output" End Sub 端末Bにて、エクスプローラから上記ファイル(test0411.csv)を 開いて閲覧しています 上記ファイル(test0411.csv)を閲覧している間に (1)一定周期でデータの書込ができません 一旦ファイルを閉じ、再度開いた折、 閲覧していた間のデータが追加更新するように したいのですが、どのようにすれば良いのでしょうか? よろしくお願いいたします
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- i-touch
- ベストアンサー率40% (170/415)
私だったら、閲覧用のファイルを別にFilecopyなどで準備するか(それでもコピー先ファイルを開かれていたらエラーになりますが)、または、閲覧時に、元のファイルをバッチファイルなどでローカルにコピーさせて、それを開かせるようにします。 では
- anmochi
- ベストアンサー率65% (1332/2045)
それは「Bで開いている間にAで書き込むのがエラーになっても良いので、最終的に整合性が取れれば良い」という解釈でよいのかな? とりあえず今までの流れを修正するとすれば、キューやコレクションを用意すれば簡単に実現できそうだ。キューで行う方法を考えてみたので参考になれば。 用意するもの 1.CSVのデータ1行を表すクラス(CsvQueueクラスとする) メンバー変数は、その1行のデータとCsvQueueクラスへのポインタ。データは面倒ならPublicでよいだろう。 メンバー関数は、PutData()とGetData()。 CsvQueueクラス Public strCsvData1 As String Public strCsvData2 As String Public strCsvData3 As String Private queNextData As CsvQueue Public Function PutData(ByVal q As CsvQueue) As Boolean If queNextData Is Nothing Then Set queNextData = q Exit Function End If PutData = queNextData.PutData(q) End Function Public Function GetData() As CsvData GetData = queNextData End Function CSV出力モジュール内(追加した行を++で表している) ++ Private csvRoot As CsvData ' Nothingに初期化しておくべし Private Sub output(ByVal ofile As String) On Error GoTo trap handle = FreeFile() Open ofile For Append As #handle ++ Do Until csvRoot Is Nothing ++ (中略と同じような内容) ++ csvRoot = csvRoot.GetData() ++ Loop (中略) Print #handle, _ Close #handle Exit Sub trap: 'MsgBox Err.number & "," & Err.Description, vbInformation, "output" ++ Dim csvTemp As New CsvData ++ csvTemp.strCsvData1 = ... ++ If csvRoot Is Nothing Then ++ Set csvRoot = csvTemp ++ Else ++ csvRoot.PutData(csvTemp) ++ End If End Sub 今机上で作ったものなので間違いがあるかも。まぁ考え方としてはこんなのはどうかな。
お礼
早速のご回答ありがとうございます また、丁寧にご教示頂戴し大変恐縮いたしております 早速試させていただきます また、不明な点が出てくるかと存じます 多分、明日(4/13)午後以降になるかと存じますので その折にはまたご教示いただければ幸いです よろしくお願いいたします
補足
早速ではございますが、 ご教示いただきました内容にて実行いたしますと Public Function PutData(ByVal q As CsvQueue) As Boolean の個所にて、 エラー「ユーザー定義型は定義されていません」 が発生いたします よろしくお願いいたします