[RESOLU] Erreur(IOException: Sharing violation on path)

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
ding
Messages : 7
Inscription : 27 Août 2021 10:52

[RESOLU] Erreur(IOException: Sharing violation on path)

Message par ding » 01 Déc 2021 06:26

Bien le bonjour,

J'ai un programme qui exécute un fichier .bat pour créer une image et une seconde plus tard je charge cette image avec : img04.LoadImage(File.ReadAllBytes("" + fileName));

Cela fonction bien sauf exceptionnellement, si je laisse tourner mon programme pendant plusieurs heures, il finit par avoir l’erreur suivante :

IOException: Sharing violation on path D:\Unity project\imagerie64\screen4.png

L'erreur est située sur cette ligne-ci : img04.LoadImage(File.ReadAllBytes("" + fileName));

Je suppose que je dois la mettre dans une condition qui vérifie l’accès avant de charger l'image mais je ne trouve pas comment faire cela...

Quelqu'un peut-il m'aider pour solutionner ce problème?

merci d'avance pour votre aide.

Avatar de l’utilisateur
jmhoubre
Messages : 601
Inscription : 05 Oct 2019 22:05

Re: erreur(IOException: Sharing violation on path)

Message par jmhoubre » 01 Déc 2021 10:43

Peut-être File.Exists ?

Avatar de l’utilisateur
jmhoubre
Messages : 601
Inscription : 05 Oct 2019 22:05

Re: erreur(IOException: Sharing violation on path)

Message par jmhoubre » 01 Déc 2021 10:48

Il est possible que le programme tente d'écrire sur le fichier en cours de lecture. Je suis tenté de dire ceci malgré
une seconde plus tard je charge cette image
parce que
si je laisse tourner mon programme pendant plusieurs heures,
.
Combien d'images sont crées en "plusieurs heures" ?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5683
Inscription : 28 Avr 2014 11:57
Localisation : Allériot (71)

Re: erreur(IOException: Sharing violation on path)

Message par boubouk50 » 01 Déc 2021 10:56

Le sharing violation (violation de partage) signifie que tu essaies d'accéder à un fichier qui est verrouillé par un autre programme, en l'occurrence surement par le .bat qui crée l'image.
En gros, tu essaies d'accéder à l'image alors qu'elle n'a pas fini son processus de création. Il faut donc t'assurer qu'elle soit créée et relâchée.

Pour ce faire, je conseillerai de boucler sur un test d'ouverture fait dans un Try/Catch pour lever l'exception.
Tant que l'ouverture du fichier lève une exception, attendre un peu, puis recommencer, jusqu'à ce que l'ouverture se fasse sans erreur.
Un exemple: https://stackoverflow.com/questions/130 ... -file-lock

Pour l'explication, je pense que le temps écoulé dans l'application et en dehors ne soit pas synchronisé, du coup, au bout d'un certain moment, tu n'as plus une seconde d'attente, mais bien moins et l'image n'est donc pas encore finalisée.
Il faudrait que ton .bat envoie un signal à Unity lorsque la création d'une image aboutit pour ne plus se baser sur le temps.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

ding
Messages : 7
Inscription : 27 Août 2021 10:52

Re: erreur(IOException: Sharing violation on path)

Message par ding » 01 Déc 2021 12:09

Merci de votre aide,

Il y a une image toute les 2 secondes, donc je dirais 2000 à 6000 images avant de voir l'erreur apparaitre mais c'est irrégulier... ça fonctionne la plupart du temps.

Il doit effectivement y avoir un retard (lag? décalage?) qui fait que le fichier bat est toujours entrain de modifier l'image au moment où j’essaye de la charger... mais comment savoir si l'image est disponible avant de tenter de la charger?

Ha je viens de voir la réponse de boubouk50, je pense que c'est bien ça que je cherche : "faire un Try/Catch pour lever l'exception"

Je suis sur le lien que vous m'avez donné et j’essaye de comprendre comment ça fonctionne, merci bien, je reviens après!

ding
Messages : 7
Inscription : 27 Août 2021 10:52

Re: erreur(IOException: Sharing violation on path)

Message par ding » 01 Déc 2021 13:15

Savez-vous comment forcer l'erreur à se produire pour pouvoir tester plus facilement les solutions?

J'ai enlevé le délai de 1 seconde mais ça ne déclenche pas l'exception...
J'ai ouvert le png dans paint.net mais ça ne déclenche pas l'exception non plus...


Sinon, je cherche actuellement comment adapter l'exemple a mon code, mais ne serait-il possible que ça soi aussi simple que ça :

Code : Tout sélectionner

try
{
	   img04.LoadImage(File.ReadAllBytes("" + fileName));
}
catch (Exception e)
{
	   Console.WriteLine("L'image est occupée !", e.ToString());
}
Cela déclenchera toujours une erreur ou il se contentera d'envoyer un message console et passera à la suite?

Avatar de l’utilisateur
jmhoubre
Messages : 601
Inscription : 05 Oct 2019 22:05

Re: erreur(IOException: Sharing violation on path)

Message par jmhoubre » 01 Déc 2021 15:43

Pour déclenche l'erreur, modifie ton .bat pour qu'il ne créé pas d'image, ou dans Unity essaie de lire une image inexistante.

ding
Messages : 7
Inscription : 27 Août 2021 10:52

Re: erreur(IOException: Sharing violation on path)

Message par ding » 01 Déc 2021 18:30

Voilà qui est fait, l'erreur créée n'est pas vraiment identique car l'image est absente au lieu d’être inaccessible mais cela m'a suffi pour voir que le simple Try/Catch que j'ai ajouté permet d’éviter les erreurs !

Le lien de boubouk50 permet de faire la même chose mais en mieux, il réessaye d'y accéder tant qu'il n'a pas réussi avec un certain délai et un nombre de tentatives maximum.
Je n'ai pas encore réussi à l'adapter à mon code, je bloque sur plusieurs petits trucs... j’irai relire tout ça et avec un peu de recule ça ira mieux.

Mais pour l'instant la solution simple me convient.
Le "Try/Catch" permet d'éviter l'erreur et de passer à la suite, c'est bien ce que je cherchais à faire!

Je dois encore faire quelques teste pour m'assurer que ça fonctionne dans la pratique et avec l'erreur d'origine "Sharing violation on path".

Mais je pense (et j’espère) que mon problème est résolu!

Encore merci pour votre aide!

Et bonne soirée.

Avatar de l’utilisateur
DevAmat
Messages : 423
Inscription : 23 Nov 2016 11:50

Re: erreur(IOException: Sharing violation on path)

Message par DevAmat » 02 Déc 2021 16:25

Pour tester, génère ton image. Sauvegarde là et ouvre la avec un logiciel puis essaye d'y accéder avec ton script.
J'avais ce genre de problème en parcourant via un script un Excel ouvert avec libre office par exemple.

Mais dans ton cas je ne sais pas si tous les logiciels vont "lock" ton image. A tester.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5683
Inscription : 28 Avr 2014 11:57
Localisation : Allériot (71)

Re: erreur(IOException: Sharing violation on path)

Message par boubouk50 » 02 Déc 2021 17:01

Pas mal de logiciels aujourd'hui ne bloquent plus les données mis à part lors de la sauvegarde.
Tout est en RAM avant d'écrire sur le disque donc les données brutes sont souvent disponibles.
Il faudrait plutôt qu'il sauvegarde une image énorme (pour que le temps d'écriture soit long) en même temps qu'essayer d'y accéder pour avoir une chance de tester en direct.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « Scripting »