0

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

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

while (true)
{
    string strEncrypted;
    int strLenght = 0;
    byte[] cryptedRGB;

    string imgCamFile = Environment.CurrentDirectory + "\\___imgCam\\_sentImg\\__empImg.bmp";
    if (File.Exists(@imgCamFile))
    {
        lock (@imgCamFile)
        {
            //if (camPictureBox.Image != null)
            //    camPictureBox.Image.Dispose();
            GC.Collect();
            System.IO.File.Delete(@imgCamFile);
            GC.Collect();
        }
    }

    strDataType = System.Text.Encoding.UTF8.GetBytes("Frame");
    strEncrypted = clsCryption.Encrypt("Frame");

    strDataType = new byte[strEncrypted.Length];
    foreach (char c in strEncrypted.ToCharArray())
    {
        strDataType[strLenght] = (byte)c;
        strLenght++;
    }
    if (optClient.Checked == true)
        mClient.Send(strDataType);
    else if (optServer.Checked == true)
        mServerHandler.Send(strDataType);

    MemoryStream Ms = new MemoryStream();
    camPictureBox.Image.Save(Ms, System.Drawing.Imaging.ImageFormat.Bmp);
    byte[] mData = Ms.GetBuffer();
    Ms.Close();
    Ms.Dispose();

    FileStream fileStream = new FileStream(imgCamFile, FileMode.Create, FileAccess.Write);
    fileStream.Write(mData, 0, mData.Length);
    fileStream.Close();
    fileStream.Dispose();

    Bitmap bitmap = new Bitmap(imgCamFile);
    Size mS = bitmap.Size;

    string[,] RGB = new string[mS.Width * 3, mS.Height];
    int realWodth = mS.Width * 3;
    byte[] myRGB = new byte[realWodth * mS.Height];

    int cCounter = 0;
    int pRow = 0;

    for (int y = 0; y < mS.Height; y++)
    {
        cCounter = 0;
        for (int x = 0; x < mS.Width; x++)
        {
            Color pixColor = bitmap.GetPixel(x, y);

            RGB[cCounter, y] = pixColor.R.ToString(); ++cCounter;
            RGB[cCounter, y] = pixColor.G.ToString(); ++cCounter;
            RGB[cCounter, y] = pixColor.B.ToString(); ++cCounter;

            myRGB[pRow] = Byte.Parse(pixColor.R.ToString()); pRow++;
            myRGB[pRow] = Byte.Parse(pixColor.G.ToString()); pRow++;
            myRGB[pRow] = Byte.Parse(pixColor.B.ToString()); pRow++;
        }

    }

    int sent;
    if (optClient.Checked == true)
        sent = SendVarData(mClient, myRGB);
    else if (optServer.Checked == true)
        sent = SendVarData(mServerHandler, myRGB);

    System.Threading.Thread.Sleep(4000);
}
4

3 回答 3

0

我相信这是问题所在:

 Bitmap bitmap = new Bitmap(imgCamFile);

您永远不会将位图设置为 null,以便保持路径锁定。

于 2012-10-03T21:25:41.080 回答
0

为什么所有的步骤? Image -> MemoryStream -> FileStream -> BitMap

BitmapImage- 你确定它还不是camPictureBox.ImageaBitmap并且你不能用它来做你的计算吗?

如果不...

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
   }
}
于 2012-10-03T22:02:35.200 回答
0

恕我直言,我同意。你不应该打电话给垃圾收集器。C# 应该自动完成。只需处置所有对象以释放资源。

请记住,这不是必需的:

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

fileStream.Close();
fileStream.Dispose();

因为 dispose 隐式调用 close。

使用 Bitmap 类后释放资源:

Bitmap bitmap = new Bitmap(imgCamFile); 
bitmap.Dispose();
于 2012-10-03T21:34:00.667 回答