C#でファイル操作などのWindowsに関わる操作を行うと内部的にはWindows APIが呼ばれます。
WindowsAPIはC#ではないので、エラーになったときにはC++的な形でエラーコードを返します。
それをC#でラッピングしてあるので、C#でExceptionとしてエラーを取得する事ができます。
C#のExceptionのメッセージだと大まかな分け方しかしていないので詳細に知りたい場合はHResultの値を調べます。
try{ }catch(Exception e ){ e.HResult // <- こいつについての話 }
例えばファイルを置換に失敗した場合 IOException になります。
try{ System.IO.File.Replace(sourceFileName, destFileName, null); }catch( IOException e ){ // e.Message → 置換されるファイルを削除できません。 // e.HResult → -2147023721 }
int型の表示でマイナスの値が表示されますが、所詮ビットデータなので2進数表示で確認します。
更に上位下位として半分ずつにします。
2進数:1000000000000111 0000010010010111 16進数:0x8007 0x0497
で、これがなんなんだっていうと 上位の0x8007はWin32エラーコードということを示しています。
下位の0x0497がエラーの番号です。
ERROR_UNABLE_TO_REMOVE_REPLACED 1175 (0x497)
置換されたファイルを削除できませんでした。置換されるファイルと置換ファイルの名前は、元のまま変更されていません。
ReplaceFileA function | Microsoft Docs
こんな感じでWindows APIのエラーコードにたどり着くことができます。