2010-04-13 20 views
7

Me estoy dando cuenta de un problema que se ha deslizado un par de veces en los últimos años, y parece estar sucediendo mucho en Windows 7 en nuestra versión actual.Win32: Solución de problemas para GetFileAttributes()

Cuando pruebo la existencia de un archivo, utilizando :: GetFileAttributes (nombre de archivo), a menudo vuelvo a INVALID_FILE_ATTRIBUTES, y GetLastError() es ERROR_PATH_NOT_FOUND (3).

Sin embargo, el archivo existe, existe la ruta, el volumen existe - su H: \ Foo \ Bar - que es una carpeta en un recurso compartido de red que está mapeada en mi máquina a H :.

Si abro una ventana de comandos, puede verla. Si utilizo Windows Explorer para navegar a esa carpeta, puede verla.

Si hago eso antes de ejecutar nuestra aplicación, podemos verlo.

Pero si ejecuto nuestra aplicación primero, después de un reinicio, antes de que algo haya intentado ver H: \, entonces obtengo el error anterior repetidamente.

Siempre me ha parecido que Windows me está "ayudando" al devolver ERROR_PATH_NOT_FOUND inmediatamente cuando no se ha vuelto a conectar la asignación compartida compartida en esta sesión (está configurada para reconexión automática). Esto es, no hace falta decir, molesto. ¿Hay otra llamada API que podría estar haciendo para "determinar si el archivo/carpeta X existe?"

+0

No creo que el error esté relacionado con la salida de su red ya que obtendría un código de error diferente. Intente registrar el nombre del archivo en un archivo y el resultado de retorno cada vez. Quizás encuentres que la ruta no es válida a veces debido a la memoria corrupta o tal vez a la ruta en blanco. –

+0

Estoy ejecutando esto en mi entorno de desarrollo. Puedo ver que la ruta es válida y el código de retorno es consistentemente 3. La LAN está configurada como un simple sistema punto a punto, y el "servidor" es un simple cuadro XP Pro, con un recurso compartido no protegido (internamente, D : \ Carpetas de inicio). Este sistema ha funcionado durante años, excepto que ocasionalmente recibo ese error, y siempre se borra si simplemente accedo a la unidad mapeada antes de ejecutar nuestra aplicación (o antes de cargar el dev dev para ejecutar en modo de depuración). – Mordachai

Respuesta

4

¿Está ejecutando la aplicación como un servicio? ¿O como otro usuario? Puede ser un problema de permisos. Las credenciales que está utilizando pueden no tener permiso para leer ese directorio.

+0

Ejecutando como inicio de sesión de mi desarrollador (administrador) en una máquina de negocios Windows 7 x64 (soy un administrador local, sin dominio). – Mordachai

+0

Creo que tenía razón. Tuve que permitir que VS2008 se reiniciara "con permisos adicionales" varias sesiones recientemente, ya que he estado depurando nuestro instalador. Entonces esta es probablemente una identidad de usuario diferente, una que no tiene H: asignada. Parece un error en Win7 (tal vez también en Vista), ya que la elevación de privilegios no debería hacer que la aplicación ya no vea las mismas unidades que el usuario para el cual fue elevada ... – Mordachai

+0

Confirmado: reiniciando la PC y ejecutando inmediatamente una venta al por menor una copia de nuestra aplicación, o la depuración con permisos no elevados, dio como resultado un comportamiento correcto (se encontró el archivo y la ruta). – Mordachai

3

La conexión de la unidad necesita ser restaurada, eso es hecho automáticamente por la carcasa. Solía ​​ser hecho por WNetRestoreConnectionW() pero esa función se ha eliminado en Vista. Creo que deberás hacerlo this way now.

Usar una ruta UNC (\\share\dir\file) podría ser la mejor solución.

+0

Gracias. He visto el comportamiento que originalmente publiqué a lo largo de los años, y este artículo parece que podría permitirme solucionar ese aspecto del problema. – Mordachai

+0

La muestra es [aquí] (http://stackoverflow.com/a/9588731/307093) –

0

Una manera más fácil es usar ShellExecuteEx con la bandera SEE_MASK_CONNECTNETDRV.

+0

¿Qué estaría ejecutando? Estoy buscando la existencia de un archivo, no ejecutando nada ... – Mordachai

Cuestiones relacionadas