son - eliminar limite de caracteres windows 7
Obtener directorio separador de caracteres en Windows?(''/', ''/'', etc.) (3)
El póster original agregó la frase "modo kernel" en un comentario a la respuesta de otra persona.
Si la pregunta original pretendía preguntar sobre el modo kernel, entonces probablemente no sea una buena idea depender de / ser un separador de ruta. Diferentes sistemas de archivos permiten diferentes juegos de caracteres en el disco. Los diferentes controladores de sistema de archivos en Windows también pueden permitir diferentes conjuntos de caracteres, que normalmente no pueden incluir caracteres que los sistemas de archivos subyacentes no aceptan en el disco, pero a veces pueden comportarse de forma extraña. Por ejemplo, el modo Posix permite que un nombre de componente contenga algunos caracteres en un nombre de ruta en una partición NTFS, aunque NTFS normalmente no permite esos caracteres. (Pero obviamente / no es uno de ellos, en Posix).
En el modo kernel en Unicode, U + 005C siempre es una barra invertida y siempre es el separador de ruta. Los puntos de código Unicode para yen y won no son U + 005C y no son separadores de ruta.
En el modo kernel en ANSI, surgen complicaciones según la página de códigos ANSI. En las páginas de códigos que son suficientemente similares a ASCII, 0x5C es una barra invertida y es el separador de ruta. En las páginas de códigos ANSI 932 y 949, 0x5C no es una barra invertida, pero 0x5C puede ser un separador de ruta dependiendo de dónde ocurra. Si 0x5C es el primer byte de un carácter multibyte, entonces es un signo yen o un signo ganado y es un separador de ruta. Si 0x5C es el segundo byte de un carácter multibyte, entonces no es un carácter en sí mismo, por lo que no es un signo yen o un signo ganado y no es un separador de ruta. Debes comenzar a analizar desde el principio de la cadena para averiguar si un personaje en particular es realmente un personaje completo o no. También en chino y UTF-8, los caracteres multibyte pueden tener más de dos caracteres.
tl; dr: ¿Cómo le pregunto a Windows cuál es el carácter separador de directorio actual en el sistema?
Las diferentes versiones de Windows parecen comportarse de manera diferente (por ejemplo, /
y /
ambos funcionan en las versiones en inglés, ¥ está aparentemente en la versión japonesa, ₩ está aparentemente en la versión coreana , etc ...
¿Hay alguna forma de evitar esta codificación y, en su lugar, preguntar a Windows en tiempo de ejecución?
Nota:
Idealmente, la solución no debería depender de una DLL de alto nivel como ShlWAPI.dll
, porque las bibliotecas de nivel inferior también dependen de esto. Así que realmente debería depender de kernel32.dll
o ntdll.dll
o similares ... aunque estoy teniendo problemas para encontrar algo , ya sea en un nivel alto o en un nivel bajo.
Editar:
Un poco de experimentación me dijo que es el subsistema Win32 (es decir, kernel32.dll
... o quizás es RtlDosPathNameToNtPathName_U
en ntdll.dll
? No estoy seguro, no ntdll.dll
...) lo que convierte las barras diagonales hacia adelante en barras diagonales, no en el núcleo. (El prefijo //?/
Hace que sea imposible usar barras diagonales más adelante en la ruta, y la API del modo de usuario nativo de NT también falla con las barras diagonales).
Entonces, aparentemente no está "integrado en" Windows, sino que es solo una característica de compatibilidad, lo que significa que no puede simplemente sustituir ciegamente las barras diagonales en lugar de las barras diagonales inversas, porque cualquier programa que prefija aleatoriamente las rutas se interrumpirá automáticamente. barras
Tengo sentimientos encontrados sobre qué conclusiones sacar con respecto a esto, pero simplemente pensé que lo mencionaría.
(Etiqueté esto como "separador de ruta" aunque eso es técnicamente incorrecto porque el separador de ruta se usa para separar rutas , no directorios ( ;
vs. /
). Con suerte, la gente entiende lo que quise decir).
La barra diagonal ( /
) estándar siempre ha funcionado en todas las versiones de DOS y Windows. Si lo usa, no tiene que preocuparse por los problemas con la forma en que se muestra la barra diagonal inversa en las versiones japonesas y coreanas de Windows, y tampoco tiene que poner un caso especial en el separador de ruta para Windows en lugar de POSIX (incluido Mac). Solo usa barra diagonal hacia todas partes.
Si bien los caracteres ₩
y ¥
se muestran como símbolos separadores de directorios en las respectivas versiones de Windows en coreano y japonés, solo muestran cómo esas versiones de Windows representan el mismo punto de código Unicode U+005c
como un glifo. El punto de código subyacente para la barra diagonal inversa sigue siendo el mismo en Windows en inglés y en las versiones en japonés y coreano de Windows.
Se puede encontrar confirmación adicional de esto en esta página: http://msdn.microsoft.com/en-us/library/dd374047(v=vs.85).aspx
Consideraciones de seguridad para los conjuntos de caracteres en los nombres de archivos
La página de códigos de Windows y los juegos de caracteres OEM utilizados en los sistemas en japonés contienen el símbolo Yen (
¥
) en lugar de una barra invertida (/
). Por lo tanto, el carácter Yen es un carácter prohibido para los sistemas de archivos NTFS y FAT. Al asignar Unicode a una página de códigos en idioma japonés, las funciones de conversión asignan tanto la barra invertida (U + 005C) como el símbolo normal de Yen de Unicode (U + 00A5) a este mismo carácter. Por razones de seguridad, sus aplicaciones normalmente no deben permitir el carácter U + 00A5 en una cadena Unicode que podría convertirse para su uso como un nombre de archivo FAT.
Además, no conozco ninguna función de la API de Windows que obtenga el separador de ruta del sistema, pero puede confiar en que sea /
en todas las circunstancias.
http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx#naming_conventions
Las siguientes reglas fundamentales permiten que las aplicaciones creen y procesen nombres válidos para archivos y directorios, independientemente del sistema de archivos:
...
Utilice una barra invertida (
/
) para separar los componentes de una ruta. La barra diagonal inversa divide el nombre del archivo de la ruta y un nombre de directorio de otro nombre de directorio en una ruta. No puede usar una barra invertida en el nombre del archivo o directorio real porque es un carácter reservado que separa los nombres en componentes....
Acerca de /
Windows debería admitir el uso de /
como un separador de directorios en las funciones de la API, aunque no necesariamente en el indicador de comando ( command.com
).
Las funciones de E / S del archivo en la API de Windows convierten "/" a "/" como parte de la conversión del nombre a un nombre de estilo NT, excepto cuando se usa el prefijo "/? /" Como se detalla en las siguientes secciones.
Es ''difícil'' descubrir la verdad de todo esto, pero este podría ser un enlace muy útil sobre /
en las rutas de Windows: http://bytes.com/topic/python/answers/23123-when-did-windows-start-accepting-forward-slash-path-separator