2012-07-27 5 views
7

¿Cómo se trabaja con los nombres de archivo que terminan en un período en Python? Según el sitio de MSDN, dichos nombres de archivo son válidos en Windows, pero cada vez que intento crear uno en Python, que elimina el período final. Incluso intenté crear un descriptor de archivo sin formato con os.open, pero aún así elimina el período.¿Cómo crear un nombre de archivo con un período posterior en Windows?

Por ejemplo, esto creará un archivo llamado simplemente 'test'

os.open('test.', os.O_CREAT | os.O_WRONLY, 0777) 

Editar: Here is the exact quote

Acerca de los espacios y puntos en los nombres de archivos y directorios. Los límites son en el shell de Windows - no en Windows o NT. El uso de 'bash', puede crear archivos con espacios (o puntos), ambos, al principio y al final de un nombre de archivo. A continuación, puede enumerar y abrir esos archivos en el explorador, y se puede 'lista' en la cáscara (cmd.exe), pero no necesariamente podrá abrirlos desde el shell (en especial espacios finales y puntos)

+2

¿Puede usted por favor proporcionar un enlace a un artículo de MSDN que dice los nombres de archivo que terminan con un período de validez. Esto es lo que veo en la wikipedia: "La API de Win32 elimina el espacio y los caracteres de punto (final) de nombres de archivo, excepto cuando se usan rutas UNC" (http://en.wikipedia.org/wiki/nombre de archivo) – sateesh

+0

¿Intentó crear un archivo con un período posterior en el nombre de archivo en Windows? No será creado. Después de cambiar el nombre, se muestra como 'prueba' en lugar de 'prueba'. Creo que tiene que ver con Windows, no con Python. –

+0

@Sateesh Agregué el enlace. – Antimony

Respuesta

6

me di cuenta de cómo hacer esto. Aparentemente, pasar un nombre de archivo normal le quitará el período incluso cuando llame a la API de Win directamente desde C. Para crear los nombres de archivo raros, debe usar el prefijo \\?\ (esto también deshabilita las rutas relativas y la conversión de barras).

open('\\\\?\\C:\\whatever\\test.','w') 

Es feo y no portátil, pero funciona.

+1

Esta es exactamente la diferencia entre la API Win32 y las capacidades NTFS. La API de Win32 separa los nombres de archivo en nombre + extensión y tiene mucho manejo para eso, mientras que a NTFS realmente no le importa. La secuencia '\\? \' Deshabilita el manejo especial en la mayoría de las API de Win32 y hace que transfieran los nombres de archivo a la API NTFS más directamente, por lo que puede hacer cosas que la API de Win32 normalmente evita. Como una aplicación normal, se supone que debes jugar bien y cumplir con Win32. – Oliver

0

Windows cortará el último período final, asumiendo que es el delimitador entre un nombre de archivo y una extensión en blanco. Intenta usar dos períodos.

4

La sintaxis \\?\ también trabaja con cmd.exe:

dir>"\\?\C:\whatever\test." 
Cuestiones relacionadas