Problème avec openfiledialog

Résolu
MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 - Modifié le 27 août 2017 à 10:48
MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 - 20 juin 2019 à 12:07
Bonjour,
Après plus de trente ans de pratique de plusieurs dizaines de langages, je viens de passer au C# (il est grand temps !)

Malgré quelques errements dans la jungle des classes du framework.net, j'arrive maintenant à produire du code qui fonctionne.

J'ai cependant affaire à une erreur dont je n'ai trouvé aucune réponse sur le net, et dont je n'arrive pas à comprendre la cause.

J'utilise plusieurs fois dans mon application une instance d'OpenFileDialog de la façon suivante :

OpenFileDialog OpenFile = new OpenFileDialog();
OpenFile.CheckFileExists = true;
OpenFile.InitialDirectory = sPath;
OpenFile.Filter = msFileFilter;
OpenFile.Title = ksPrompt;
OpenFile.Multiselect = true;
try
{
r = OpenFile.ShowDialog();
}
catch (Exception ex)
{
EH.TraiteErreur(ex);
}
if (r == DialogResult.Cancel)
{
OpenFile.Dispose();
return;
}
.....
Openfile.Dispose();

sPath est le dernier chemin utilisé, par exemple C:\users\MGD\Documents lorsque aucun autre n'est mémorisé.

Or, au PREMIER appel de la classe (et encore, pas à chaque fois), j'ai le message d'erreur suivant : "Il n'y a pas de disque dans le lecteur. Insérez un disque dans le lecteur \Device\Harddisk2\DR2" (voir l'image de la boite de dialogue ci-dessous).
http://static.ccm2.net/codes-sources.commentcamarche.net/pictures/UhXiOqRGEfDJSuqqE9UURtTHaQhuuxai5nYJYNKwqBS4rundJPVt8NYSRGkdlRd3-erreur-openfiledialog.png

Je précise que l'erreur n'est pas traitée par le catch, mais provient directement du système (en fait, vraisemblablement pas le framework). Un point d'arrêt dans le catch n'est jamais atteint, et la procédure TraiteErreur n'est pas appelée.

Le chemin indiqué ressemble à un chemin Linux, or je suis sous Windows 7.
Dans le gestionnaire de disque, le disque 2 correspond à un lecteur de cartes, qui n'en contient pas.

Quel que soit le bouton sur lequel on clique (Annuler/Recommencer/Continuer), la boite se ferme et l'application se poursuit sans autre problème (heureusement), et la boite de dialogue s'ouvre normalement. Mais ce n'est quand même pas très propre pour une application que l'on souhaite diffuser.

Pourquoi la boite de dialogue va chercher à ouvrir ce disque à la première ouverture, et pas sur les suivantes ??

sPath est mémorisé et placé dans un fichier ini. Il change donc régulièrement. Cependant, quelque soit sa valeur, l'erreur se produit à la première création d'instance de la session, lors de l'appel de Show(). La boite est utilisée par plusieurs routines différentes (avec une nouvelle instance à chaque fois), mais seul le premier appel de la session provoque l'erreur.

Pendant le développement, j'ai effectivement utilisé ce lecteur pour faire des essais. Cependant, la propriété InitialDirectory ne contient plus trace de ce lecteur, et le fait d'utiliser une instance neuve à chaque fois devrait donner une boite n'ayant pas de "mémoire".

Quelqu'un a une idée ??
Merci de vos conseils

6 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
27 août 2017 à 19:00
Bonsoir

Tu dis : Or, au PREMIER appel de la classe (et encore, pas à chaque fois), j'ai le message d'erreur suivant : "Il n'y a pas de disque dans le lecteur. Insérez un disque dans le lecteur \Device\Harddisk2\DR2".

cela signifie que tu fais un OpenfileDialog sur un lecteur physique soit non partitionné soit sans support .
Il faut vérifier si le répertoire sPath existe avant de chercher à ouvrir des fichiers !

0
MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 2
Modifié le 27 août 2017 à 19:23
Je pense que tu n'as pas tout bien lu, et cette réponse est quelque peu vexante.

J'ai bien précisé que la propriété InitialDirectory pointait sur un répertoire existant sur D: (donc n'ayant rien à voir avec le lecteur indiqué dans le message). La propriété FileName est laissée vide, puisqu'on n'a pas de de nom de fichier (c'est justement ce qu'on demande).

