2016-11-07 3 views
1

Я работаю с программой Winforms, которая была написана некоторое время назад. Я сталкивался с некоторыми проблемами с этим, и я пытаюсь оптимизировать способ обработки некоторых вещей, но я сталкиваюсь с некоторыми проблемами с удалением.Устранение изображения при использовании PictureBox

Ниже приводится то, что в настоящее время реализуется.

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

foreach (string s in files) 
{ 
    fileName = System.IO.Path.GetFileName(s); 
    destFile = System.IO.Path.Combine(path, fileName); 
    File.Copy(s, destFile, true); 
} 

Следующая, она открывает форму через ShowDialog:

frmPreview frm = new frmPreview(FileNameArray, lblParcel.Text); 
frm.ShowDialog(); 

Следующая, он идет в Preview форме и получает этот код:

try { 
    FlowLayoutPanel imagePanel = new FlowLayoutPanel(); 
    if (System.IO.Directory.Exists(path)) 
    { 
     folder = new DirectoryInfo(path); 

     foreach (FileInfo files in folder.GetFiles()) 
     { 
      System.Diagnostics.Debug.Print(files.Extension); 
      if ((string.Equals(files.Extension, ".jpg", StringComparison.OrdinalIgnoreCase)) || (string.Equals(files.Extension, ".gif", StringComparison.OrdinalIgnoreCase)) || (string.Equals(files.Extension, ".png", StringComparison.OrdinalIgnoreCase))) 
      { 
       PictureBox image = new PictureBox(); 
       image.Image = Image.FromFile(files.FullName); 
       image.SizeMode = PictureBoxSizeMode.Zoom; 
       image.Size = this.Size; 
       imagePanel.Controls.Add(image); 
      } 
     } 
    } 
    this.Controls.Add(imagePanel); 
    System.Threading.Thread.Sleep(0); 

    return; 
} 
catch 
{ 
} 

Кодекса выше в основном принимает все фотографии, создает PictureBox с каждым из них и добавляет PictureBox в FlowLayoutPanel для отображения в wi ndow для предварительного просмотра. Проблема заключается в том, что он не утилизируется должным образом и попадает после попытки посетить это окно предварительного просмотра в третий раз (закрытие окна и открытие его во второй раз отлично работает, но создает второй процесс).

Last, он реализует следующее, когда форма закрывается.

private void frmPreview_FormClosed(object sender, FormClosedEventArgs e) 
{ 
    this.Dispose(); 
    this.Close(); 
} 

ошибка происходит на 3-й раз в окне предварительного просмотра вызывается, когда программа проходит через foreach заявлении, размещенном в верхней части.

Полная линия, где она ловит является:

File.Copy(s, destFile, true); 

Процесс не может получить доступ к файлу 'C: \ Users \ имя пользователь \ Pictures \ Просмотр \ image.jpg', так как он используется другим обработать.

я 99,9% уверен, что это из-за PictureBox и FlowLayoutPanel, но я не могу понять, что нужно сделать, чтобы это исправить. Я хотел бы изменить как можно меньше, так как это не моя программа, и она скоро будет полностью переписана. Мне в основном просто нужно временно исправить проблему, пока мы не закончим большую картину, где вся эта программа будет утилизирована.

Я нашел пару сообщений, которые, похоже, похожи на проблемы, но ни одно из исправлений ничего не изменило. Ниже приведены все посты я посмотрел в и пытается реализации неудачно:

file-copy-the-process-cannot-access-the-file

file-is-being-used-by-another-process

dispose-of-a-picturebox

+0

использовать 'Image.FromStream' [этот путь] (HTTP: // stackoverflow.com/a/38830222/3110834). –

+0

С первого взгляда, похоже, это может быть то, что я искал. Я попробую. – Hank

+1

Также вам не нужно удалять форму после того, как вы ее закрыли. Если это диалоговая форма, используйте ее в используемом блоке, иначе вам не нужно использовать this.Dispose вообще. Вы можете взглянуть на этот пост [Мне нужно удалить форму после того, как форма закрыта?] (Http://stackoverflow.com/a/39501121/3110834) –

ответ

1

Выпуск фиксированной после реализации рекомендаций @RezaAghaei.Измененный Предварительный просмотр формы следующим образом:

foreach (FileInfo files in folder.GetFiles()) 
{ 
    System.Diagnostics.Debug.Print(files.Extension); 
    if ((string.Equals(files.Extension, ".jpg", StringComparison.OrdinalIgnoreCase)) || (string.Equals(files.Extension, ".gif", StringComparison.OrdinalIgnoreCase)) || (string.Equals(files.Extension, ".png", StringComparison.OrdinalIgnoreCase))) 
    { 
     using (var stream = new FileStream(files.FullName, FileMode.Open)) 
     { 
      PictureBox image = new PictureBox(); 
      image.Image = Image.FromStream(stream); 
      image.SizeMode = PictureBoxSizeMode.Zoom; 
      image.Size = this.Size; 
      imagePanel.Controls.Add(image); 
     } 
    } 
} 

Я также улучшили эффективность ShowDialog вызова путем реализации с помощью блока:

using (frmPreviewPhotos frm = new frmPreviewPhotos(NEWphotoFileNameArray, lblParcel.Text)) 
{ 
    frm.ShowDialog(); 
}