2016-08-19 2 views
2

Я использую два windows forms, первая форма будет иметь несколько файлов изображений заселенных в datagridview и на второй форме все эти изображения размещены в другом datagridview управления, второй datagridview управления есть кнопка, как Delete Image что удалит файл.
после того, как я нажму кнопку «Исключение кнопки», возникает, когда файл используется. но я alread разместил datagridview, а также очистил его строки, но все же он вызывает не освобождение изображения. Я уже пытался позвонить GC.Collect(); Метод, но это не помогло. мой пример кода ниже.
памяти/ресурсов не выпустили

На первой форме:

// Commenting the code above 
if (validuser) 
{ 
    dgvImages.Rows.Clear(); 
    dgvImages.Dispose(); 

    GC.Collect(); 
    var form = new NewForm(); 
    form.Show(); 
    this.Hide(); 
} 

и на второй форме:

private void dgvImages_CellContentClick(object sender, DataGridViewCellEventArgs e) 
{ 
    try 
    { 
    if (e.ColumnIndex == 1) 
    { 
     string selectedpath = dgvImages.Rows[e.RowIndex].Cells[2].Value.ToString(); // this cell contains the full path of the image 
     if (File.Exists(selectedpath)) 
     { 
     dgvImages.Rows.Clear(); 
     dgvImages.Dispose(); 

     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 

     File.Delete(selectedpath); 

     LoadImages(); 
     } 
    } 
    } 
    catch (Exception ex) 
    { 
    MessageBox.Show(ex.Message); // File is in use 
    } 
} 

EDIT: Вот как я загрузка изображений

private void LoadImages() 
{ 

if (Directory.Exists(path)) 
{ 
    DirectoryInfo dir = new DirectoryInfo(path); 
    FileInfo[] files = dir.GetFiles(); 

    foreach (var f in files) 
    { 
    if (f.Extension.ToLower() == ".jpg" || f.Extension.ToLower() == ".png" || f.Extension.ToLower() == ".bmp" || f.Extension.ToLower() == ".tiff") 
    { 
     dgvImages.Rows.Add((Image.FromFile(f.FullName)), "Delete Image" ,f.FullName); 
    } 
    } 
    } 
} 
+0

Как вы * * погрузочные изображения в сетке? –

+0

Позвольте мне включить мой метод LoadImages(); 'в сообщение тоже! – CodeIt

+0

Ни dgvImages.Rows.Clear(), ни dgvImages.Dispose() будет вызывать метод Dispose() любого из изображений, которые вы используете. DGV не может знать, может ли изображение использоваться в другом месте, поэтому оно не может безопасно это сделать. Вы должны сами позаботиться об этом. GC.Collect() сам по себе тоже недостаточно хорош, вам также нужно вызвать GC.WaitForPendingFinalizers(). Если это еще не освобождает блокировку, вы используете изображение в другом месте. –

ответ

1

По умолчанию, когда вы используете Image.FromFile, он блокирует файл до отображения изображения.

В соответствии с ресурсами MSDN

https://msdn.microsoft.com/en-us/library/4sahykhd(v=vs.110).aspx

То, что вы хотите сделать, это загрузить изображения в соответствии с этим ответом здесь.

Open Image from file, then release lock?


Image img; 
using (var bmpTemp = new Bitmap("image_file_path")) 
{ 
    img = new Bitmap(bmpTemp, true); 
} 

Согласно новой Bitmap документации, вам может понадобиться, чтобы получить его, чтобы использовать ICM.

https://msdn.microsoft.com/en-us/library/3135s427(v=vs.110).aspx

Используйте этот конструктор, чтобы открыть изображения со следующими форматами файлов: BMP, GIF, EXIF, JPG, PNG и TIFF.

+0

Я очень ценю ответ, но он вызывает исключение аргумента в классе Program.cs. он говорит, что параметр недействителен. – CodeIt

+0

Попробуйте новый битмап («file_location», true); Это позволит получить растровое изображение для использования icm в соответствии с документацией. https://msdn.microsoft.com/en-us/library/3135s427(v=vs.110).aspx В соответствии с примечаниями, используйте этот конструктор для открытия изображений со следующими форматами файлов: BMP, GIF, EXIF, JPG, PNG и TIFF. –

+0

Это был лучший ответ, я никогда не знал, что «Image.FromFile' помещает замок в изображение. Большое спасибо!! – CodeIt

1

Image.FromFile() метод блокировки файлов по GDI +

Загрузить изображение из потока, используя следующий код:

public Image GetmageFromStream(string path) 
{ 
    using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) { 
    var img = Image.FromStream(fs); 
    return img; 
      } 
} 
Смежные вопросы