Pregunta

¿Cuáles son las diferencias, y en qué casos una u otra probaría superior de alguna manera?

¿Fue útil?

Solución

En primer lugar fopen la función sólo se puede utilizar para operaciones simples portátiles con archivos.

CreateFile en el otro lado se puede utilizar no sólo para las operaciones con archivos, sino también con los directorios (con uso de las opciones correspondientes), tuberías y diversos dispositivos de Windows.

CreateFile tiene una gran cantidad de interruptores útiles adicionales, como FILE_FLAG_NO_BUFFERING, FILE_ATTRIBUTE_TEMPORARY y FILE_FLAG_SEQUENTIAL_SCAN, que pueden ser muy útiles en distintos escenarios.

Se puede utilizar CreateFile con un nombre de archivo ya que los caracteres MAX_PATH. Puede ser importante para algunas aplicaciones de servidor o de los cuales debe ser capaz de abrir cualquier archivo (un escáner de virus o una aplicación de copia de seguridad, por ejemplo). Esto es posible mediante el uso de la semántica de espacio de nombres, aunque esta modalidad tiene sus propias preocupaciones, como la capacidad de crear una realidad ".." o L"\xfeff\x20\xd9ab" archivo llamado (buena suerte tratando de eliminarlos más adelante).

Se puede utilizar CreateFile en diferentes escenarios de seguridad. Me refiero no sólo el uso de los atributos de seguridad. Si el proceso actual tiene SE_BACKUP_NAME o SE_RESTORE_NAME privilegio (por lo general como los administradores tienen) y permitir a este privilegio, se puede utilizar CreateFile se puede abrir cualquier archivo también un archivo en el que no se tiene acceso a través del descriptor de seguridad.

Si sólo desea leer el contenido de un archivo, puede utilizar CreateFile, CreateFileMapping y MapViewOfFile para crear la asignación del archivo. A continuación, se puede trabajar con un archivo como con un bloque de memoria, lo que posiblemente puede aumentar la velocidad de su aplicación.

También hay otros usos de la función, que se describen en detalle en el artículo de MSDN correspondiente.

Así que puedo resumir: sólo si tiene requisitos de portabilidad duros o si se necesita pasar un FILE* a alguna biblioteca externa, entonces usted tiene que usar fopen. En todos los demás casos yo le recomendaría utilizar CreateFile. Para obtener los mejores resultados, También aconsejaría que aprender API de Windows en concreto, ya que hay muchas características que se pueden encontrar un buen uso para.

ACTUALIZADO : no directamente relacionados con su pregunta, pero también le recomiendo echar un vistazo a I transaccional funciones de E / S que están soportadas a partir de Windows Vista. Utilizando esta función, puede cometer un montón de operaciones con archivos, directorios o registro como una transacción que no se puede interrumpir. Es una herramienta muy potente e interesante. Si no está listo para utilizar las funciones de E / S transaccionales, usted puede comenzar con CreateFile y el puerto de la aplicación para que las transacciones de E / S posterior.

Otros consejos

Eso realmente depende de qué tipo de programa que está escribiendo. Si se supone que debe ser portátil, fopen le hará la vida más fácil. fopen llamará CreateFile "entre bastidores".

Algunas opciones más avanzadas (control de caché, control de acceso a archivos, etc) sólo están disponibles si está utilizando la API de Win32 (que dependen del identificador de archivo Win32, en comparación con el puntero FILE en stdio), por lo que si usted está escribir una aplicación Win32 puro, es posible que desee utilizar CreateFile.

CreateFile permite

  • Abrir el archivo de E / S asíncrona
  • Pass pistas de optimización como FILE_FLAG_SEQUENTIAL_SCAN
  • seguridad y heredar la configuración Set sin enhebrar problemas

Ellos no devuelven el mismo tipo de mango, con fopen / objeto de archivo se puede llamar a otras funciones de tiempo de ejecución como fputs (así como su conversión en un identificador de archivo "nativo")

Siempre que sea posible, prefieren envoltorios orientados a objetos que el apoyo RAII, como objetos fstream o archivo impulso IO.

Usted debe, por supuesto, la atención sobre el modo de acción, por lo que fopen () y STL son insuficientes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top