正在更新正在使用的文件

本文关键字:文件 更新 | 更新日期: 2023-09-27 18:19:09

在这里看到了一些例子,但它们似乎不符合我的水平。

我使用

设置了一个图像作为背景图像
if (ProductDetails.ProductBackPicFilePath != "")
{
mProdButList[i].BackgroundImage =  Image.FromFile(ProductDetails.ProductBackPicFilePath);
mProdButList[i].BackgroundImageLayout = ImageLayout.Stretch;
}  

在程序的一部分,而在管理部分,我有其他代码从数据库读取二进制数据,并创建一个图像文件加载。

internal bool CreateImage(string pStockCode)
    {
        FileStream fs;                         
        BinaryWriter bw;                        
        int mBufferSize = 100;                   
        byte[] mOutbyte = new byte[mBufferSize];  
        long mRetval;                            
        long mStartIndex = 0;                                
        string getImgSQL =
            "SELECT STOCK_CODE, STOCK_PICTURE " +
            "FROM STOCK_DETAILS " +
            "WHERE STOCK_CODE = '"+pStockCode+"'";
        using (FbConnection DBConn = new FbConnection(cs.ToString()))
        {
            using (FbCommand fbCmd = new FbCommand(getImgSQL, DBConn))
            {
                DBConn.Open();
                FbDataReader myReader = fbCmd.ExecuteReader(CommandBehavior.SequentialAccess);
                while (myReader.Read())
                {  
// ERROR HERE WHEN CREATING A NEW FILESTREAM
                    fs = new FileStream("Product Images''product_" + pStockCode + ".jpg", FileMode.OpenOrCreate, FileAccess.Write); 
                    bw = new BinaryWriter(fs);
                    mStartIndex = 0;
                    mRetval = myReader.GetBytes(1, mStartIndex, mOutbyte, 0, mBufferSize);
                    while (mRetval == mBufferSize)
                    {
                        bw.Write(mOutbyte);
                        bw.Flush();
                        mStartIndex += mBufferSize;
                        mRetval = myReader.GetBytes(1, mStartIndex, mOutbyte, 0, mBufferSize);
                    }
                    bw.Write(mOutbyte, 0, (int)mRetval);
                    bw.Flush();
                    bw.Close();
                    fs.Close();
                }
                myReader.Close();
                DBConn.Close();
            }
        }

        return true;
    }

我得到文件正在使用的错误,从技术上讲,它是另一种形式,因为它显示的图片仍然在后面的层。

问题是我能做些什么来强制它覆盖正在使用的图像?如果图像没有被显示,这个方法就会立即生效。

正在更新正在使用的文件

dot net依赖于windows操作系统函数来加载和显示图像。在显示图像时,Windows反过来锁定图像源文件。即使图像从显示中删除,也可能需要一些时间来解锁文件。

一种方法是在映像未被使用时显式地调用Dispose()。这将释放源文件。

正如您所说,您希望在显示第一个图像的同时显示另一个图像,您可以考虑在临时文件夹中生成图像并作为不同的临时文件。

另一种(有点奇怪)的方法是首先加载图像,但在应用它作为背景之前,克隆它。克隆的映像将完全存储在内存中,不会附加到文件中。然后处理源图像。设置克隆图像作为背景。

Image i1 = Image.FromFile(ProductDetails.ProductBackPicFilePath);
Image i2 = (Image)i1.Clone();
mProdButList[i].BackgroundImage = i2;
i1.Dispose();

解决方案:

if (ProductDetails.ProductBackPicFilePath != "")
{
     byte[] fileContents = System.IO.File.ReadAllBytes(ProductDetails.ProductBackPicFilePath);
     using (System.IO.MemoryStream ms = new System.IO.MemoryStream(fileContents))
     {
          mProdButList[i].BackgroundImage = Image.FromStream(ms);                               
     }
     mProdButList[i].BackgroundImageLayout = ImageLayout.Stretch;
}

在花了几个小时想办法解决这个问题之后,这就完成了工作!