2012-09-05 19 views
6

Tengo problemas con la propiedad SelectedPath del FolderBrowserDialog cuando la carpeta que selecciono está en un servidor remoto y es un enlace simbólico (o cualquier tipo de punto de análisis).FolderBrowserDialog SelectedPath con puntos de análisis

Si selecciono una carpeta normal, obtengo la ruta completa devuelta, por ejemplo "\ SERVER \ folder \ subfolder \ thing_I_clicked_on".

Sin embargo, si la carpeta es un punto de análisis, me sale solo "\ SERVER \ thing_I_clicked_on" (por lo que le falta la ruta completa)

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

Cualquiera que venir a través de este o tiene alguna sugerencia? No parece estar relacionado con permisos, como si conozco la ruta completa que puedo buscar, felizmente, etc.

+0

¿Estás programa que se ejecuta como. administrador o algo? Probablemente algunas cosas de UNC ocurran ... No estoy seguro, pero esos eran mis pensamientos –

+0

Ejecutarme como administrador no hace ninguna diferencia Me temo :( –

Respuesta

2

entonces, he estado investigando esto bastante y creo que tengo una respuesta.

Primero, ¡un poco de explicación sobre lo que estaba viendo!

en el servidor A, hay una cuota que contiene un enlace simbólico a un recurso compartido en el servidor B:

\\serverA\Path\To\Folder 

y el objetivo de que sea

\\serverB\Folder 

lo que realmente estaba sucediendo era, el valor devuelto por FolderBrowserDialog.SelectedPath era \\serverB\Folder, y estaba pensando erróneamente que le faltaban partes de la ruta, porque las cadenas servidorA y servidorB son muy similares. Perdón por engañar a todos.

he creado mi propio envoltorio siguiendo ese MSDN Example y notamos que la función Shell32.dll SHGetPathFromIDList está devolviendo el objetivo del punto de análisis, a pesar del hecho de que la documentación dice

Si el parámetro especifica un acceso directo pidl , el pszPath contendrá el camino hacia el acceso directo, no a la meta del acceso directo

me di cuenta de que el camino antes de que sea el correcto, sin embargo, por lo que en mi método de devolución de llamada cuando el estado ha cambiado, he capturado el no traducida ruta seleccionada

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; 
            } 
     } 

Así que la propiedad contiene SelectedFullPath\\serverA\Path\To\Folder y SelectedPath propiedad contiene \\ServerB\Folder, lo que me deja mucho que trabajar.

1

How do I programmatically access the target path of a windows symbolic enlace debe estar aquí. ¿Estás seguro de que necesitas exactamente la ruta completa, no el camino al punto de reanálisis? Creo que puedes usar esta ruta en su lugar. "Notethat Windows no admite uniones a directorios en recursos compartidos remotos." proof

+0

Hola - ya sea completo o relativo, sí necesito todo el camino, que no es lo que estoy obteniendo. Gracias por el enlace: Windows permite enlaces simbólicos a directorios remotos (las uniones y los enlaces simbólicos son puntos de reanálisis pero no iguales): mklink/DC: \ blah \\ server \ path \ to \ blah –

+0

¡Parece que esta es la respuesta: [enlace] (http://blogs.msdn.com/b/oldnewthing/archive/2010/02/12/9962359.aspx) – cdmnk

1

Parece que la respuesta de Andy funcionará, excepto que faltan los detalles, y no puedo encontrar dónde agregar su fragmento de código al código de ejemplo de MSDN. Puedo hacer que funcione el código de "MSDN sample", pero no sé dónde meterme en las cosas de Andy.

Entonces ... para aquellos de ustedes como yo que no pueden entender qué hacer con el código anterior, (realmente me gustaría saber lo que estaba haciendo;) aquí hay una especie de solución provisional poco convincente.

Utilice la clase de archivo de diálogo en lugar de browseforfolder y configure;

  • DereferenceLinks propiedad = falsos
  • CheckFileExists = false
  • archivo = un nombre de archivo por defecto falso. (Haga saber al usuario que no importa cuál es el nombre del archivo, ya que solo está eligiendo una carpeta.)
  • Utilice OpenFileDialog o SaveFileDialog.

Tenga en cuenta que cuando se hace esto, si el usuario hace clic en un acceso directo antiguo ventanas moda (* .lnk) que (el acceso directo) será devuelto como el nombre del archivo, por lo que tendrá que dar cuenta de ello.

espero que esta ayuda;) (Voy a trabajar en conseguir un poco de "reputación", por lo que puedo comentar en el post de Andy para obtener los detalles de su respuesta ya que se ve muy bien)

Cuestiones relacionadas