2 votes

IOException Copie de fichier non gérée. Lors du téléchargement d'une image à partir d'une boîte à images

Aidez-nous ! Je ne sais pas comment fermer le fichier. Il me donne toujours un fichier IOException, quelque chose comme il est utilisé par un autre processus

Voici mon code

private void uploadpic_btn_Click(object sender, EventArgs e)
{
    open_dialog = new OpenFileDialog();

    open_dialog.Title = "Open picture";
    open_dialog.Filter = "JPEG (*.jpg;*.jpeg;*.jpe;*.jfif)|*.jpg";

    if (open_dialog.ShowDialog() != DialogResult.Cancel)
    {
        uploadpic_pb.BackgroundImage = Image.FromFile(open_dialog.FileName);
        uploadpic_pb.BackgroundImageLayout = ImageLayout.Stretch;
        uploadpic_pb.BorderStyle = BorderStyle.FixedSingle;
    }
}

private void saveBTN_Click(object sender, EventArgs e)
{
    string targetPath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "\\Pictures");
    string destFile = Path.Combine(targetPath, "Copied.jpg");

    if (!Directory.Exists(targetPath))
    {
        Directory.CreateDirectory(targetPath);
    }

    File.Copy(open_dialog.FileName, destFile, true);
}

private void Form1_Load(object sender, EventArgs e)
{
    Image myimage = Image.FromFile(@"C:\Pictures\Copied.jpg");

    uploadpic_pb.BackgroundImage = myimage;
    uploadpic_pb.BackgroundImageLayout = ImageLayout.Stretch;
    uploadpic_pb.BorderStyle = BorderStyle.FixedSingle;
}

L'exception renvoie

Le processus ne peut pas accéder au fichier ' C:\Pictures\Copied.jpg parce qu'il est utilisé par un autre processus.

3voto

Hans Passant Points 475940

Image.FromFile() place un verrou d'écriture sur le fichier. Form1_Load() place donc un verrou sur Copied.jpg. Vous appuyez ensuite sur le bouton uploadpic_btn pour assigner un nouveau bitmap à la propriété BackgroundImage. En appuyant ensuite sur saveBTN, vous risquez toutefois d'échouer de la manière dont vous avez écrit le code. Copied.jpg est encore bloqué, l'objet Image existe toujours. Il ne disparaît qu'au moment de l'exécution du ramasse-miettes.

Pour éviter cette attente, vous devez disposer de l'image. Corrigez :

    if (open_dialog.ShowDialog() != DialogResult.Cancel)
    {
        if (uploadpic_pb.BackgroundImage != null) uploadpic_pb.BackgroundImage.Dispose();
        uploadpic_pb.BackgroundImage = Image.FromFile(open_dialog.FileName);
        // etc...
    }

1voto

sajoshi Points 1993

Essayez d'utiliser une variable de niveau de classe pour le nom de fichier au lieu de targetPath, en y ajoutant éventuellement une date pour le rendre unique. Gardez overwrite = false dans File.copy et voyez si cela fonctionne. Il s'agit simplement d'un test pour vérifier que le fichier Copied.Jpg est utilisé.

Compilez également la solution en mode release et essayez d'exécuter l'EXE directement à partir de la corbeille au lieu de Visual Studio. Parfois, le processus d'aide de Visual Studio bloque les fichiers.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X