进程无法访问图像文件,因为它正被另一个进程使用
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 使用