在我目前的项目中,我面临随机错误,抱怨有问题的文件被其他进程使用。
有时它行动迅速,一切都很好,有些时候它不会工作并且一直给我错误
该文件正由另一个进程
使用
所以我认为我将删除方法放在try-catch
中并且在catch中我有一些尝试删除文件或更好的循环:解锁它并使其准备好被删除。< / p>
我不知道是否在该循环内我得到另一个异常,以及如何管理它。如何找到解决方案从文件中分离该进程,并准备删除?
这是我目前的代码:
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;
}
}
答案 0 :(得分:1)
行
所以你有一些伪代码,如:
success = false
while not success
..try
.. delete file
.. success = true
..catch
.. wait a second
while end
你可以添加一个重试计数器,这样它就不会无休止地循环等,你可以猜到哪里有运气。
我故意不包含代码,因为你没有提供任何代码,但给你一个可以尝试的模板
答案 1 :(得分:1)
这是一个尝试删除文件的循环:
protected virtual bool IsFileLocked(FileInfo file)
{ FileStream stream = null;
try
{
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException)
{
//the file is unavailable because it is:
//still being written to
//or being processed by another thread
//or does not exist (has already been processed)
return true;
}
finally
{
if (stream != null)
stream.Close();
}
//file is not locked
return false;
}
FileInfo file = new FileInfo("PathToTheFile");
while (IsFileLocked(file))
Thread.Sleep(1000);
file.Delete();
您还可以使用Process explorer来了解对文件http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
的访问权限答案 2 :(得分:1)
ImageUtility.ImageToBytes
不会处理FileStream
这可能是锁定文件吗?
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);
}
考虑using
语句,该语句将在执行退出代码块后释放资源(它包装IDisposable并为您调用dispose方法):
public static byte[] ImageToBytes(string FilePath, int FileLength)
{
using(FileStream fileStream = new FileStream(FilePath, FileMode.Open, FileAccess.Read))
{
BinaryReader breader = new BinaryReader(fileStream);
return breader.ReadBytes(FileLength);
}
}
这可能是您的文件被锁定的原因。
当然如果其他人锁定你的文件,那么这可能没用:)但我怀疑这些是你创建/正在处理的图像文件
答案 3 :(得分:0)
我使用MessageBox的简单解决方案:
bool deleted= false;
while(!deleted)
{
try
{
File.Delete("path to file");
deleted = true;
}
catch
{
MessageBox.Show("You can't delete file. Close file and press 'OK'");
deleted = false;
}
}