質問者
ASP.netでCSVファイル読み込み時にIOExceptionが発生する

質問
-
ASP.NETでStreamReaderクラスを使用してCSVファイル(aaa.csvとbbb.csv)読み込みを行い、
クローズ処理を行ってから、再度同じCSVファイル(bbb.csv)を開こうとするとIOExceptionが発生します。
メッセージは、「別のプロセスで使用されているため、プロセスはファイル'bbb.csv'にアクセスできません」
と表示され、IIS Express Worker Processが該当のファイルをロックしていることまでは
確認できたのですが、IIS Express Worker Processのタスクを終了するまでファイル削除もできない状態です。
aaa.csvには何度でもファイルアクセスはできるのですが、bbb.csvには最初の1回のみアクセス出来て、2回目以降は
ファイルアクセスできない状態です。
どのようにすると解決できますでしょうか。
すべての返信
-
問題を再現できる必要最低限のサンプルコードをアップするとか、もっと情報を提供できませんか? それと開発環境を書いてください。
今の質問で自分が想像できるのは(あくまで想像です)、StreamReader を Dispose していないのではないかとか、Dispose したが他の場所で再度開いて使われているのではないかという程度です。
#質問者さんの会社名が表示されていますが、ここは世界中のだれでもアクセスできるインターネットに公開されていますので注意してください。- 編集済み SurferOnWww 2020年1月7日 3:22
-
Hoshinaです
こんにちはまったく同じとまでは言い切れませんが、同様のエラーに遭遇したことがあります。
画像ファイルをアップロードし、ブラウザに表示後、そのファイルの削除を短時間に繰り返すと(それぞれ、別々の画面です)
削除時に、そのような事態が発生するというものでした。
ある程度、時間間隔をあけると大丈夫だったと思います。
かならずしも再現性がありませんでしたから、質問者さんの状況とは違っているかもしれません。
その時は、Visual Studio に搭載されている IIS Express の制限ではないかと思い、それ以上追求しませんでした。
可能でしたら、本番同等の IIS を立ててみるのがよいかもしれません。
それでは
-
【追記】
もう一つ、聞いた話かつ単なる想像ですが、
StreamReader を Dispose すると、初期化する際にファイルを開くために Windows API を呼び出して取得したファイルハンドルを開放するという OS レベルの処置があると思いますが、Dispose の後の次に初期化するときのタイミングの問題で開放が間に合わず「別のプロセスで使用されているため」というエラーになるのかなぁ・・・
と Hoshina さんのレスを見て思ったので追記しました。
ただ、私が聞いた話はファイルへの書き込みがあったケースで(その場合当然書き込む時間がかかる)、質問者さんのケースのように読むだけということですと上の想像はハズレの可能性が大ですが。- 編集済み SurferOnWww 2020年1月10日 4:26
-
> 結論から言いますと、CSVファイルの行数をチェックするため、読出しした際にファイルを閉じていなかったのが原因でした。
ということは、私の最初のレスで書いた私の想像、
> StreamReader を Dispose していないのではないかとか、Dispose したが他の場所で再度開いて使われている
のどちらか(後者と想像)が当たっていたということですか?- 編集済み SurferOnWww 2020年1月10日 4:25
-
もぐりん1さん、こんにちは。フォーラムオペレーターのクモです。
MSDNフォーラムにご投稿くださいましてありがとうございます。
本件、解決されたようでなによりです。
[回答としてマーク]機能は設定された投稿が後から参照しやすくなりますので、
同じ問題でお困りの方のためにも参考になった投稿に設定いただけますと幸いです。
お手数ですが、ご協力の程どうかよろしくお願いいたします。
引き続きMSDNフォーラムをご利用いただけますようお願い申し上げます。MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~