より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

「別のプロセスで使用されているため、プロセスはファイルにアクセスできない」ってどのプロセス?

C#でファイルの読み込み処理を実装するのであれば

        public void ReadTest()
        {
            var fileName = @"C:\Work\Develop\TryBlazorStrap\WebApplication1\Startup.cs";
            string text = File.ReadAllText(fileName);
        }
        public void ReadTest()
        {
            var fileName = @"C:\Work\Develop\TryBlazorStrap\WebApplication1\Startup.cs";
            using (StreamReader sr = new StreamReader(fileName)) 
            {
                string line;
                while ((line = sr.ReadLine()) != null) 
                {
                    Console.WriteLine(line);
                }
            }
        }

などかと思いますが、

System.IO.IOException : 別のプロセスで使用されているため、プロセスはファイル '{ファイル名}' にアクセスできません。

といったエラーが発生することがあります。

f:id:rimever:20190331224858p:plain

これは他のプロセスが読み書きロックしているケースです。

f:id:rimever:20190331224958p:plain
この場合はSakura Editorで読み書き禁止としています

どのプロセスがロックしているのか

ProcessExplorerはタスクマネージャーよりも詳細なプロセス情報を確認することのできるツールです。

f:id:rimever:20190329074758p:plain

このツールで、あるプロセスがファイルを掴んでいて削除できない場合の原因のプロセスを突き止めることが可能です。

ダウンロード

Process ExplorerはSysinternal Suiteのツールの一つです。

Sysinternal Suiteは一式ダウンロードしておいて損はないと思います。

Sysinternals Suite

各ツールの概要はこちら

調査方法

Process Explorerを起動し、Ctrl+Fで検索ウインドウを表示します。

f:id:rimever:20190331225556p:plain

こうしたエラーの発生する可能性は簡単に起きうる

Excelを出力するようなアプリケーションですと、

  1. 既に存在するExcelがある
  2. しかも開いたまま
  3. Excelの出力ファイルパスを既存のExcelを上書きする形で出力
  4. Excelが読み書きロックをしているので例外発生。

割と簡単に起こせるケースです。

この可能性を踏まえてエラーをキャッチしてユーザーに適切に伝えてあげられると親切です。

読み書きする際には制御には気をつけよう

複数のアプリが一つのファイルを書き込みしており、片方が読み込みをするだけに読み書きロックをしているために、書き込みしていないというケースがありました。

厳密に行うのであればトランザクションのあるデータベースを使うといったアーキテクチャ変更が望ましいです。

が、現実、アーキテクチャ変更は1ヶ月で出来るようなものではありません。読み込みアプリで読み書きロックを行わず、例外をキャッチという対応を行いました。

やや手間になりますが、FileStreamを使うことになります。下記サイトで述べられています。

ファイルをロック(アクセスを制限)する - .NET Tips (VB.NET,C#...)