Tengo la curiosidad de qué es exactamente el comportamiento es el siguiente:

FileInfo info = new FileInfo("C:/testfile.txt.gz");
string ext = info.Extension;

Se esta vuelta «.txt.gz» o «.gz»?

Cuál es el comportamiento con más extensiones, tales como «.txt.gz.zip» o algo por el estilo?

EDICIÓN:

Para ser claro, yo ya he probado esta. Me gustaría una explicación de la propiedad.

  • ¿Se ejecuta el código para ver qué devuelve? Realmente muy fáciles de hacer eso ya que ya escribió el código.
  • Por supuesto, me gustaría simplemente la explicación detrás de lo que info.Extension hace exactamente, así que puedo escribir mis pruebas de unidad en torno a aquellos supuestos 🙂
  • Erwin a continuación me dio lo que yo estaba buscando – código real detrás, en lugar de pruebas empíricas.
  • Para aquellos downvoting – no le estoy pidiendo esto porque soy demasiado perezoso para escribir mis propias pruebas, estoy preguntando, porque yo quería saber lo que estaba sucediendo detrás de las escenas.
  • He oído ya. Si usted no ha usado antes, ILSpy es una muy buena herramienta para comprobar lo diferentes .Net métodos de hacer. Si puede ser lento a veces, pero es genial para ver cómo las partes del Marco están escritas.
  • Estoy de acuerdo… también le da una buena perspectiva de los patrones y las prácticas, de modo que una buena herramienta de lo que estás haciendo.

InformationsquelleAutor Codeman | 2012-10-02

4 Comentarios

  1. 44

    Volverá .gz, pero la explicación de MSDN (FileSystemInfo.La Extensión De La Propiedad) no está claro por qué:

    «La Extensión de la propiedad devuelve el FileSystemInfo extensión, incluyendo el punto (.). Por ejemplo, para un archivo c:\NewFile.txt esta propiedad devuelve «.txt».«

    Así que busqué el código de la Extension propiedad 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;
        }
    }

    Es comprobar cada char desde el final de la ruta del archivo hasta que encuentra un punto y, a continuación, se devuelve una subcadena desde el punto hasta el final de la ruta.

    • Excelente, esto es exactamente lo que estaba buscando, gracias!
    • Eso es un detalle de implementación, no es algo que usted debe confiar en. Lo que usted debe confiar en la documentación. Los detalles de implementación están sujetos a cambio.
    • la documentación no es clara sobre el comportamiento en este caso. Desde MSDN: The Extension property returns the FileSystemInfo extension, including the period (.). For example, for a file c:\NewFile.txt, this property returns ".txt".
    • Yo sé, yo estoy tratando de encontrar la documentación que hace responder a la pregunta. 🙂
    • Parece perfectamente claro para mí. Devuelve la «extensión». Lo que no está claro? No entiendo la confusión.
    • Extenssion puede ser «multiDotted», como en SaveFileDialog.

  2. 9
    [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);
    }

    Pasan todos

  3. 7

    Devuelve la extensión desde el último punto, porque no puede adivinar si la otra parte del nombre de archivo es parte de la extensión. En el caso de testfile.txt.gz, se podría argumentar que la extensión es .txt.gz, pero, ¿qué acerca de System.Data.dll? Debe la extensión será .Data.dll? Probablemente no… no Hay manera de adivinar, por lo que el Extension propiedad no intentar.

    • ¿Windows especificar en cualquier lugar que las extensiones pueden contener un período? Nunca he visto que lo quiero suponer que la extensión es nada después de la última menstruación.
  4. 2

    La extensión de archivo comienza en el último punto. Por desgracia, la documentación de FileSystemInfo.La extensión de no responder eso, pero, lógicamente, debe devolver el mismo valor como Ruta de acceso.GetExtension, para que los estados de documentación:

    Observaciones

    La extensión de la ruta de acceso se obtiene mediante la búsqueda recorrido por un punto (.), comenzando con el último carácter en la ruta y continuando hacia el inicio de la ruta. Si el plazo se encuentra antes de un DirectorySeparatorChar o AltDirectorySeparatorChar de caracteres, la cadena devuelta contiene la época y los personajes después de ella; de lo contrario, Vacío se devuelve.

    De una lista común de las tareas de e/S Comunes I/O Tareas.

    Sería bueno hay una respuesta autorizada en los nombres de archivo en general, pero estoy teniendo problemas para encontrarlo.

    • «pero lógicamente debe devuelven el mismo valor» – a Menos que hayas revisado el código para Path.GetExtension() ¿cómo puede usted decir eso? Y si usted tiene, usted debe agregar que a tu post. Como es, esto es sólo una suposición de su lado, y ya sabes lo que dicen acerca de las suposiciones…
    • Yo específicamente publicado esta respuesta porque yo no quiero mirar el código. Ya hay una respuesta que se veía en el código. Si resulta que el código está mal o subóptima, una futura actualización de .NET Framework podría cambiar el código. Si hay una promesa explícita en la documentación acerca de lo que es y no es una extensión de archivo, que es mucho menos probable que cambie. Y el comentario en mi respuesta a esta pregunta era el más cercano que pude encontrar.
    • No me importa tu comentario ni el hecho de que usted no publicar el código, de hecho, me encanta que usted tomó de MSDN y explicó más a fondo. Sin embargo, la frase que he resaltado anteriormente promete una verdad irrefutable, sino porque había hecho nada para demostrar que la verdad, tengo a la pregunta. ¿Qué te hace decir, más allá de cualquier duda razonable, que FileSystemInfo.Extension debe devuelven el mismo valor Path.GetExtension? No encuentro nada en la web de MSDN para demostrar que ese es el caso y si usted no tiene ninguna prueba de esto, por desgracia usted acaba de hacer una suposición de que los dos se comportan de la misma.
    • De hecho, incluso si hubiera mirado el código y se dio cuenta de que ambos comparten el mismo código o incluso que Path.GetExtension solo llamadas FileSystemInfo.Extension en la parte final… como usted dijo esto podría ser cambiado en cualquier momento previo aviso, así que sin algo en la documentación para demostrar que, hasta nuevo aviso, este es el caso, no creo que usted esté en una posición para hacer tales declaraciones fuertes. En resumen, me encanta tu respuesta, acaba de tomar delito en la «lógicamente debe» en parte, creo que un «debe» se debe adapta mejor allí.
    • Oh, ahora veo cómo leer mi respuesta. Que no es lo que yo estoy diciendo. Por «lógicamente debe», estoy diciendo que sería ilógico si Path.GetExtension y FileSystemInfo.Extension el uso de una definición diferente de «extensión». En fin para los métodos a ser lógico, deben estar de acuerdo en la definición.
    • Entiendo lo que estás tratando de transmitir, pero si bien puede ser lógico, que los no ser cierto. Es enteramente posible que uno no llama a los otros y que el código de uno se actualiza sin olvidarnos de la segunda. Puede ser posible que uno de ellos tiene un error, mientras que el otro no, etc. Yo soy una especie de solo jugar al abogado del diablo aquí y estoy seguro de que tienes razón, pero todavía es sólo una suposición, a menos que usted tiene prueba que lo respalde.

Dejar respuesta

Please enter your comment!
Please enter your name here