none
ASP.netでCSVファイル読み込み時にIOExceptionが発生する RRS feed

  • 質問

  • 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回目以降は

    ファイルアクセスできない状態です。

    どのようにすると解決できますでしょうか。

    2020年1月7日 2:36

すべての返信

  • 問題を再現できる必要最低限のサンプルコードをアップするとか、もっと情報を提供できませんか? それと開発環境を書いてください。

    今の質問で自分が想像できるのは(あくまで想像です)、StreamReader を Dispose していないのではないかとか、Dispose したが他の場所で再度開いて使われているのではないかという程度です。

    #質問者さんの会社名が表示されていますが、ここは世界中のだれでもアクセスできるインターネットに公開されていますので注意してください。
    2020年1月7日 3:18
  • Hoshinaです
    こんにちは

    まったく同じとまでは言い切れませんが、同様のエラーに遭遇したことがあります。

    画像ファイルをアップロードし、ブラウザに表示後、そのファイルの削除を短時間に繰り返すと(それぞれ、別々の画面です)
    削除時に、そのような事態が発生するというものでした。
    ある程度、時間間隔をあけると大丈夫だったと思います。
    かならずしも再現性がありませんでしたから、質問者さんの状況とは違っているかもしれません。
    その時は、Visual Studio に搭載されている IIS Express の制限ではないかと思い、それ以上追求しませんでした。

    可能でしたら、本番同等の IIS を立ててみるのがよいかもしれません。

    それでは

    2020年1月7日 5:57
  • 【追記】

    もう一つ、聞いた話かつ単なる想像ですが、

    StreamReader を Dispose すると、初期化する際にファイルを開くために Windows API を呼び出して取得したファイルハンドルを開放するという OS レベルの処置があると思いますが、Dispose の後の次に初期化するときのタイミングの問題で開放が間に合わず「別のプロセスで使用されているため」というエラーになるのかなぁ・・・

    と Hoshina さんのレスを見て思ったので追記しました。

    ただ、私が聞いた話はファイルへの書き込みがあったケースで(その場合当然書き込む時間がかかる)、質問者さんのケースのように読むだけということですと上の想像はハズレの可能性が大ですが。

    2020年1月8日 2:36
  • Hoshinaです
    私も「追記」します。

    ・画像ファイルのアップロードと削除の画面を、同じ IIS Express 上で、画面遷移して繰り返すと現象が起こりました
    ・画像ファイルのアップロードの処理を終えて IIS Express を終了し、削除の画面を別の IIS Express で開始すると
     この現象は起こりませんでした

    そこで、結論は同じになりますが、
    可能でしたら、本番同等の IIS を立ててみるのがよいかもしれません。

    ご自身のアプリケーションに問題があるのかどうかの切り分けにもなるかと思います。

    それでは

    2020年1月8日 4:58
  • 皆さん、回答ありがとうございました。

    結論から言いますと、CSVファイルの行数をチェックするため、読出しした際に

    ファイルを閉じていなかったのが原因でした。

    解決したのでクローズいたします。

    2020年1月10日 1:03
  • > 結論から言いますと、CSVファイルの行数をチェックするため、読出しした際にファイルを閉じていなかったのが原因でした。

    ということは、私の最初のレスで書いた私の想像、

    > StreamReader を Dispose していないのではないかとか、Dispose したが他の場所で再度開いて使われている

    のどちらか(後者と想像)が当たっていたということですか?

    2020年1月10日 1:54
  • もぐりん1さん、こんにちは。フォーラムオペレーターのクモです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    本件、解決されたようでなによりです。

    [回答としてマーク]機能は設定された投稿が後から参照しやすくなりますので、
    同じ問題でお困りの方のためにも参考になった投稿に設定いただけますと幸いです。

    お手数ですが、ご協力の程どうかよろしくお願いいたします。

    引き続きMSDNフォーラムをご利用いただけますようお願い申し上げます。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年1月13日 2:08
    モデレータ