C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: csvを読み取り専用で読み込む方法


(過去ログ 144 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■84227 / inTopicNo.1)  csvを読み取り専用で読み込む方法
  
□投稿者/ ひろみ (1回)-(2017/06/01(Thu) 16:12:19)

分類:[.NET 全般] 

2017/06/01(Thu) 16:13:52 編集(投稿者)

こんにちは。
以下のようにcsvを読み込む処理を行っているのですが、これを開いているときに他の処理が稀にエラーになります。
ファイルが開かれているからです。
以下のファイルで読み取り専用で読み込むにはどのようにすれば宜しいでしょうか。
ネットで検索しましたが適切なものを探し出すことができません。
ご存知の方ご教授お願い致します。


File_yosan = "yosan" & MYtoday.ToString("yyyyMM") & ".csv"
If System.IO.File.Exists(PATH_yosan & File_yosan) Then 'ファイルの有無を確認
reader = My.Computer.FileSystem.OpenTextFileReader(PATH_yosan & File_yosan, System.Text.Encoding.Default)

k = 0
midasi = 1 'ゼロから開始
Do Until reader.EndOfStream
line = reader.ReadLine() '一行読込
If k >= midasi Then

'処理

End If
k = k + 1
Loop
End If
引用返信 編集キー/
■84228 / inTopicNo.2)  Re[1]: csvを読み取り専用で読み込む方法
□投稿者/ 魔界の仮面弁士 (1305回)-(2017/06/01(Thu) 17:10:52)
No84227 (ひろみ さん) に返信
> 以下のようにcsvを読み込む処理を行っているのですが、

Try〜Catch も忘れずに。



> 以下のファイルで読み取り専用で読み込むにはどのようにすれば宜しいでしょうか。

StreamReader を得るために OpenTextFileReader を使っておられますが、
それを下記のように変更してみてください。


'Imports System.IO

Using reader As New StreamReader(New FileStream(ファイルパス, FileMode.Open, FileAccess.Read, FileShare.Read))
 Do Until reader.EndOfStream
  :
 Loop
End Using


上記のように、FileMode.Open と FileAccess.Read を指定することで、
読み取りモードで開くことができます。

最後の FileShare は、その開いているファイルを別アプリから利用できるかを示すものです。
上記では FileShare.Read を指定していますが、必要に応じて変更してみてください。
https://dobon.net/vb/dotnet/file/fileshare.html
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36448&forum=7
引用返信 編集キー/
■84229 / inTopicNo.3)  Re[2]: csvを読み取り専用で読み込む方法
□投稿者/ ひろみ (2回)-(2017/06/01(Thu) 19:23:53)
魔界の仮面弁士 様ご回答ありがとうございます。
教えて頂いたとおり修正しましたが、Using reader As New のreaderの部分でエラーがでました。
「変数readerはそれを囲むブロック内の変数を非表示にします」

Dim reader As System.IO.StreamReader と宣言をしていましたが、こちらが誤っているのでしょうか?
引用返信 編集キー/
■84230 / inTopicNo.4)  Re[3]: csvを読み取り専用で読み込む方法
□投稿者/ 魔界の仮面弁士 (1306回)-(2017/06/01(Thu) 19:54:32)
No84229 (ひろみ さん) に返信
> Dim reader As System.IO.StreamReader と宣言をしていましたが、こちらが誤っているのでしょうか?

その変数宣言を削除してください。
そして Using〜End Using のブロック内に、
読み取り処理(Do〜Loop の処理)を記述すれば完成です。


もし、Dim reader As System.IO.StreamReader の宣言を残したいのであれば、
代わりに Using reader As New StreamReader(…) の行を
reader = New StreamReader(…) にする形でも OK です。


ただし StreamReader は、読み取り処理が完了したところで、
後始末のために reader.Close() を呼ぶ必要があることに注意してください。

元のコードではこの後始末が漏れていますので、
ファイルが開かれたままの状態になってしまっています。


先の私の例では、Close する代わりに Using ブロックを用いています。
この記法の場合、End Using に到達した時点で後始末が行われる仕組みです。
(ループ途中でエラー中断されたりしても、確実に後始末されます)

End Using の行に到達すると、reader.Dispose() が呼ばれる事になるのですが、
StreamReader は Dispose が呼ばれた段階で、自動的に Close される仕様ですので、
Using を使った場合は、Close を書かなくても構わないのです(Close を書いても OK です)。
引用返信 編集キー/
■84233 / inTopicNo.5)  Re[4]: csvを読み取り専用で読み込む方法
□投稿者/ ひろみ (3回)-(2017/06/01(Thu) 23:54:33)
魔界の仮面弁士様ご丁寧な回答ありがとうございます。
変数宣言を削除して問題は解決致しました。

以下のようにいたしましたが、処理のところにブレークポイントで処理を一旦止めて
csvをEXCELやサクラエディッタで開くと、使用中とメッセージが出てしまいます。


File_yosan = "yosan" & MYtoday.ToString("yyyyMM") & ".csv"
If System.IO.File.Exists(PATH_yosan & File_yosan) Then 'ファイルの有無を確認
Using reader As New StreamReader(New FileStream(PATH_yosan & File_yosan, FileMode.Open, FileAccess.Read, FileShare.Read))
k = 0
midasi = 1 'ゼロから開始
Do Until reader.EndOfStream
line = reader.ReadLine() '一行読込
If k >= midasi Then

'処理

End If
k = k + 1
Loop
End Using
End If
引用返信 編集キー/
■84234 / inTopicNo.6)  Re[5]: csvを読み取り専用で読み込む方法
□投稿者/ なちゃ (212回)-(2017/06/02(Fri) 00:09:02)
No84233 (ひろみ さん) に返信
> 魔界の仮面弁士様ご丁寧な回答ありがとうございます。
> 変数宣言を削除して問題は解決致しました。
>
> 以下のようにいたしましたが、処理のところにブレークポイントで処理を一旦止めて
> csvをEXCELやサクラエディッタで開くと、使用中とメッセージが出てしまいます。

アプリによっては読み書きアクセスでファイルを開くせいでしょう。
どうしても許可したいなら、FileShere.ReadWriteを指定すれば多分エラーはなくなるしょう。

ただしこの場合、読み込み途中に例えばExcelでファイルを上書き保存できてしまうため、
読み込んでいるCSVファイルの内容の一貫性が保たれない可能性もあることに注意してください。
引用返信 編集キー/
■84235 / inTopicNo.7)  Re[6]: csvを読み取り専用で読み込む方法
□投稿者/ ひろみ (4回)-(2017/06/02(Fri) 00:15:12)
なちゃ 様ご回答ありがとうございます。
解決致しました。
複数のプログラムがファイルを読み込む時に がちんこ してエラーにならなければよいので問題ございません。
ありがとうございます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -