C# 删除while循环中被另一个进程使用的文件时出错

C# 删除while循环中被另一个进程使用的文件时出错,c#,.net,C#,.net,这是我的一段代码,我想删除一个文件(第12行) 但出现了一个错误:项目无法访问该文件,因为它正被c#中的另一个进程使用,正好是在while循环的第二次。我处理并关闭了每一个 反对 while(true) { 字符串加密; int strLenght=0; 字节[]为GB; 字符串imgCamFile=Environment.CurrentDirectory+“\\\\ uuuuuuu imgCam\\\\ uu sentImg\\\ uuuuu empImg.bmp”; if(File.Exis

这是我的一段代码,我想删除一个文件(第12行)

但出现了一个错误:项目无法访问该文件,因为它正被c#中的另一个进程使用,正好是在while循环的第二次。我处理并关闭了每一个 反对

while(true)
{
字符串加密;
int strLenght=0;
字节[]为GB;
字符串imgCamFile=Environment.CurrentDirectory+“\\\\ uuuuuuu imgCam\\\\ uu sentImg\\\ uuuuu empImg.bmp”;
if(File.Exists(@imgCamFile))
{
锁定(@imgCamFile)
{
//if(camPictureBox.Image!=null)
//camPictureBox.Image.Dispose();
GC.Collect();
System.IO.File.Delete(@imgCamFile);
GC.Collect();
}
}
strDataType=System.Text.Encoding.UTF8.GetBytes(“帧”);
强化加密=clsCryption.Encrypt(“帧”);
strDataType=新字节[strEncrypted.Length];
foreach(strengcrypted.ToCharArray()中的字符c)
{
strDataType[strLenght]=(字节)c;
strLenght++;
}
if(optClient.Checked==true)
mClient.Send(strDataType);
else if(optServer.Checked==true)
mServerHandler.Send(strDataType);
MemoryStream Ms=新的MemoryStream();
camPictureBox.Image.Save(Ms,System.Drawing.Imaging.ImageFormat.Bmp);
字节[]mData=Ms.GetBuffer();
Close女士();
Dispose女士();
FileStream FileStream=newfilestream(imgCamFile,FileMode.Create,FileAccess.Write);
Write(mData,0,mData.Length);
fileStream.Close();
Dispose();
位图位图=新位图(imgCamFile);
大小mS=位图。大小;
字符串[,]RGB=新字符串[mS.Width*3,mS.Height];
int realWodth=毫秒宽度*3;
字节[]myRGB=新字节[realWodth*mS.Height];
int cCounter=0;
int-pRow=0;
对于(int y=0;y
我认为这就是问题所在:

 Bitmap bitmap = new Bitmap(imgCamFile);

您从未将位图设置为null,这样就可以在路径上保持锁定。

Imho,我同意。您不应该调用垃圾收集器。C#应该自动完成。只需释放所有对象即可释放资源

请记住,这不是必需的:

Ms.Close();
Ms.Dispose();

fileStream.Close();
fileStream.Dispose();
因为dispose隐式调用close

使用位图类后释放资源:

Bitmap bitmap = new Bitmap(imgCamFile); 
bitmap.Dispose();

为什么所有的步骤<代码>图像->内存流->文件流->位图

Bitmap
是一个
图像
——您确定
camPictureBox.Image
不是一个
位图
,您不能用它进行计算吗

如果不是

using(var bitmap = new Bitmap(camPictureBox.Image))
{
   // do your calculations
}
。。。或者

using (var ms = new MemoryStream())
{
   camPictureBox.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);

   using (var bitmap = new Bitmap(ms))
   {
       // do your work
   }
}

您需要执行GC.Collect()——一个设计良好的程序不需要执行这样的操作——这是一个非常糟糕的迹象——为什么您觉得需要这样做?这段代码至少需要分解成多个方法。我已经使用内存流读取了帧中的所有字节,并将其更改为字节。然后使用文件流保存它。并使用位图获取其大小并处理其像素。我有没有做错什么,或者你有没有什么更好的解决办法?我提出了三种不同的解决办法。您不需要将其保存到磁盘以在代码中使用——FileStream步骤完全没有必要。
using (var ms = new MemoryStream())
{
   camPictureBox.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);

   using (var bitmap = new Bitmap(ms))
   {
       // do your work
   }
}