はじめに
C#でDirectory.Moveを使ってフォルダを移動しようとした際、
「アクセスが拒否されました」という例外が発生することがあります。
System.IO.IOException: Access to the path is denied.
ファイルやフォルダの権限を確認しても問題がないのになぜか移動できない…
その原因は、Windowsエクスプローラーでフォルダを開いているだけという意外な落とし穴でした。
原因
Windowsでは、エクスプローラーでフォルダを開いているだけで、
そのフォルダにロックがかかることがあります。
特に以下のような状況では、Directory.Moveが失敗する可能性があるようです。
・フォルダをエクスプローラーで開いている
・フォルダ内のファイルをプレビューしている(画像、PDFなど)
・サムネイル表示が有効になっている
・フォルダに対して他のプロセスがアクセスしている(検索インデックスなど)
対策
当たり前ですが、実行前に対象フォルダを開いているエクスプローラーウィンドウをすべて閉じましょう。
もしくはファイル単位での移動方法に実装を変更するのもありです。
※他にもファイルロックを確認するツールの私用やリトライ処理を入れる対策もありますが、運用で解決できるのであれば私は不要かなと思います。
さいごに
Directory.Moveで「アクセスが拒否されました」と出たら、
まずはエクスプローラーを閉じることを試してみましょう。
意外と見落としがちなポイントですが、これだけで解決することも多いと思います。
※自分の場合、フォルダ内のファイルをいちいち変えてテストしていたので完全に開きっぱでした…