使用完毕后,无法删除已保存的图像文件

时间:2014-01-17 15:33:52

标签: c# .net image bitmap

我正在努力:

  1. 抓取图片并将其复制
  2. 操纵临时图像(调整大小,绘制等)
  3. 完成操作后保存到临时文件夹
  4. 将其上传到网络请求中
  5. 上传完成,现在删除临时图片
  6. 当只有1个线程正在运行时,这可以正常工作。当我添加多个线程时,我收到此错误...

      

    该进程无法访问文件'C:\ someimage.jpg',因为它正由另一个进程使用。

    以下是我正在使用的代码。运行此代码后,我运行上传方法。一旦完成,我尝试删除

    using (var img = Image.FromFile(filename))
    {
        using (var newImage = ImageHandler.ScaleImage(img, 640, 960))
        {
            using (Graphics gra = Graphics.FromImage(newImage))
            {
                gra.DrawImage(img, new Rectangle(Point.Empty, new Size(640, 960)));
    
                StringFormat sf = new StringFormat()
                {
                    Alignment = StringAlignment.Center
                };
    
                gra.DrawString(text, new Font("Helvetica", 32), Brushes.White, new RectangleF(0, newImage.Height / 2, newImage.Width, newImage.Height), sf);
                temp_filename = AppDomain.CurrentDomain.BaseDirectory + "/temp/" + GenerateDateTimeNowStamp() + ".jpg";
                newImage.Save(temp_filename);
            }
        }
    }
    
    
    //run upload method ...
    
    
    //delete temp file
    if(System.IO.File.Exists(temp_filename))
        System.IO.File.Delete(temp_filename);
    

2 个答案:

答案 0 :(得分:2)

我总是使用Guid.NewGuid().ToString()来创建我的临时文件名,然后它们就不会发生冲突......

var tempFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory , "temp");   
temp_filename = Path.Combine(tempFolder, Guid.NewGuid().ToString()); 

temp_filename = System.IO.Path.GetTempFileName();

哦,是的,我更喜欢使用path.Combine

答案 1 :(得分:1)

  

当只有1个线程正在运行时,这可以正常工作。当我添加超过1   线程我收到这个错误...

问题在于GenerateDateTimeNowStamp方法。即使n个线程调用GenerateDateTimeNowStamp,它将在特定时间返回相同的值,多个线程最终使用相同的文件,这就是为什么你不能删除而另一个线程可能正在使用它(保存的一半)。

根据@Damien_The_Unbeliever的评论建议,我建议使用Path.GetTempFileName()