进程无法访问图像文件,因为它正被另一个进程使用

Posted

技术标签:

【中文标题】进程无法访问图像文件,因为它正被另一个进程使用【英文标题】:process cannot access the image file because it is being used by another process 【发布时间】:2013-11-18 05:14:26 【问题描述】:

我从我部署的网站下载图像并将其保存到我的 WPF 应用程序文件夹中,基本上我正在运行 2 个平台,一个网站和 WPF。我想做的是用户使用网络上传他们的图像,所以在 WPF 方面,我从网络下载图像并显示在我的 WPF 应用程序上,但我收到了这个错误:

进程无法访问文件 'C:\Users\apr13mpsipa\Desktop\OneOrganizer\OneOrganizer\bin\Debug\TaskImage\Fill 在blanks.jpg'中,因为它正在被另一个进程使用。

这是代码:

 protected void DownloadData(string strFileUrlToDownload, string taskName)
    


        WebClient client = new WebClient();
        byte[] myDataBuffer = client.DownloadData(strFileUrlToDownload);

        MemoryStream storeStream = new MemoryStream();

        storeStream.SetLength(myDataBuffer.Length);
        storeStream.Write(myDataBuffer, 0, (int)storeStream.Length);

        storeStream.Flush();

        currentpath = System.IO.Directory.GetCurrentDirectory() + @"\TaskImage\" + taskName + ".jpg"; //folder to contain files.

        using (FileStream file = new FileStream(currentpath, FileMode.Create, System.IO.FileAccess.ReadWrite)) // ERROR HERE
        
            byte[] bytes = new byte[storeStream.Length];
            storeStream.Read(bytes, 0, (int)storeStream.Length);
            file.Write(myDataBuffer, 0, (int)storeStream.Length);
            storeStream.Close();
        

        //The below Getstring method to get data in raw format and manipulate it as per requirement
        string download = Encoding.ASCII.GetString(myDataBuffer);


    

当我尝试在第一次单击按钮时显示图像时出现错误,然后我在另一个按钮上再次显示图像。基本上,当我尝试显示图像 2 次时,就会发生这种情况。

---编辑 ------

更新为 baldrick 的评论:

 DownloadData(fileUploadDirectory + daoTask.GetImage(aid, actTask.taskID).Substring(1), daoTask.GetTaskName(aid, actTask.taskID));
            Image imgActivityTask = new Image();
            imgActivityTask.Height = 90;
            imgActivityTask.Width = 90;
            imgActivityTask.Margin = new Thickness(10);

            BitmapImage img = new BitmapImage();
            img.BeginInit();
            img.UriSource = new Uri(currentpath, UriKind.Absolute);
            img.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
            img.EndInit();
            imgActivityTask.Source = img;

它仍然在使用行上给我同样的错误。

【问题讨论】:

您能否准确说明您何时收到错误消息?是在这段代码中吗?哪条线?如果没有,你能把代码贴到出现错误的地方吗? 已更新,请检查我的编辑。它在使用线 我们可以看到加载图像的 WPF 代码吗?我认为 WPF 图像在加载时会锁定文件。您可能需要在图像对象上指定设置以阻止这种情况发生。 【参考方案1】:

在您的 WPF 代码中,您可能需要指定 IgnoreImageCache 设置:

yourImage.CacheOption = BitmapCacheOption.OnLoad;
yourImage.CreateOptions = BitmapCreateOptions.IgnoreImageCache

这可能会强制它加载,而不是锁定文件。

答案here处理同样的问题。

【讨论】:

hi =) 感谢您的回复,错误仍然存​​在,请检查我的更新【参考方案2】:

我猜你正在打开文件流。

不确定为什么要创建内存流(顺便说一句,不要忘记关闭内存流),以及当您已经拥有字节时创建文件流?为什么不直接使用File.WriteAllBytes 写入文件?

        WebClient client = new WebClient();
        byte[] myDataBuffer = client.DownloadData(strFileUrlToDownload);            
        currentpath = System.IO.Directory.GetCurrentDirectory() + @"\TaskImage\" + taskName + ".jpg"; //folder to contain files.

        File.WriteAllBytes(currentPath, myDataBuffer);

        //The below Getstring method to get data in raw format and manipulate it as per requirement
        string download = Encoding.ASCII.GetString(myDataBuffer);

【讨论】:

我没想到这是问题所在 - 文件流位于 OP 代码中的 using 块中。【参考方案3】:

不确定为什么要创建内存流(顺便说一句,不要忘记关闭内存流),以及当您已经拥有字节时创建文件流?为什么不使用 File.WriteAllBytes 直接写入文件?

    WebClient client = new WebClient();
    byte[] myDataBuffer = client.DownloadData(strFileUrlToDownload);            
    currentpath = System.IO.Directory.GetCurrentDirectory() + @"\TaskImage\" + taskName + ".jpg"; //folder to contain files.

    File.WriteAllBytes(currentPath, myDataBuffer);

    //The below Getstring method to get data in raw format and manipulate it as per requirement
    string download = Encoding.ASCII.GetString(myDataBuffer);

谢谢

【讨论】:

以上是关于进程无法访问图像文件,因为它正被另一个进程使用的主要内容,如果未能解决你的问题,请参考以下文章

dotnet publish 错误:该进程无法访问该文件,因为它正被另一个进程使用

System.IO.IOException: '该进程无法访问该文件,因为它正被另一个进程使用

该进程无法访问该文件,因为它正被另一个进程 Streamwriter 使用

IOException:该进程无法访问该文件,因为它正被另一个进程使用

该进程无法访问该文件,因为它正被另一个进程使用

错误“该进程无法访问文件'fileDir',因为它正被另一个进程使用。”尝试读取或写入文本文件时[重复]