2015-09-08 10 views
1

Мое приложение в winforms C# и моей форме необходимо получить изображение из базы данных и сохранить на локальном компьютере (там, где установлено мое приложение) и просмотрено в элементе управления PictureBox.Не удалось найти часть пути C#

У меня есть следующий код (сохранить изображение локально, так и для просмотра в контроле 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(); 
     } 
    } 
} 

Afer установка приложения на ПК и при перезагрузке компьютера и пытается открыть приложение, то к этой форме приложение распадается. Но после перезапуска приложения (не ПК) у меня не возникает никаких проблем.

Ниже приведены данные журнала ошибок.

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

Действительно ценим вашу помощь на этом

+1

Вы можете отлаживать и сказать, что значение принадлежит '@ strfn'? Скорее всего, файл не может быть открыт, потому что он 1. Не существует (неправильный путь) или 2. У вас нет разрешения на его открытие. – Marcus

+0

В папке есть слово TEMP: оно удаляется чем-то при перезапуске ПК? –

+0

@Marcus Значение в strfn равно «C: \ Program Files \ Autoscan \ STKPTA \ TEMP \ 1100101308617311119720900« Временная папка создается там, где установлено мое приложение. Путь правильный. Когда я перезапускаю свое приложение, я не сталкиваюсь с этой проблемой. Спасибо – David

ответ

3

Возможно, ваш каталог не получает созданный .. Это лучше не глотать свои исключения. Удалите TRY/поймать из этого куска кода и проверить, если ошибка здесь:

if (!exists) 
    Directory.CreateDirectory(folder); 
else 
{ 
    Directory.Delete(fullpath, true); 
    Directory.CreateDirectory(folder); 
} 

Я думаю, что ваше приложение не имеет права доступа на запись в папку Program Files.

+0

Поскольку приложение запускается под учетной записью администратора, оно может создавать и записывать в папке Program Files. Если мы иногда удаляем блок try/catch, если каталог не может быть удален, потому что он используется другим процессом, получит исключение – David

+0

Создание временных файлов в папке под программными файлами по-прежнему остается действительно плохой практикой. – Nyerguds

+0

У меня есть несколько программ, которые создают и удаляют папки, и нам пришлось поместить их в цикл и выйти, когда папка была создана/удалена, так как мы столкнулись с проблемами с файловой системой, отстающей от приложения. –

0

Из вашего кода, то, что вы называете это папкой «темп», и тем фактом, что вы даже не потрудились отслеживать имена создаваемых вами файлов, я вроде бы сомневаюсь, что у вас действительно есть причина для сохранения образ на диск.

Вы можете просто сделать объект изображения прямо из байтов, и назначить его на свой контроль:

byte[] bgImg = ???; // your code to fetch the bytes from the DB 
    Image imgFromDb; 
    using (MemoryStream ms = new MemoryStream(bgImg)) 
    { 
     imgFromDb = Image.FromStream(ms); 
    } 
    picBox1.Image = imgFromDb; 
+0

Проблема не в папке «temp». Даже если я меняю имя папки на «ФАЙЛЫ» или «Изображения» в первый раз, когда мой компьютер перезагружается, мое приложение разбивается, когда я обращаюсь к этой форме. Для изображений я использовал объект изображения прямо из байтов и назначил его элементу управления. Но в другой форме мне нужно преобразовать байты в файл ** pdf ** и просмотреть файл в моей форме. Снова я создаю папку в BaseDirectory и загружаю файл. – David

+0

'using (FileStream objfilestream = new FileStream (sFile, FileMode.Create, FileAccess.ReadWrite)) { objfilestream.Write (mybytearray, 0, mybytearray.Length); objfilestream.Close(); } 'Этот кусок кода бросает одно и то же исключение. Просьба помочь – David

+0

Удалив этот фрагмент кода, мое приложение работает отлично 'fullpath = Path.Combine (путь, папка); bool exists = System.IO.Directory.Exists (fullpath); попробуйте { если (! Существует) Directory.CreateDirectory (папка); else { Directory.Delete (полный путь, правда); Directory.CreateDirectory (папка); }}} catch (Exception) {} 'Я также заменяю строковую переменную как' string fullpath = AppDomain.CurrentDomain.BaseDirectory; 'Любая идея Почему' Directory.CreateDirectory (folder) 'генерирует исключение? – David