DOBON.NET DOBON.NETプログラミング掲示板過去ログ

他で読込み中ファイルの読込み

環境/言語:[Win2000 VB.NET 1.1]
分類:[.NET]

現在、
sr = New System.IO.StreamReader(Pass, System.Text.Encoding.GetEncoding(932))
で、テキストファイルを読込んでいますが、
他のアプリケーションで読込中の場合、
他のアプリケーションで使用中の例外が発生しますが
Windowsのメモ帳などでは開けます。

メモ帳同様、開けるようにしたいのですが
どのような方法をとればよいでしょうか?
こんにちは、じゃんぬ です。

■No11838に返信(DEGさんの記事)
> メモ帳同様、開けるようにしたいのですが
> どのような方法をとればよいでしょうか?

共有モードで開く。
じゃんぬねっとさん、返信有難うございます

■No11845に返信(じゃんぬねっとさんの記事)
> 共有モードで開く。

StreamReader
FileStreamなどのヘルプを見直してみましたが、
共有させない、みたいなのはあるようですが、
それらしいのが見つかりません。
よければ、具体的な方法を示していただけませんか

ちなみに、VB5の別アプリでは
単に、Open Pass for Binary As #1 で開いて、
InputBを使っていますが読込めました。
共有モードで開くときは、FileStreamを介するしかなかったと思います。
以下、MSDNからコピペです。

Dim fs As FileStream
fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)
Dim SrAsciiFromStream As StreamReader = New StreamReader(fs, _
System.Text.Encoding.ASCII)
KJさん、返信ありがとうございます。
さっそく試してみましたが、

■No11853に返信(KJさんの記事)
> fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)
ここで、例外が発生します。
"プロセスはファイル "***" にアクセスできません。このファイルは別のプロセスが使用中です。"

ちなみに、テストのための先に読込中のアプリケーションでは
Dim fs As New System.IO.FileStream(dtPass, System.IO.FileMode.Open)
Dim sr As New System.IO.StreamReader(fs, System.Text.Encoding.GetEncoding(932))
で、オープンして、IDEのブレークポイントで止めています。
たしかこのあたりが参考になると思いますです。。。はい。

ハズしてたらごめんなさい。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemiofilemodeclasstopic.asp
■No11862に返信(HogeHogeさんの記事)
> ハズしてたらごめんなさい。

はずしてるかもです。
FileMode自体は今回は関係ないです。
開け方ではなく、開いた時のアクセスの制御が問題。

FileShareの方でしょう。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfSystemIOFileShareClassTopic.asp

ただ、そろそろ、じゃんぬさんが言ってる「共有モードで開く。」の本当の意味に気付くべきですね。
他のアプリケーション云々の話なんですよね?
> ちなみに、VB5の別アプリでは
> 単に、Open Pass for Binary As #1 で開いて、
> InputBを使っていますが読込めました。
Pass ではなく、Pathなのでは……という疑問はさておき、
sr = New System.IO.StreamReader(Pass, System.Text.Encoding.GetEncoding(932))
にて開かれているファイルをメモ帳が読みこめているのは、VB5でいえば、
Open FileName For Input Access Read Shared As #FileNo
のようなモードで開かれているからでしょう。

もし、これが
Open FileName For Input Access Read Lock Read As #FileNo
あるいは、
Open FileName For Output Access Write Shared As #FileNo
などで開かれようとした場合は、実行時エラーになるはずです。


> Dim fs As New System.IO.FileStream(dtPass, System.IO.FileMode.Open)
> Dim sr As New System.IO.StreamReader(fs, System.Text.Encoding.GetEncoding(932))

そのモードで開いている最中は、
FileStream(〜, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
のようにして開くことができるかと。
HogeHogeさん、はいこーんさん、魔界の仮面弁士さん
返信有難うございます。

■No11864に返信(魔界の仮面弁士さんの記事)
> FileStream(〜, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
FileShare.ReadWrite で読めました。

■No11862に返信(HogeHogeさんの記事)
>開け方ではなく、開いた時のアクセスの制御が問題。
先にOpenしたほうが、FileShare.Readだったら
後続Openも、FileShare.Readで開けたということですね。

FileShareの意味を取り違えていました。
どうも有難うございました。
解決済み!
おおぅ!、失礼しました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板