2009-08-24 30 views
58

He estado leyendo que los métodos estáticos de Archivo Clase se usan mejor para realizar tareas pequeñas y pocas en un archivo como verificar si existe y que debemos usar una instancia de la clase FileInfo si vamos a realizar muchas operaciones en un archivo específico.¿Cuál es la diferencia entre File y FileInfo en C#?

Entiendo esto y simplemente puedo usarlo de esa manera a ciegas, pero me gustaría saber por qué hay una diferencia? ¿De qué se trata la forma en que funcionan que los hacen adecuados para diferentes situaciones? ¿Cuál es el punto de tener estas 2 clases diferentes que parecen hacer lo mismo de diferentes maneras?

Sería útil si alguien pudiera responder al menos una de estas preguntas.

+1

FileInfo.Exists se almacena en caché Leer este http://stackoverflow.com/questions/22042353/what-is -difference-between-file-exists-and-fileinfo-exists –

Respuesta

73

En general, si va a realizar una operación en un archivo, utilice la clase File. Si está realizando múltiples operaciones en el mismo archivo, use FileInfo.

La razón para hacerlo de esta manera es debido a la comprobación de seguridad realizada al acceder a un archivo. Cuando crea una instancia de FileInfo, la comprobación solo se realiza una vez. Sin embargo, cada vez que utiliza un método estático File, se realiza la comprobación.

+0

+1 esta explicación es más relevante en este caso ... –

+1

Esta respuesta, aunque podría decirse que es correcta, me parece muy engañosa. Desarrolle las comprobaciones de seguridad de .NET stack walking frente a las verificaciones de seguridad de OS ACL. Ambos constituyen "la comprobación de seguridad realizada al acceder a un archivo". –

+14

He tenido bastantes errores con DirectoryInfo.Exists y FileInfo.Exists, ya que no representan el estado actual, solo el estado en el momento en que se crearon los objetos de información. – angularsen

6

"Los métodos de las clases File y FileInfo son similares, pero difieren en que los métodos de la clase File son estáticos, por lo que debe pasar más parámetros que para los métodos de la instancia de FileInfo. Debe hacer esto porque opera en un archivo específico, por ejemplo, el método FileInfo.CopyTo() toma un parámetro para la ruta de destino que se utiliza para copiar el archivo, mientras que el método File.Copy() toma dos parámetros para el ruta de origen y la ruta de destino ".

http://www.aspfree.com/c/a/C-Sharp/A-Look-at-C-Sharp-File-and-FileInfo-Classes/1/

http://www.intelliott.com/blog/PermaLink,guid,ce9edbdb-6484-47cd-a5d6-63335adae02b.aspx

+4

-1: ** la mayoría ** de clases/métodos estáticos necesitan saber whi ch objeto para actuar; mientras que la mayoría de los métodos de instancia, naturalmente, actúan en la instancia especificada. Esto no está limitado a 'File' y' FileInfo'. –

3

El archivo está optimizado para operaciones únicas en un archivo, FileInfo está optimizado para varias operaciones en el mismo archivo, pero en general no hay mucha diferencia entre las diferentes implementaciones de métodos.

Si desea comparar las implementaciones exactas, use Reflector para ver ambas clases.

3

Es posible que se necesite un archivo de información para manejar las propiedades de control de acceso. Por lo demás, es una opción Estática versus Instancia y puede elegir lo que sea conveniente.

1

FileInfo es una instancia de un archivo que representa el archivo en sí. El archivo es una clase de utilidad por lo que puede funcionar con cualquier archivo

2

Sí, y una de las razones podría ser que, como Nag dijo Files es una clase de utilidad y, por lo tanto, no es necesario crear ninguna instancia. Al mismo tiempo, dado que File es una clase de utilidad, cada vez requiere una verificación de seguridad.

Por otro lado, FileInfo requiere que se cree una instancia, y ese punto utiliza la verificación de seguridad. Por lo tanto, ahora realizar operaciones múltiples utilizando FileInfo no invocará las comprobaciones de seguridad.

1

Recientemente he enfrentado el problema con File.Exist, odio esta función. Después de que utilicé la función Fileinfo clase Exist, mi programa funciona correctamente.

En realidad, lo que ocurre en el entorno de desarrollo File.Exist funciona bien, pero cuando se trata de un entorno en vivo esta función bloquea el objeto de archivo, por ese motivo recibo el error denegado y no puedo usar el archivo.

Este es mi aprendizaje. Nunca usaré el método File.Exist lo mejor es crear el objeto y luego usarlo. Tenga cuidado de usar métodos estáticos.

+2

¡Hablar en absolutos SIEMPRE es el mejor consejo! –

5

File.Exists funcionará mucho más rápido que un nuevo FileInfo (filePath) .Exists - especialmente en una red y siempre que los archivos realmente existan. Esto se debe a que File.Exists solo verificará la existencia del archivo, mientras que un nuevo FileInfo (filePath) .Exists primero construye un objeto FileInfo, que contiene todas las propiedades (fechas, tamaño, etc.) del archivo (si existe).

En mi experiencia con esto, incluso la comprobación de la existencia de 10 archivos en la red es notablemente más rápida (es decir, 20 ms vs 200 ms) utilizando File.Exists.

0

FileInfo:

  • necesario crear una instancia antes de usar
  • Contiene métodos de instancia
  • caché sobre el archivo y hay que llamar Actualizar cada vez para obtener la última información sobre el archivo de

del archivo:

  • No es necesario crear una instancia
  • Contiene métodos estáticos
  • No almacenar en caché, por lo que puede obtener la información más reciente cada vez que la use.

src:

Cuestiones relacionadas