找不到C#路径的一部分

时间:2015-09-08 08:00:30

标签: c# .net winforms filestream system.io.file

我在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();
}

非常感谢您对此的帮助

3 个答案:

答案 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中禁用“安全性”选项卡>“自定义级别”>“将文件上传到服务器时包括本地目录路径”中的一项设置,然后重试。

当您将站点添加到受信任的站点时,将启用此设置。从信任列表中删除您的网站,或手动禁用此设置,此问题将得到解决。

类似地,如果您在其他浏览器上也遇到相同的问题,请查找以上设置并将其标记为“禁用”,问题将得到解决。