6
votes

FolderBrowserDialog sélectionnéePath avec reparse Points

J'ai des problèmes avec la propriété sélectionnéePath du folderbrowserDialog lorsque le dossier que j'ai sélectionné est sur un serveur distant et est un lien symbolique (ou tout type de point de reparse).

Si je sélectionne un dossier normal, puis Je reçois le chemin complet de retour, par exemple "\ Server \ dossier \ Sousfolder \ Thing_I_Clicked_on". P>

Toutefois, si le dossier est un point de repère, je reçois juste "\ Server \ Thing_Inkicked_on" (donc il manque donc de Le chemin complet) P>

var dialog = new FolderBrowserDialog();
dialog.ShowDialog();
MessageBox.Show(dialog.SelectedPath);


2 commentaires

Êtes-vous en cours d'exécution comme administrateur ou quelque chose? probablement des trucs UNC? Je ne suis pas sûr, mais c'était mes pensées


Courir comme administrateur ne fait aucune différence que j'ai peur :(


3 Réponses :


1
votes

Comment puis-je Accédez par programmation Le chemin cible d'un lien Windows Symbolic doit être ici. Êtes-vous sûr de savoir que vous avez besoin exactement de chemin complet, pas de chemin à repasser le point? Je pense que vous pouvez utiliser ce chemin à la place. "Nothathat Windows ne prend pas en charge les jonctions à des répertoires sur des actions distantes." Preuve


2 commentaires

Bonjour, que ce soit complet ou relatif, j'ai besoin de tout le chemin, ce qui n'est pas ce que je reçois. Merci pour le lien - Les fenêtres de lien autorisent absolument des liens symboliques à des répertoires distants (les jonctions et les liens symbliques sont à la fois reparé des points mais non les mêmes): mklink / d C: \ bla \\ serveur \ chemin \ to \ bla


Ha! On dirait que ceci est la réponse: lien



2
votes

Alors, j'ai beaucoup enquêté sur cette question et je pense avoir une réponse.

Premier, un peu d'explication sur ce que je voyais! p>

sur serveur A, il existe une part qui contient un lien symbolique vers une action sur serveur B: p> xxx pré>

et la cible de celle-ci est p> xxx pré>

Qu'est-ce qui se passait réellement était, la valeur renvoyée de folderbrowserdialog.selectedpath code> était \\ Serverb \ Dossier Code>, et je pensais à tort que cela manquait des parties du chemin, car les chaînes Servera et Serverb sont très similaires! Désolé d'induire en erreur tout le monde. P>

J'ai créé ma propre enveloppe en suivant ce exemple MSDN et remarqua que la fonction shoell32.dll shgetpathfromidlist code> renvoie la cible du point de reparse, malgré le fait que la documentation indique P>

Si le paramètre PIDL spécifie un raccourci, le pszpath contiendra Le chemin du raccourci, pas à la cible du raccourci p> blockQuote>

J'ai remarqué que le chemin d'accès auparavant est le bon, donc dans ma méthode de rappel lorsque l'état a changé, j'ai capturé le chemin sélectionné non traduit P>

private int FolderBrowserCallback(IntPtr hwnd, int msg, IntPtr lParam, IntPtr lpData)
        {
            switch (msg)
            {
                 case BrowseForFolderMessages.BffmSelchanged:
                     if (haveValidPath && !String.IsNullOrEmpty(displayedPath))
                                {
                                    if (IntPtr.Zero != _hwndEdit)
                                    {
                                        SelectedFullPath = displayedPath;
                                    }
        }


0 commentaires

1
votes

La réponse d'Andy ressemble à cela fonctionnera, à l'exception des détails manquants, et je ne peux pas comprendre où ajouter son extrait de code à l'exemple de code MSDN. Je peux obtenir le code "Sample MSDN" pour fonctionner, je ne sais tout simplement pas où glisser dans les trucs d'Andy.

Alors ... pour ceux d'entre vous comme moi qui ne peuvent pas comprendre quoi faire avec le code ci-dessus (je souhaite vraiment savoir ce que je faisais;) Voici une sorte de solution de contournement boiteux.

Utilisez la classe Filedialog au lieu de la navigation de navigation et réglez le;

  • Propriété DereFerenCelinks = Faux
  • CheckfileExists = FALSE
  • FileName = un nom de fichier faux par défaut. (Laissez l'utilisateur savoir que peu importe le nom du fichier, car ils choisissent simplement un dossier.)
  • Utilisez soit un openFileDialog, soit SaveFileDialog.

    Notez que lorsque cela est fait, si l'utilisateur clique sur un raccourci Windows à l'ancienne (* .lnk), il (le raccourci) sera renvoyé comme nom de fichier.

    J'espère que cela aide;) (Je vais travailler à obtenir une "réputation" afin que je puisse commenter le poste d'Andy pour obtenir les détails de sa réponse, car il a l'air vraiment bien.)


0 commentaires