Il est évident que la première chose que j'ai faite, c'est de mettre un point d'arrêt sur l'appel de la boite et vérifié la valeur de sPath, qui pointe bien vers un répertoire existant.

Après plus de trente ans de programmation, je ne pense pas être encore victime de ce genre de négligence.

C'est comme si, à un garagiste chevronné en train de chercher une panne d'allumage, tu demandais s'il y a de l'essence dans le réservoir...

La réponse que je souhaite, c'est la raison pour laquelle la boite cherche à tout prix à ouvrir un lecteur inexistant alors que je lui en indique un autre, et que de toute façon elle ouvre ce dernier correctement après que j'aie répondu au message d'erreur.

Je précise que cette erreur ne se produit que sur le poste de développement, et pas sur les autres. Ce n'est donc pas très grave, car les essais de déploiement que j'ai effectués montrent que l'erreur ne se produit pas sur les postes où l'application est installée. Mais je n'aime bien comprendre les choses qui me paraissent incompréhensibles.

Moi, j'aime fusionner la théorie et la pratique, contrairement à ton slogan...
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
27 août 2017 à 20:28
Désolé si je te parais vexant ! Mais je ne vois pas en quoi !
Mais je maintiens ma réponse et c'est toi qui es vexant à mon avis .

Moi je mettrais un point d'arrêt sur l'instruction
OpenFile.Filter = msFileFilter; 
et je regarderais ce que vaut sPath à la ligne au-dessus au premier passage !!
0
MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 2
28 août 2017 à 11:00
Avant de donner des conseils, il faut tout lire...
Notamment le 3ème alinéa de ce post, qui est exactement ce que tu préconises...
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
27 août 2017 à 23:48
Bonsoir

Je me suis permis de déplacer ta question dans le forum C#, puisqu'il ne s'agit pas de C++ (forum que tu avais choisi).

Il est possible de mettre des images directement dans le message sans passer par un hébergement tiers, ça rend la lecture plus claire.

En regardant cette fameuse image, on voit que le message d'erreur vient du programme Média Suffle.exe, je pars du principe que tu n'as pas appelé ton projet ainsi.
D'après mes recherches, ce programme est un lecteur aléatoire de mp3. Je pause donc cette hypothèse, ce programme est installé sur ta machine, c'est le lecteur de mp3 par défaut, le chemin configuré pour les musiques est celui de l'erreur, et à un moment ou un autre ton projet tente de lire un mp3 sans préciser quel logiciel doit être utilisé, c'est donc celui par défaut qui est lancé.
0
MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 2
28 août 2017 à 10:54
Merci pour le déplacement du sujet, je me suis effectivement planté de forum.

En ce qui concerne l'image, j'ai simplement cliqué sur le bouton de la barre d'outils de la zone de rédaction ("Insérer une image"), ce qui a donné le résultat affiché. Je ne sais pas comment intégrer une image autrement.

Enfin, ce programme n'est pas le lecteur de MP3 par défaut, ce n'est même pas un lecteur de media du tout. Il ne sert qu'à copier de façon aléatoire une liste de fichiers sur un support amovible, en limitant le volume transféré à une valeur voulue.

Ce programme n'est pas INSTALLÉ, mais tourne en mode debug sous Visual Studio. Il n'y a donc aucune association de fichier qui s'y réfère.

D'ailleurs, en l'ayant téléchargé et installé sur une machine virtuelle depuis le site de déploiement, je n'ai pas l'erreur alors que l'installation génère une association de fichiers avec l'extension *.msl (Media Shuffle List).

