FileStream错误 - 进程无法访问另一个进程使用的文件

时间:2014-12-03 10:33:21

标签: c# mysql .net blob filestream

我创建了一个从数据库中读取的方法,数据库有一个存储图像的blob字段。 此方法用于读取图像以及每个其他字段。 当我运行我的应用程序时它工作,表单显示所有细节,但如果我关闭表单并再次重新打开它,我最终得到此错误。

  

IO异常未处理

     

mscorlib.dll中出现未处理的“System.IO.IOException”类型异常

     

其他信息:进程无法访问文件'C:\ Users \ MyName \ Documents \ Visual Studio 2013 \ Projects \ MyApp \ MyApp \ bin \ Debug \ pic0jpg',因为它正由另一个进程使用。“

我已经尝试将filestream对象放在using语句和其他解决方案中,但错误仍然存​​在。 任何帮助将不胜感激,谢谢。

public void loadPlane()
{
    //convert picture to jpg and load other details
    MySqlDataAdapter sqladapt;
    DataSet dataSet;
    DatabaseConnector dbcon = new DatabaseConnector();
    dbcon.OpenConnection();
    sqladapt = new MySqlDataAdapter();
    sqladapt.SelectCommand = dbcon.InitSqlCommand("SELECT * FROM plane");
    dataSet = new DataSet("dst");
    sqladapt.Fill(dataSet);
    dbcon.CloseConnection();

    DataTable tableData = dataSet.Tables[0];
    //use from iplane class
    IPlane.countPlane = tableData.Rows.Count;
    for (int i = 0; i < IPlane.countPlane; i++)
    {
        IPlane.planeObj[i] = new NormalPlane();
        DataRow drow = tableData.Rows[i];
        string plName = "pic" + Convert.ToString(i);

        FileStream FSNew = new FileStream(plName+"jpg",FileMode.Create);
        byte[] blob = (byte[])drow[5];
        FSNew.Write(blob,0,blob.Length);
        FSNew.Close();
        FSNew = null;

        IPlane.planeObj[i].PlaneImage=(Image.FromFile(plName + "jpg"));
        IPlane.planeObj[i].ModelNumber = drow[0].ToString();
        IPlane.planeObj[i].EngineType = drow[1].ToString();
        IPlane.planeObj[i].FlySpeed = Convert.ToInt32( drow[2]);
        IPlane.planeObj[i].SpecialFeature = drow[3].ToString();
        IPlane.planeObj[i].Price = Convert.ToDouble( drow[4]);
        IPlane.planeObj[i].EconSeats = Convert.ToInt32(drow[6]);
        IPlane.planeObj[i].BussSeats = Convert.ToInt32(drow[7]);
        IPlane.planeObj[i].FirstSeats = Convert.ToInt32(drow[8]);
        //drow 5 is the image
    }
}

3 个答案:

答案 0 :(得分:2)

关闭后你真的应该处理你的DatabaseConnector。最好的做法是使用Using Statement:

using (DatabaseConnector dbcon = new DatabaseConnector)
{
   // Code that uses connection. 
}

或者,在调用.CloseConnection()

之后调用dbcon.Dispose()

这将确保释放DatabaseConnection使用的所有资源。

答案 1 :(得分:2)

这是主要问题:

IPlane.planeObj[i].PlaneImage=(Image.FromFile(plName + "jpg"));

您正在打开图像并将其打开。

你还有两种方法:

  • 使用blob中的内存流创建图像,而不是文件
  • 将图像创建为文件,并使用图像的路径作为属性IPlane.planeObj[i].PlaneImage,并在需要时加载文件。 (我不会理解为什么你在db上将图像保存为blob然后再创建文件)

如果您没有很多图像,或者它们没有那么大或者您没有记忆问题,我认为第一个更好。

顺便说一下,你的代码有很多资源没有处理(连接,流等等)

答案 2 :(得分:2)

正如@giammin所说,你正在打开一个文件,但从未关闭它。该代码还会创建大量应该处理的资源。

此外,您根本不需要保存文件,除非您想在以后使用它。您可以使用Image.FromStream从流中创建Image对象。您可以将缓冲区包装在MemoryStream中并将其传递给Image.FromStream,例如:

using(var stream=new MemoryStream(drow[5]))
{
    var image=Image.FromStream(stream);
    Plane.planeObj[i].PlaneImage = image;
}
相关问题