我在winforms中的应用程序c#和我的表单需要从数据库中检索图像并存储在本地计算机(我的应用程序安装位置)并在PictureBox控件中查看。
我有以下代码(在本地存储图像并在PictureBox控件中查看):
//dsProjects is a dataset which is retrieved from database
if (dsProjects.Tables[0].Rows.Count > 0)
{
int idxCurPageJob = (iPageNum * 8);
string path = AppDomain.CurrentDomain.BaseDirectory;
string folder = "TEMP";
string fullpath = string.Empty;
fullpath = Path.Combine(path, folder);
bool exists = System.IO.Directory.Exists(fullpath);
try
{
if (!exists)
Directory.CreateDirectory(folder);
else
{
Directory.Delete(fullpath, true);
Directory.CreateDirectory(folder);
}
}
catch (Exception)
{}
try
{
if (dsProjects.Tables[0].Rows.Count > idxCurPageJob)
{
pnl1.Visible = true;
pnl1.AccessibleName = dsProjects.Tables[0].Rows[idxCurPageJob][1].ToString();
Labelfld1.Text = dsProjects.Tables[0].Rows[idxCurPageJob][0].ToString();
byte[] bgImg = (byte[])dsProjects.Tables[0].Rows[idxCurPageJob][2];
string proCode = dsProjects.Tables[0].Rows[idxCurPageJob][3].ToString();
string strfn = Path.Combine(fullpath, proCode + Convert.ToString(DateTime.Now.ToFileTime()) + idxCurPageJob);
using (FileStream fs = new FileStream(@strfn, FileMode.Create, FileAccess.Write))
{
fs.Write(bgImg, 0, bgImg.Length);
fs.Flush();
fs.Close();
}
picBox1.Image = Image.FromFile(strfn);
picBox1.SizeMode = PictureBoxSizeMode.StretchImage;
picBox1.Refresh();
}
if (dsProjects.Tables[0].Rows.Count > (idxCurPageJob + 1))
{
pnl2.Visible = true;
Labelfld2.Text = dsProjects.Tables[0].Rows[idxCurPageJob + 1][0].ToString();
pnl2.AccessibleName = dsProjects.Tables[0].Rows[idxCurPageJob + 1][1].ToString();
byte[] bgImg = (byte[])dsProjects.Tables[0].Rows[idxCurPageJob + 1][2];
string proCode = dsProjects.Tables[0].Rows[idxCurPageJob + 1][3].ToString();
string strfn = Path.Combine(fullpath, proCode + Convert.ToString(DateTime.Now.ToFileTime()) + (idxCurPageJob + 1));
using (FileStream fs = new FileStream(@strfn, FileMode.Create, FileAccess.Write))
{
fs.Write(bgImg, 0, bgImg.Length);
fs.Flush();
fs.Close();
}
picBox2.Image = Image.FromFile(strfn);
picBox2.SizeMode = PictureBoxSizeMode.StretchImage;
picBox2.Refresh();
}
.....
}
catch (Exception ex)
{
StreamWriter sw;
DateTime dtLogFileCreated = DateTime.Now;
try
{
sw = new StreamWriter("Project Form crash-" + dtLogFileCreated.Day + dtLogFileCreated.Month + dtLogFileCreated.Year + "-" + dtLogFileCreated.Second + dtLogFileCreated.Minute + dtLogFileCreated.Hour + ".txt");
sw.WriteLine("### Server Crash ###");
sw.WriteLine("### Message : ###" + ex.Message + "### StackTrace : ###" + ex.StackTrace + "###Soruce : ###" + ex.Source + "### InnerException : ###" + ex.InnerException + "### Data : ###" + ex.Data + " ### END of LOG ###");
sw.Close();
}
finally
{
Application.Exit();
}
}
}
在PC中安装应用程序并重新启动PC并尝试打开应用程序然后到此表单应用程序崩溃。但重新启动应用程序(不是PC)后,我没有遇到任何问题。
以下是错误日志详细信息。
### Server Crash :### ### Message : ###Could not find a part of the path 'C:\Program Files\Autoscan Pte Ltd\STK PTA\TEMP\1100101308609520058907460'. ### StackTrace : ### at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access) at PTA.Forms.frmPIProject.SetCurrentPageProjects()###Soruce : ###mscorlib### InnerException : ###### Data : ###System.Collections.ListDictionaryInternal ### END of LOG ###
此错误发生在此行代码
中using (FileStream fs = new FileStream(@strfn, FileMode.Create, FileAccess.Write))
{
fs.Write(bgImg, 0, bgImg.Length);
fs.Flush();
fs.Close();
}
非常感谢您对此的帮助
答案 0 :(得分:3)
也许你的目录没有被创建..最好不要吞下你的例外。从这段代码中删除try / catch并检查错误是否在此处:
if (!exists)
Directory.CreateDirectory(folder);
else
{
Directory.Delete(fullpath, true);
Directory.CreateDirectory(folder);
}
我认为您的应用没有在Program Files文件夹中写入的正确权限。
答案 1 :(得分:0)
从你的代码,你称之为“临时”文件夹的事实,以及你甚至懒得跟踪你创建的文件的名称的事实,我有点怀疑你实际上有任何理由保存图像到磁盘。
您可以直接从字节中创建一个Image对象,并将其分配给您的控件:
byte[] bgImg = ???; // your code to fetch the bytes from the DB
Image imgFromDb;
using (MemoryStream ms = new MemoryStream(bgImg))
using (Image tmpImg = Image.FromStream(ms))
{
// Needs to be wrapped in "new Bitmap(Image img)" constructor to avoid
// the image being linked to and depending on the input stream.
imgFromDb = new Bitmap(tmpImg);
}
picBox1.Image = imgFromDb;
答案 2 :(得分:0)
进行任何更改之前,请确保您已授予文件夹和文件的完全权限。
我通过关闭浏览器中的一项设置解决了此问题。您可以在IE中禁用“安全性”选项卡>“自定义级别”>“将文件上传到服务器时包括本地目录路径”中的一项设置,然后重试。
当您将站点添加到受信任的站点时,将启用此设置。从信任列表中删除您的网站,或手动禁用此设置,此问题将得到解决。
类似地,如果您在其他浏览器上也遇到相同的问题,请查找以上设置并将其标记为“禁用”,问题将得到解决。