2008-09-25 12 views
28

Necesito crear un directorio en una unidad de red mapeada. Estoy utilizando un código:¿Cómo puedo acceder a una unidad de red asignada con System.IO.DirectoryInfo?

DirectoryInfo targetDirectory = new DirectoryInfo(path); 
if (targetDirectory != null) 
{ 
    targetDirectory.Create(); 
} 

Si se especifica la ruta como "\\\\ ServerName Directorio \\", todo va bien. Si mapeo el "\\ ServerName \ Directory" como, digamos unidad Z :, y especifique la ruta como "Z: \\", falla.

Después de las del objeto TargetDirectory, VS shows creando (en el modo de depuración) que targetDirectory.Exists = false, y tratando de hacer targetDirectory.Create() produce una excepción:

System.IO.DirectoryNotFoundException: "Could not find a part of the path 'Z:\'." 

Sin embargo, el mismo El código funciona bien con directorios locales, por ejemplo DO:.

La aplicación es un servicio de Windows (WinXP Pro, SP2, .NET 2) que se ejecuta bajo la misma cuenta que el usuario que mapeó la unidad. Qwinsta responde que la sesión del usuario es la sesión 0, por lo que es la misma sesión que la del servicio.

+1

Es z: Definitivamente está asignado a un recurso compartido habitual o administrativo, p. Ej. C $, D $ etc. – Kev

Respuesta

1

Puede intentar usar WNetConnection para resolver la unidad mapeada a una ruta de red.

+0

muy útil, gracias –

3

¿Está mapeando con las mismas credenciales exactas con las que se ejecuta el programa?

35

Las unidades de red asignadas son específicas del usuario, por lo que si la aplicación se ejecuta con una identidad diferente que el usuario que creó la letra de unidad asignada (z :) no funcionará.

+0

esta es LA RESPUESTA !! – vinayan

4

La cuenta en la que se ejecuta su aplicación probablemente no tenga acceso a la unidad asignada. Si se trata de una aplicación web, ese sería definitivamente el problema ... Por defecto, una aplicación web se ejecuta bajo la cuenta SERVICIO DE RED, que no tendría ninguna configuración de unidades mapeadas. Intenta usar suplantación para ver si soluciona el problema. Aunque probablemente necesites encontrar una mejor solución, simplemente usa la suplantación. Si fuera yo, me quedaría con el uso de la ruta UNC.

+2

UNC path fue la solución rápida que funcionó para mí. Para aquellos que no saben, ese es un camino como este: \\ server1 \ folder1 \ folder2 \ file.pdf - recuerde que para aC# string necesitará escapar de sus barras diagonales inversas como este \\\\ server1 –

1

¿Se está ejecutando en Vista/Server 2k8? Ambos servicios aislados en la Sesión 0 y la primera sesión interactiva son Sesión 1. Hay más información here, en el aislamiento de la sesión. Por lo tanto, incluso si se usa el mismo usuario para el servicio y para el inicio de sesión interactivo, serán sesiones diferentes.

11

Teniendo en cuenta que las letras de unidad asignadas no funcionan, la solución simple es escribir la ruta de red completa.

Aka,

mi unidad R:/ fue asignada a \\myserver\files\myapp\

Así en lugar de usando

"R:/" + "photos"

uso

"\\myserver\files\myapp\" + "photos"

+1

Esto funcionó ¡para mi! – wubblyjuggly

+2

Un problema con el uso de la ruta de red completa es que aumenta la longitud de la ruta del archivo de manera que "R: \ ... \ FileA.txt" puede funcionar para copiar, eliminar, etc. pero "\\ miservidor \ archivos \ myapp \ ... \ FileA.txt "puede fallar debido a que la ruta es demasiado larga. – skeletank

+0

Esto no funcionó para mí. Estoy tratando de asignar un archivo compartido de Azure. Utilizando la letra de la unidad obtengo: "No pude encontrar una parte de la ruta Q: \" y si uso la ruta UNC, obtengo: "El nombre de usuario o la contraseña son incorrectos". –

0

Tuve el mismo problema en Win Server 2012. El UAC de desactivación lo resolvió.

Cuestiones relacionadas