2011-03-04 3 views

Respuesta

20

Usted puede hacer esto pero tienes que hacerlo en dos pasos. Primero, llame al _open_osfhandle() para obtener un descriptor de archivo de tiempo de ejecución de C desde un valor de MANEJO de Win32, luego llame al _fdopen() para obtener un objeto FILE* del descriptor de archivo.

+1

¿Esas funciones asumen la propiedad del identificador subyacente o se debe llamar a CloseHandle? – user877329

+0

@ user877329: Creo que todavía necesita llamar a 'CloseHandle()', pero valdría la pena verificarlo. Ha pasado bastante tiempo desde que utilicé esas funciones. El código fuente de la biblioteca de tiempo de ejecución de Microsoft viene con el compilador para que pueda escribir un programa de prueba y rastrearlo para verificar. –

-2

no se puede intercambiar (convertir) ellos .. si es necesario tener un archivo con el archivo * y el mango es necesario abrir dos veces

1
FILE* getReadBinaryFile(LPCWSTR path) { 
    HANDLE hFile = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
    if (hFile == INVALID_HANDLE_VALUE) { 
     return nullptr; 
    } 
    int nHandle = _open_osfhandle((long)hFile, _O_RDONLY); 
    if (nHandle == -1) { 
     ::CloseHandle(hFile); //case 1 
     return nullptr; 
    } 
    FILE* fp = _fdopen(nHandle, "rb"); 
    if (!fp) { 
     ::CloseHandle(hFile); //case 2 
    } 
    return fp; 
}

mi código para obtener un descriptor de archivo binario de lectura abierta.

debe usar fclose para cerrar el ARCHIVO * si no lo necesita.

No hice la prueba para el caso 1 y 2, por lo tanto, utilícelo bajo su propia responsabilidad.

Cuestiones relacionadas