Page 1 sur 2

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

Publié : 01 Déc 2021 06:26
par ding
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.

Re: erreur(IOException: Sharing violation on path)

Publié : 01 Déc 2021 10:43
par jmhoubre
Peut-être File.Exists ?

Re: erreur(IOException: Sharing violation on path)

Publié : 01 Déc 2021 10:48
par jmhoubre
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" ?

Re: erreur(IOException: Sharing violation on path)

Publié : 01 Déc 2021 10:56
par boubouk50
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.

Re: erreur(IOException: Sharing violation on path)

Publié : 01 Déc 2021 12:09
par ding
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!

Re: erreur(IOException: Sharing violation on path)

Publié : 01 Déc 2021 13:15
par ding
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?

Re: erreur(IOException: Sharing violation on path)

Publié : 01 Déc 2021 15:43
par jmhoubre
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.

Re: erreur(IOException: Sharing violation on path)

Publié : 01 Déc 2021 18:30
par ding
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.

Re: erreur(IOException: Sharing violation on path)

Publié : 02 Déc 2021 16:25
par DevAmat
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.

Re: erreur(IOException: Sharing violation on path)

Publié : 02 Déc 2021 17:01
par boubouk50
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.