Réponse acceptée !
#include <windows.h>
#define BUFF_READ (1024 * 4)
#define BUFF_WRITE (1024 * 8)
#define BUFF_TOTAL (BUFF_READ + BUFF_WRITE)
#define MEMDISPO (MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN)
char szappname[] = "Transfl";
int __stdcall TranslateFile(char *pszfl, char *pszdst)
{
HANDLE hfl, hdst;
DWORD d, i, r;
BYTE *pmem, *pdst;
int berr = 1; // PRESUME ERRREUR
hfl = CreateFile(pszfl, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0);
if(hfl == INVALID_HANDLE_VALUE) goto transEXIT;
pmem = (BYTE*) VirtualAlloc(0, BUFF_TOTAL, MEMDISPO, PAGE_READWRITE);
if(!pmem) goto closeSRC;
hdst = CreateFile(pszdst, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
if(hdst == INVALID_HANDLE_VALUE) goto relMEM;
fromSRC:
// ON LIT PAR PASSES DE 4 Ko, POURRAIT ETRE PLUS
d = 0; ReadFile(hfl, pmem, BUFF_READ, &d, 0);
if(!d) goto srcOUT;
pdst = pmem + BUFF_READ; // BUFFER ECRITURE
for(i = 0; i < d; i++) {
*pdst++ = ' ';
*pdst++ = (pmem[i] < 0x20) ? '.': pmem[i];
}
// ON ECRIT DOUBLE DE TAILLE LUE
WriteFile(hdst, pmem + BUFF_READ, d * 2, &r, 0);
if(d >= BUFF_READ) goto fromSRC; // PEUT RESTER DES OCTETS A LIRE
srcOUT:
berr = 0; // OK NO ERROR EST FINI
CloseHandle(hdst);
if(berr) DeleteFile(pszdst);
relMEM: VirtualFree(pmem, 0, MEM_RELEASE);
closeSRC: CloseHandle(hfl);
transEXIT: return berr;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE x, PSTR y, int z)
{
int err = TranslateFile("D:\\Bidon.bin", "D:\\Bidon.txt");
MessageBox(0, err ? "ERREUR": "OK", szappname, 0);
return 0;
}
Voila, pas testé mais devrait aller, tu me diras.
Vois qu'il n'y a qu'1 alloc de mémoire et vaut pour 2 buffers (lecture et écriture).
ciao...
[ Lien ]
BruNews, MVP VC++