【问题标题】:FileStream error - The process cannot access the file...used by another processFileStream 错误 - 进程无法访问文件...由另一个进程使用
【发布时间】:2015-01-31 21:01:53
【问题描述】:

我创建了一个从我的数据库中读取的方法,该数据库有一个存储图像的 blob 字段。 此方法用于读取图像以及所有其他字段。 当我运行我的应用程序时,它可以工作并且表单会显示所有详细信息,但是如果我关闭表单并重新打开它,我最终会出现此错误。

IO 异常未处理

在 mscorlib.dll 中发生了“System.IO.IOException”类型的未处理异常

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

我尝试将文件流对象放在 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
    }
}

【问题讨论】:

    标签: c# mysql .net blob filestream


    【解决方案1】:

    这是主要问题:

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

    您正在打开图像并使其保持打开状态。

    你有两条路要走:

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

    如果您没有很多图像,或者图像不是很大,或者您没有内存问题,我认为第一个更好。

    顺便说一句,您的代码有很多资源没有被释放(连接、流等)

    【讨论】:

    • 感谢您的回答,有很多错误,因为这只是从数据库加载详细信息的方法的测试代码。我会在尝试您的解决方案后立即纠正它们。
    • @NimazSheik 没有太多错误我太粗鲁了。您只有一些未处理的对象。只需将 IDisposable 的所有内容放入 using :D
    【解决方案2】:

    正如@giammin 所说,您正在打开一个文件,但从不关闭它。该代码还创建了很多应该被释放的资源。

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

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

    【讨论】:

      【解决方案3】:

      您确实应该在关闭 DatabaseConnector 后处理它。最好的做法是使用 Using 语句:

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

      或者,只需在调用 .CloseConnection() 后调用 dbcon.Dispose()

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

      【讨论】:

      • 感谢您的帮助,我会确保关闭所有连接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多