none
System.IO.IOException: 'Il processo non può accedere al file 'D:GestioneDB\bin\Debug\Immagini\45.png' perché è in uso da un altro processo.' RRS feed

  • Domanda

  • Buongiorno,

    ho un applicativo tramite il quale è possibile gestire un database SQLite. Sono salvate una serie di voci alle quali è possibile associare una immagine, caricandola all'interno di una picturebox tramite una apposita finestra di dialogo:

    private void buttonAggiungiImmagine_Click(object sender, EventArgs e)
            {
                OpenFileDialog f = new OpenFileDialog();
                f.Filter = "Image files (*.jpg, *.jpeg, *.jpe, *.jfif, *.png) | *.jpg; *.jpeg; *.jpe; *.jfif; *.png";
    
                if (f.ShowDialog() == DialogResult.OK)
                {
                    try
                    {   
                        imageFile = System.Drawing.Image.FromFile(f.FileName);
                        pictureBoxImage.Image = imageFile;   
                    }
                    catch
                    {
                    }
                }
            }

    Quando si salva un nuovo elemento l'immagine viene salvata automaticamente in una apposita cartella, e nominata con l'id dell'elemento stesso. Per fare questa operazione utilizzo la seguente funzione:

    private void saveImage(string filePath)
            {
                
                    Bitmap bmp1 = new Bitmap(pictureBoxImage.Image);
    
                    if (System.IO.File.Exists(filePath))
                        System.IO.File.Delete(filePath);
    
                    bmp1.Save(filePath, System.Drawing.Imaging.ImageFormat.Png);
    
                    // Dispose of the image files.
                    bmp1.Dispose();
                
            }
    Fin qui funziona tutto correttamente. Il problema nasce se provo a caricare un'elemento già salvato all'interno del programma per modificarlo. Quando carico un'elemento già salvato in precedenza, viene anche caricata l'immagine all'interno della picturbox:
    pictureBoxImage.Image = System.Drawing.Image.FromFile(imagePath);

    A questo punto se l'utente prova a caricare una nuova immagine, e ad effettuare un salvataggio, ottengo l'errore del titolo. Presumo che la causa sia che, anche se carico una nuova immagine nella picturebox, quella "vecchia" risulta ancora in uso. Come si può ovviare alla cosa?

    Grazie mille in anticipo.

    Antonio

    mercoledì 24 giugno 2020 10:57

Risposte

  • Ciao, in realtà l'errore che ti da è relativo al comando di cancellazione del file (System.IO.File.Delete(filePath).

    Puoi risolvere facilmente, utilizzando un FileStream per caricare l'immagine nella PictureBox:

    namespace PictureBox { public partial class Form1 : Form { public Form1() { InitializeComponent(); string filePath = @"D:\motore4.png"; using (FileStream fs = new FileStream(filePath, FileMode.Open)) { pictureBoxImage.Image = Image.FromStream(fs); fs.Close(); }

    //salva il file dopo le modifiche SaveImage(filePath); } private void SaveImage(string filePath) { Bitmap bmp1 = new Bitmap(pictureBoxImage.Image); if (System.IO.File.Exists(filePath)) System.IO.File.Delete(filePath); bmp1.Save(filePath, System.Drawing.Imaging.ImageFormat.Png); // Dispose of the image files. bmp1.Dispose(); } } }

    Prova, e vedrai che funziona ;)



    mercoledì 24 giugno 2020 18:36

Tutte le risposte

  • Ciao, in realtà l'errore che ti da è relativo al comando di cancellazione del file (System.IO.File.Delete(filePath).

    Puoi risolvere facilmente, utilizzando un FileStream per caricare l'immagine nella PictureBox:

    namespace PictureBox { public partial class Form1 : Form { public Form1() { InitializeComponent(); string filePath = @"D:\motore4.png"; using (FileStream fs = new FileStream(filePath, FileMode.Open)) { pictureBoxImage.Image = Image.FromStream(fs); fs.Close(); }

    //salva il file dopo le modifiche SaveImage(filePath); } private void SaveImage(string filePath) { Bitmap bmp1 = new Bitmap(pictureBoxImage.Image); if (System.IO.File.Exists(filePath)) System.IO.File.Delete(filePath); bmp1.Save(filePath, System.Drawing.Imaging.ImageFormat.Png); // Dispose of the image files. bmp1.Dispose(); } } }

    Prova, e vedrai che funziona ;)



    mercoledì 24 giugno 2020 18:36
  • Ciao, sono riuscito a controllare solo ora! Sembra funzionare tutto correttamente! Grazie mille!

    mercoledì 1 luglio 2020 09:08