Désolé, mais ton argument ne tient pas. D'ailleurs, si c'était ça, le problème se produirait à chaque ouverture de la boite de dialogue. Or cela ne se produit qu'au premier appel. Le plus curieux, c'est que c'est une instance neuve à chaque fois. Ce n'est donc même pas un mauvais paramétrage de la boite, sinon cela se produirait à chaque fois. Il y a vraisemblablement un paramètre système qui mémorise ce fichu lecteur, mais je ne vois pas lequel.

Il faut dire que c'est un peu compliqué, car le lecteur en question est un lecteur de carte mémoire non mappé, mais monté dans un sous-répertoire du disque D. C'est pourquoi le message indique "\Device\Harddisk2\DR2" et non "G:" ou "Z:".

Lorsqu'une carte est présente, il n'y a pas d'erreur et le programme fonctionne très bien avec cette carte comme cible. Mais lorsqu'il n'y a pas de carte, le problème se produit quel que soit un autre lecteur mémorisé à la session précédente, ou même en effaçant le chemin mémorisé dans le fichier ini.

Le déploiement étant en cours, un fichier d'aide (encore provisoire) est disponible à l'adresse http://mgd.software.free.fr/downloads/Freewares/Media_Shuffle/help/index.htm . Cela donnera une idée de la fonctionnalité de l'appli. Son téléchargement (version beta) est disponible dans le répertoire parent.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
Modifié le 28 août 2017 à 17:17
Ce n'était pas un argument, mais une hypothèse.
Et cette hypothèse partait de l'idée que tu n'est pas en train de développer un logiciel dont le nom est déjà utilisé par un autre...

A ma connaissance, aucun composant du framework n'affiche ce genre de message, donc ça viendrait forcement de ton projet, et pas de ce bout de code puisqu'il n'y a pas de MessageBox.

Mets un point d'arrêt, à chaque messagebox de ton code qui propose les boutons annuler recommencer continuer pour voir ce qui se passe.

Le format ini a été abandonné, visual studio propose un fichier de config au format xml que tu peux remplir via les propriétés du projet. Voir un tuto ici

Pour l'image je vais faire remonter qu'il y a un bug.


Quand j'étais petit, la mer Morte n'était que malade.
George Burns
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
28 août 2017 à 19:00
Pour l'image qui ne s'affiche pas cela pourrait venir d'un bloqueur de pub (si tu en as un).
Voir les liens de KX.
Tu peux le désactiver sur le site, car une fois connecté en tant que membre, il n'y a pas de pub.
0
MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 2
20 juin 2019 à 12:07
Finalement, presque deux ans après (il n'est jamais trop tard pour apprendre), je pense avoir trouvé la raison du message, qui en fait ne se produit pas qu'avec mon application, mais aussi avec la plupart des applications ouvrant un fichier sur la partition où sont mes documents.

J'avais supprimé l’affectation d'une lettre de lecteur aux lecteurs de cartes SD, MMS, CF, etc., et je les avais "montés" dans un répertoire - comme sous Unix ;-)
Il semblerait que lors de l'ouverture d'une boite d'ouverture fichier, Windows scanne tous les répertoires du volume du répertoire initial fourni à la boite de dialogue, bien que ce dernier ne comprenne pas ceux des lecteurs de cartes. Et comme il n'y avait aucune carte dans les lecteurs, il est naturel d'avoir un message 'Pas de disque dans le lecteur".

J'ai "démonté" les lecteurs de cartes et je n'ai plus de message d'erreur. CQFD.

Du coup je n'ai plus accès aux lecteurs de cartes, il faudrait leur réaffecter une lettre de volume.
Mais comme la multiplicité des partitions affichées dans l'explorateur m'agace fortement pour des volumes qui ne servent jamais, je ne l'ai pas fait car j'utilise un périphérique USB pour lire les cartes. Mais cela ne concerne que moi, bien sûr.

Merci à ceux qui s’étaient intéressés à mon problème. Mais comme c'était un cas très particulier, il y avait peu de chances qu'ils en trouvent la cause.
0
Rejoignez-nous