2011-03-27 14 views
9

Actualmente estoy trabajando con un código que implica guardar un archivo en un archivo definido por el usuario. Si el usuario ingresa un nombre de archivo sin extensión, el código detecta automáticamente la extensión según el tipo de archivo (almacenado internamente).¿Pueden existir espacios dentro de una extensión de archivo?

Sin embargo, estoy teniendo dificultades para determinar si el nombre de archivo pasado al código tiene una extensión o no. Estoy usando Path.HasExtension(filename) y Path.GetExtension(filename) pero parece mostrar un comportamiento extraño:

File.EXT =>.EXT es la extensión. Esto esta bien.

This Is A File.EXT =>.EXT es la extensión. Esto también está bien.

This Is A File. Not An Extension =>. Not An Extension es la extensión. Sin embargo, pensaría en esto como un archivo sin una extensión. Windows también lo piensa cuando creo un archivo con este nombre (la creación de un archivo con una extensión no reconocida hace que las ventanas lo llamen EXTENSIONNAME File, mientras que los archivos sin una extensión como esta simplemente se llaman File).

This Is A File.Not An Extension =>.Not An Extension es la extensión. Mismo problema que el anterior.

También tenga en cuenta que este mismo comportamiento es evidente en Path.GetFileNameWithoutExtension(filename) (por ejemplo, informa que el nombre del archivo sin extensión en los últimos dos ejemplos es This Is A File).

Así que lo que estoy tomando de esto es que .NET y Windows difieren en lo que piensan como una extensión.


La Pregunta: Me pregunto si está bien para mí para implementar el código como este:

if(!Path.HasExtension(filename) || Path.GetExtension(filename).Contains(" ")) {...}

ya que ello tirar de la definición de mi código de una extensión adecuada más de acuerdo con la forma en que Windows trata las cosas. ¿O hay algo que me falta aquí que explícitamente dice que debo permitir espacios en mis extensiones?

He buscado y encontrado this slightly similar question, pero los documentos allí vinculados solo especifican que no se recomienda finalizar la extensión con un espacio/período; no dicen nada sobre espacios dentro de la extensión.

+0

Soy capaz de crear un archivo 'This Is A File. No es una extensión' que usa Windows 7 y Windows XP. Yo 'clic derecho en el escritorio, Nuevo, Documento de texto' para crear el archivo. ¿O estás hablando de crear el archivo usando .Net? –

+0

@Thomas Puedo crear esos archivos con .NET o con Windows 7. Mi punto es que Windows no reconoce la extensión ".no una extensión" como la extensión del archivo, mientras que .NET sí lo hace. – NickAldwin

Respuesta

9

La extensión de un nombre de archivo en Windows es puramente una convención. Los métodos GetExtension y HasExtension solo buscan un punto en el nombre del archivo y actúan en consecuencia. Puede colocar espacios en cualquier lugar que desee dentro del nombre del archivo (incluida la extensión).

Cuando dice "Windows también lo piensa", es solo un código en Explorer que intenta analizar las extensiones, y simplemente usa un algoritmo ligeramente diferente de .NET.

+0

OK, gracias por la respuesta. Desde un punto de vista humano, ¿considera razonable suponer que el usuario probablemente no quiso decir que sea una extensión si tiene espacio en ella? – NickAldwin

+0

Puede imaginar fácilmente que nadie creará un programa que use extensiones con espacios en ellas, por lo que cualquier espacio en una extensión debe significar que no es una extensión. – Gabe

3

No hay una definición oficial de lo que es una extensión. La convención común es que todo después de la final . es la extensión.

Sin embargo, si quisiera obtener una ENORME lista de todas las extensiones de uso común, creo que solo encontrará un puñado de ejemplos donde se usan espacios en una extensión.

Yo diría que no permite espacios en extensiones. 999/1000 veces el usuario no lo consideró como una extensión.

Para citar Wikipedia on filenames:

. (DOT): permitido, pero la última aparición se interpretará como el separador de extensiones en VMS, MS-DOS y Windows. En otros sistemas operativos, generalmente se considera como parte del nombre del archivo, y se puede permitir más de un punto.

+0

Gracias por responder a mis dos preguntas :) – NickAldwin

4

Cómo maneja el sistema de archivos los nombres y cómo el shell de Windows (es decir, Explorer) maneja los nombres de los archivos son dos bestias completamente diferentes.

El sistema de archivos no se preocupa por espacios, puntos o cualquier otra cosa; para ello, el nombre del archivo es solo una cadena opaca (con algunas restricciones en los caracteres permitidos). La separación de nombre/extensión es solo una convención inventada. El intérprete de comandos, por otro lado, es libre de hacer su propia interpretación de lo que es una extensión porque su propósito no es almacenar y recuperar información de archivos, sino más bien proporcionar al usuario una mejor experiencia. Así que no busque respuestas allí.

Sugeriría que regresen los métodos System.IO (porque seguir la convención es bueno), pero puede hacer lo que quiera en su código si hay una buena razón para ello.

Cuestiones relacionadas