System.IO 例外"The process cannot access the file because it is being used by another process."



我的程序使用Telerik ASyncUpload控件来允许用户上传图像。该控件已配置为仅接受图像,并且在其 FileUpload 事件中,有一些额外的代码执行一些额外的工作(调整大小(两次)并转换为 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)将存在,但在退出例程时,我收到错误。

我尝试关闭和处理所有图像以及文件。输入流,但仍会看到错误。我还尝试查看是否可以丢弃上传文件,但没有发现该方法存在。

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

谢谢。

在 Imagaining Save 方法 MSDN 页上有一个注释:

将图像保存到构建它的同一文件中不是 允许并引发异常。

尝试使用其他名称保存您的文件。如果这是不可能的,你可以通过先将文件读取到内存(即使用内存流)来解决此问题。

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

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

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

我用以下方式替换了它:

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

并且错误消失了。

相关内容

最新更新