正在更新正在使用的文件
本文关键字:文件 更新 | 更新日期: 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;
}
在花了几个小时想办法解决这个问题之后,这就完成了工作!