如何连续检查文件是否被删除,如果没有删除,请再试一次

时间:2012-08-15 10:04:02

标签: c# file

在我目前的项目中,我面临随机错误,抱怨有问题的文件被其他进程使用。

有时它行动迅速,一切都很好,有些时候它不会工作并且一直给我错误

  

该文件正由另一个进程

使用

所以我认为我将删除方法放在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;
    }
}

4 个答案:

答案 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; 
  }
}