2009-03-20 6 views
14

En mi nuevo código estoy no usando cadenas para pasar rutas de directorio o nombres de archivo. En cambio, estoy usando DirectoryInfo y FileInfo ya que parecen encapsular mucha información.Buenas razones para pasar rutas como cadenas en lugar de utilizar DirectoryInfo/FileInfo

He visto una gran cantidad de código que utiliza cadenas para pasar la información del directorio, luego se "dividen" y "medio" e "instr" en largas declaraciones incomprensibles hasta que obtienen la parte del directorio que están buscando.

¿Hay alguna buena razón para pasar caminos como cadenas?

Respuesta

10

En general, creo que es mejor mantener la información en FileInfo/DirectoryInfo. Hay una gran cantidad de funcionalidades útiles en estas clases, así como mucha seguridad involucrada en que es mucho más fácil verificar la existencia de un archivo, ver el archivo originalmente especificado, etc.

El único lugar donde lo haría (potencialmente) pasar una ruta como una cadena en lugar de utilizar FileInfo y DirectoryInfo si la ruta se pasara a través de AppDomains o entre procesos, etc.

FileInfo y DirectoryInfo funcionan bien entre los límites de AppDomain (ya que ' re serializable), pero tienen una cantidad bastante mayor de gastos generales en esta situación. Si las cosas van y vienen mucho, podría tener un impacto.

Me quedaría con FileInfo y DirectoryInfo en este caso, a menos que descubriera que hubo un problema notable durante mi creación de perfiles, y estaba tratando de reducir la cantidad de datos serializados. Si no tuviera problemas de rendimiento, me quedaría con el uso de estas clases, ya que proporcionan mucha seguridad y funcionalidad.

+0

Tenga en cuenta que tendrá que crear un nuevo FileInfo/DirectoryInfo si el archivo ha cambiado su existente o modificado timestamps. – sighol

4

Una vez que la ruta está en una aplicación (es decir, no en un archivo de configuración de texto sin formato), no, no hay una buena razón.

El único momento (puedo pensar) que podría ser útil es cuando se interopera con código que solo acepta rutas como cadenas.

5

DirectoryInfo y FileInfo son terriblemente pesados ​​para pasar si todo lo que necesita es un camino. Estaría más preocupado por la basura "dividir y medio e instr". Aprender los caminos de:

Path.GetFileName
Path.GetDirectoryName
Path.Combine
etc ...

Aquellos individuos de clase System.IO.Path, por cierto.

+0

Recuerde, cuando transfiere una instancia a una función, está pasando una copia de la referencia, ¡no una copia del objeto completo! Entonces, todo lo que estás pasando realmente es una copia de un puntero ... –

+0

Creo que el problema no es cuántos bytes se pasan, sino más bien la sobrecarga de usar FileInfo/DirectoryInfo, que tiene que sondear el archivo de varias maneras para almacenar en caché la información sobre él. –

+1

Pero primero optimice para la legibilidad. –

0

He tenido problemas al pasar FileInfo a DMZ. Por lo que puedo ver, corrígeme si me equivoco, FileInfo realiza una comprobación de permiso cuando se deserializa y eso no funciona desde DMZ y da como resultado 'ruta no encontrada'. Cree y pase un objeto personalizado con los datos en su lugar.

0

Creo que necesita una clase para encapsular un archivo o ruta de directorio, en lugar de utilizar cadenas sin formato y manipularlas utilizando la clase estática System.IO.Path. Sin embargo, I don't find DirectoryInfo and FileInfo suitable, porque parecen estar destinados más a realizar manipulaciones de archivos/directorios en lugar de operaciones de ruta. Si crea una clase personalizada para la manipulación de ruta, puede proporcionar more user friendly path manipulation functionality.

Cuestiones relacionadas