System.IO异常“进程无法访问该文件,因为它正由另一个进程使用。”

时间:2012-08-07 05:57:54

标签: c# telerik

我的程序使用Telerik ASyncUpload控件以允许用户上传图像。该控件已配置为仅接受图像,并且在其FileUploaded事件中,还有一些额外的代码执行一些额外的工作(调整大小(两次)并转换为JPEG)。

但是,在下面的代码块完成并且我的图像被保存之后,程序抛出一个System.IO异常:“进程无法访问该文件,因为它正由另一个进程使用。”

        protected void RadAsyncUpload1_FileUploaded(object sender, FileUploadedEventArgs e) {
        ListViewItem lvwItem = lvwItems.EditItem;
        RadAsyncUpload upl = (RadAsyncUpload)lvwItem.FindControl("RadAsyncUpload1");

        string target = MapPath(upl.TargetFolder);

        try
        {
            foreach (UploadedFile file in upl.UploadedFiles) {

                using (Bitmap originalImage = new Bitmap(file.InputStream)) {

                    System.Drawing.Image cloneImage = (Bitmap)originalImage.Clone();

                    // Resize the picture to max 200 * 200
                    Size mySize = new Size(200, 200);
                    cloneImage = Imaging.resizeImage(originalImage, mySize);

                    // Create a bitmap from the cloned image. Bitmap is needed for saveJpeg routine
                    Bitmap newImage = new Bitmap(cloneImage);

                    // Convert to jpg if necessary
                    if (file.GetExtension() != ".jpeg" || file.GetExtension() != ".jpg") {
                        Imaging.saveJpeg(Path.Combine(target, file.GetNameWithoutExtension() + ".jpg"), newImage, 100);
                    }
                    else {

                    }

                    // Now create a thumbnail
                    Size thumbSize = new Size(50, 50);
                    cloneImage = Imaging.resizeImage(originalImage, thumbSize);
                    Bitmap thumbImage = new Bitmap(cloneImage);
                    Imaging.saveJpeg(Path.Combine(target, file.GetNameWithoutExtension() + "_lille.jpg"), thumbImage, 100);

                    uploadedFileName = file.GetNameWithoutExtension() + ".jpg";
                }
            }
       }
       catch (IOException ex) 
        {

        }
    }

此时,两个文件(200 * 200和50 * 50)将存在,但退出例程后,我收到错误。

我尝试关闭并处理所有图像以及file.InputStream,但仍然看到错误。我也试过看看UploadedFile是否可以被丢弃,但是没有找到存在的方法。

我很确定它有一个简单的解决方案,但我已经盯着这几个小时了,根本就没有看到它。

感谢。

3 个答案:

答案 0 :(得分:3)

有关Imagaining Save方法MSDN page的评论:

  

将图像保存到其构造的同一文件中则不是   允许并抛出异常。

尝试使用其他名称保存您的文件。如果那是不可能的,你可以通过首先将文件读入内存来解决这个问题(例如,使用MemoryStream)。

答案 1 :(得分:2)

从任务栏中停止屏幕右下角的本地IIS服务器。

答案 2 :(得分:1)

事实证明我的错误是由行引起的:

using (Bitmap originalImage = new Bitmap(file.InputStream))

我将其替换为:

using (Stream fileStream = file.InputStream) {
   using (System.Drawing.Image originalImage = System.Drawing.Image.FromStream(fileStream)) {

并且错误消失了。