ejemplo - get file extension c#
¿FileInfo.Extension devuelve el último patrón*.*, O algo más? (4)
Devolverá .gz, pero la explicación de MSDN ( propiedad FileSystemInfo.Extension ) no está clara por qué:
" La propiedad Extensión devuelve la extensión FileSystemInfo, incluido el punto (.). Por ejemplo, para un archivo c: / NewFile.txt, esta propiedad devuelve" .txt ". "
Así que busqué el código de la propiedad de Extension
con reflector:
public string Extension
{
get
{
int length = this.FullPath.Length;
int startIndex = length;
while (--startIndex >= 0)
{
char ch = this.FullPath[startIndex];
if (ch == ''.'')
{
return this.FullPath.Substring(startIndex, length - startIndex);
}
if (((ch == Path.DirectorySeparatorChar) || (ch == Path.AltDirectorySeparatorChar)) || (ch == Path.VolumeSeparatorChar))
{
break;
}
}
return string.Empty;
}
}
Verifique cada carácter desde el final de la ruta de archivo hasta que encuentre un punto, luego se devuelve una subcadena desde el punto hasta el final de la ruta de archivo.
Tengo curiosidad por saber exactamente cuál es el comportamiento de lo siguiente:
FileInfo info = new FileInfo("C:/testfile.txt.gz");
string ext = info.Extension;
¿Volverá esto ".txt.gz" o ".gz"?
¿Cuál es el comportamiento con aún más extensiones, como ".txt.gz.zip" o algo así?
EDITAR:
Para ser claros, ya he probado esto. Me gustaría una explicación de la propiedad.
Devuelve la extensión del último punto, porque no puede adivinar si otra parte del nombre del archivo es parte de la extensión. En el caso de testfile.txt.gz
, podría argumentar que la extensión es .txt.gz
, pero ¿qué pasa con System.Data.dll
? ¿Debería ser la extensión .Data.dll
? Probablemente no ... No hay forma de adivinar, por lo que la propiedad de Extension
no lo intenta.
La extensión de archivo comienza en el último punto. Desafortunadamente, la documentación de FileSystemInfo.Extension no responde a eso, pero lógicamente debe devolver el mismo valor que Path.GetExtension , para el cual se indica la documentación:
Observaciones
La extensión de la ruta se obtiene al buscar la ruta durante un período (.), Comenzando con el último carácter de la ruta y continuando hacia el inicio de la ruta. Si se encuentra un punto antes de un carácter DirectorySeparatorChar o AltDirectorySeparatorChar, la cadena devuelta contiene el período y los caracteres después de él; de lo contrario, se devuelve Vacío.
Para obtener una lista de tareas comunes de E / S, consulte Tareas comunes de E / S.
Sería bueno que haya una respuesta autorizada sobre los nombres de archivos en general, pero tengo problemas para encontrarla.
[TestCase(@"C:/testfile.txt.gz", ".gz")]
[TestCase(@"C:/testfile.txt.gz.zip", ".zip")]
[TestCase(@"C:/testfile.txt.gz.SO.jpg", ".jpg")]
public void TestName(string fileName, string expected)
{
FileInfo info = new FileInfo(fileName);
string actual = info.Extension;
Assert.AreEqual(actual, expected);
}
Todo pasa