该操作无法完成,因为该文件在IIS工作进程中打开

本文关键字:工作 IIS 进程 因为 操作 文件 | 更新日期: 2023-09-27 17:49:36

我正在为用户上传图片&将其保存在指定位置。代码在正常情况下工作良好,即用户选择图像&保存它,它可以工作。

用户选择图像(可能是错误的图像)&不要保存它,而是再次选择一个新图像&然后保存这个场景给出了错误:

"该进程不能访问该文件,因为它正在被另一个进程使用。"

当我试图从错误的位置删除图像时,文件无法删除,提示:

"操作无法完成,因为文件在IIS工作进程中打开关闭文件,然后再试一次。"

代码是这样的:

            try
            {
                if (!Directory.Exists(folder))
                    Directory.CreateDirectory(folder);
                msf = new MemoryStream();
                bytes=FileUpload1.FileBytes;
                msf.Write(bytes, 0, bytes.Length);
                using (FileStream stream = new FileStream(folder + "/" + filename, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
                {
                    //converting any graphic file type to jpeg format
                    Image img = Image.FromStream(msf);
                    img.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
                    msf.WriteTo(stream);
                    IsuploadSuccess = true;
                    img.Dispose();
                }
            }
            catch
            {
                IsuploadSuccess = false;
            }
            finally
            {
                if (msf != null)
                {
                    msf.Close();
                    msf.Dispose();
                }
            }

我已经尝试添加"FileAccess"。读写","文件共享。在文件流中读写,但不能对文件流中的所有选项都起作用

请帮…

该操作无法完成,因为该文件在IIS工作进程中打开

我没有找到问题的解决方案,而是最终改变了方法来摆脱挑战的来源。我改变文件名称与UserID(唯一)附加CurrentDateTime转换为字符串&将其存储到临时文件夹,直到用户保存更改。对于挑战场景,每次都会形成一个不同的文件。保存用户创建的临时文件夹(前面有唯一的userid)中的每个文件后,将删除&最后的更改保存到各自的目录。

我遇到了这个问题,花了几个小时才解决。在我的例子中,位图new(path)锁定了文件。我必须在使用块退出之前处理它。然而,我调试它的方法是重要的。我确定问题根源的方法是打开保存图像的文件夹,逐行跟踪代码。在每一行之后,我删除文件并按Ctrl+Z将其放回去。如果当我试图删除它时它给出了一个错误,那么这就是锁定它的行。因此,我在5分钟内到达了那一行。

using (MemoryStream memoryStream = new())
{
if (System.IO.File.Exists(path))
    {
        using(Bitmap bitmap = new(path))  <-- this solved it
        {
            ImageConverter imageConverter = new();
            bitmap.Save(memoryStream, ImageFormat.Bmp);
            bytes = memoryStream.ToArray();
        }
     }
 }