私の現在のプロジェクトでは、問題のファイルが他のプロセスによって使用されているという不平を言うランダムなエラーに直面しています。
高速に動作し、すべてがうまくいく場合もあれば、機能せず、エラーが発生し続ける場合もあります
ファイルは別のプロセスによって使用されています
したがって、削除メソッドを a 内に配置try-catch
し、キャッチ内に、ファイルを削除しようとする、またはさらに良い方法で、ロックを解除して削除できるようにするある種のループがあると考えました。
そのループ内で別の例外が発生するかどうか、およびそれを管理する方法がわかりません。そのプロセスをファイルから切り離し、削除できるようにする解決策を見つけるにはどうすればよいですか?
アップデート
これは現時点での私のコードです:
private void Test(string imagePath)
{
try
{
if (File.Exists(imagePath))
{
pictureBoxExistingPicture.Visible = true;
labelnew.Visible = true;
labelold.Visible = true;
pictureBoxExistingPicture.Image = ImageUtility.SafeLoadImage(imagePath);
if (MessageBox.Show("Do you want to overwrite the existing image?", "warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.Yes)
{
pictureBoxExistingPicture.Image = Properties.Resources._default;//restore default
while (true)
{
try
{
File.Delete(imagePath);
break;
}
catch (Exception)
{
}
}
pictureBoxHonarjo.Image.Save(imagePath);
}
else
{
pictureBoxHonarjo.Image = ImageUtility.SafeLoadImage(imagePath);//restore original image
}
pictureBoxExistingPicture.Visible = false;
labelnew.Visible = false;
labelold.Visible = false;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
件名の現在のコンテキストでは、ユーザーが画像を置き換えたい場合は、それを行う必要があり、長い時間がかからず、失敗するべきではないと言う必要があります.だから基本的に誰かがしようとしたとき画像を変更すると、わずかな時間で変更する必要があります。
SafeLoadImage
関数については、ここに私の実装があります:
public class ImageUtility
{
public static byte[] ImageToBytes(string FilePath, int FileLength)
{
FileStream fileStream = new FileStream(FilePath, FileMode.Open, FileAccess.Read);
BinaryReader breader = new BinaryReader(fileStream);
return breader.ReadBytes(FileLength);
}
public static Image SafeLoadImage(string imagePath)
{
byte[] image_byte;
Image image;
FileInfo fileinfo = new FileInfo(imagePath);
image_byte = ImageUtility.ImageToBytes(imagePath, (int)fileinfo.Length);
image = ImageUtility.BytesToImage(image_byte);
return image;
}
}