アプリ版:「スタンプのみでお礼する」機能のリリースについて

言語:C# の質問です。(初心者 初めて1週間)

 ファイルの削除を行った際に、別プロセスが使用中で、
削除できなかった場合に対して、別処理を行いたいです。

 ファイルが削除できない場合は、エラーを取得することができるのですが、
 別プロセスが使用中のみの制御を入れたいと思っています。

 VB6では、ファイル削除(Kill)ができなかった場合に、
エラーコードを返して、該当するエラーコードのみに
別処理を行うことができていました。
 それと同じことを、C#でも行いたいです。

処理としては、
1.ファイルの削除を行う
2.ファイルの削除が出来なかった場合に対してのみ、
 別処理を入れる
 (別プロセスが使用中のため削除できないファイルに対して)

 このような処理を行いたいのですが、
ファイルが削除できなかった場合の、エラーコードを
求め方を色々調べてみたのですが、見つかりません。

下記ソースで、プログラムを作成中です。

try{
   System.IO.File.Delete(@削除するファイル名);
}
cach(System.IO.IOException)
{
  //ここでエラーコードを取得し、該当するエラーコードのみに
  //対して、別処理を入れたい
  MessageBox.Show(err.Message);
}

  MessageBox.Show(err.Message);
  ↑
  もし、エラーコードが取得できないのであれば、
 このエラーメッセージ文章に対してリテラルで制御をいれる
 ことも考えています。

どうか、ご教授ください。
よろしくお願いいたします。

A 回答 (3件)

あぁ、つまらないミスが・・・


if(errNum = (int)Win32Error.SharingViolation)
             ↓
if(errNum == (int)Win32Error.SharingViolation)

Visual Studio(Expressを除く)を使用しているのであれば、マイクロソフトがソースコードを公開しているので、ブレークポイントを仕掛けてロック時にどのようにIOExceptionがthrowされているのか追跡することもできるかと思います。
やり方は下記URLに解説されています。
http://www.atmarkit.co.jp/fdotnet/insiderseye/20 …

.NET Reflectorでもソースコードを確認できますが、ライセンス違反になるので。
    • good
    • 0

VB6はよく知りませんがGetLastError API相当でいいのであればMarshal.GetLastWin32Errorで判別できるのではないでしょうか?



enum Win32Error
{
  SharingViolation = 0x00000020,
}

int errNum = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
if(errNum = (int)Win32Error.SharingViolation)
{
  //ロックがかかっていた場合の処理。
}


当然ですがGetLastWin32Errorを実行するまでに別のエラーが発生した場合は上書きされてしまうので取得できません。
    • good
    • 0

IOExceptionにエラーコードのプロパティはありません。



ただ、IOExceptionのMessageプロパティが、プロセス排他の場合に次のようになります:
"別のプロセスで使用されているため、プロセスはファイル '(ファイル名が入ります)' にアクセスできません。"

ここは2番目のアイディアである、メッセージを引っかけるやり方で対応されてはいかがでしょうか。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!