2010-04-30 12 views
6

De alguna manera un archivo ha aparecido en uno de mis directorios, y tiene espacio al final de su extensión - su nombre es "test.txt". Lo extraño es que Directory.GetFiles() me devuelve la ruta de este archivo , pero no puedo recuperar la información del archivo con la clase FileInfo.Espacio en blanco después de la extensión de archivo -> comportamiento extraño FileInfo

El error se manifiesta aquí:

DirectoryInfo di = new DirectoryInfo("c:\\somedir"); 
FileInfo fi = di.GetFileSystemInfos("test*")[0] as FileInfo; 
//correctly fi.FullName is "c:\somedir\test.txt " 
//but fi.Exists==false (!) 

es de clase FileInfo roto? ¿Puedo de alguna manera recuperar información sobre este archivo? Realmente no sé cómo apareció ese archivo en mi sistema de archivos, y no puedo recrear algunos más.

Todos mis intentos para crear un nuevo archivo con este tipo de extensión han fallado, pero ahora mi programa es bloqueándose al encontrarlo. Puedo manejar fácilmente la excepción cuando encuentro el archivo, pero ¡vaya, soy curioso!

+0

¿Ha ejecutado un comprobador de disco del sistema operativo para asegurarse de que no se trata de un archivo dañado? ¿Tendríamos razón al suponer que esto está bajo Windows? Si es así, ¿qué versión? – ChrisBD

+0

Windows Vista Business x86, pero estoy seguro de que de alguna manera he creado el archivo yo mismo, hace aproximadamente un año, según la fecha – Axarydax

Respuesta

5

Finalizar nombres de archivos con un espacio está documentado como una mala idea.

De MSDN "Naming Files, Paths, and Namespaces (Windows)":

  • no terminan un nombre de archivo o directorio con un espacio o un punto. Aunque el sistema de archivos subyacente puede admitir dichos nombres, el shell de Windows y la interfaz de usuario no.

Además, el artículo de KB "INFO: Filenames Ending with Space or Period Not Supported":

Pueden surgir problemas cuando un cliente Macintosh crea un archivo en un servidor Windows NT. El código para eliminar espacios y períodos finales no se lleva a cabo y el usuario de Macintosh obtiene el nombre de archivo corregido correctamente. Las API de Win32 FindFirstFile() y FindNextFile() devuelven un nombre de archivo que termina en un espacio o en un punto; sin embargo, no hay forma de crear o abrir el archivo con la API de Win32.

DirectoryInfo probablemente usa FindFirstFile() y sus amigos para producir listados de directorios. File.Exists probablemente se implemente a través de GetFileAttributes() que probablemente tenga el mismo problema que CreateFile() y reporte un archivo inexistente.

Por lo tanto, no es un problema en .NET específicamente, sino en Windows mismo.

4

Sí, sé de estos archivos. También recibí una cosa semejante a una bestia. Para deshacerse de él, no conozco una forma de programación en C#, pero la vieja línea de comandos es tu amiga:

Abre una ventana de consola en la carpeta determinada (o ejecuta cmd y navega hasta la carpeta con cd comando). Ahora ingrese dir /x para recuperar el nombre corto de los archivos en este directorio. Utilice este nombre para eliminar o cambiar el nombre del archivo mediante el comando del o ren.

+0

Gracias, Oliver. Ese dir/x hizo el truco. Tuve el mismo problema y traté de eliminar el archivo usando el nombre completo + extensión pero me dijeron que no se podía encontrar el archivo. Sin embargo, finalmente pude eliminarlo usando el nombre corto. –

+0

Podrá manipular estos archivos omitiendo la API Win32, es decir, a través del subsistema POSIX (los comandos 'cygwin' tales como' mv' y 'touch' manipularán gustosamente estos nombres de archivo) o posiblemente anteponiendo la ruta con L" \ \? \ "(esto también evitará las idiosincrasias de las API de Win32.) – vladr

Cuestiones relacionadas