Foros del Web » Programación para mayores de 30 ;) » C/C++ »

WriteFile

Estas en el tema de WriteFile en el foro de C/C++ en Foros del Web. Wenas :P, tengo un pequeño problema con las funciones WriteFile,CreateFile y ReadFile. Basicamente lo que hace el programa es abre un archivos binario cualquiera , ...
  #1 (permalink)  
Antiguo 06/09/2008, 19:41
Avatar de Eddie1986  
Fecha de Ingreso: enero-2007
Mensajes: 37
Antigüedad: 17 años, 3 meses
Puntos: 0
WriteFile

Wenas :P, tengo un pequeño problema con las funciones WriteFile,CreateFile y ReadFile. Basicamente lo que hace el programa es abre un archivos binario cualquiera , lo va leyendo y copiando en un nuevo archivos.

El problema que tengo es que el programa no para de escribir osea abre una foto de 100 Kb y copia hasta que yo lo pare ( El nuevo archivo llego a pesar 25 megas :P )

Estoy programando para windows en C

no se si necesitan algo mas pero cualquier ayuda o consejo es bienvenido :P

Un abrazo

Eddie


#include <windows.h>
#include <tchar.h>
#include <stdio.h>

#define BUFFER_SIZE 512

main()

{
HANDLE hFile;
HANDLE hFile2;
DWORD dwBytesRead = 0;
char ReadBuffer[BUFFER_SIZE] = {0};
char DataBuffer[512];
DWORD dwBytesToWrite = (DWORD)strlen(DataBuffer);
DWORD dwBytesWritten = 0;
printf("\n");



/************** Creacion de archivos para lectura y escritura ************/


if ((hFile = CreateFile("Historias nuevas (Highway Blues).wma", // Nombre del archivo a abrir
GENERIC_READ, // Abrir para leer
0, //Sin compartir
NULL, //Seguridad por defecto
OPEN_EXISTING, //Abrir solo si el archivo existe
FILE_ATTRIBUTE_NORMAL, //Archivo normal
NULL))<0) //Sin atributos

{
printf("open failed on input file" );
exit(1);
}


if
((hFile2=CreateFile("Historias nuevas (Highway Blues)2.wma", //Nombre del archivo nuevo

GENERIC_WRITE, //Abrir para escribir
0, //Sin compartir
NULL, //Seguridad por defecto
CREATE_ALWAYS, //Sobreescribi si existe
FILE_ATTRIBUTE_NORMAL, //Archivo normal
NULL) )<0) //Sin atributos

{
printf(
"Error en la creacion del archivo %d)\n", GetLastError());
return;
}



/*************** Lectura y escritura de los archivos ****************/

while ((ReadFile(hFile, ReadBuffer, BUFFER_SIZE-2, &dwBytesRead, NULL))>0)
{
if (dwBytesRead > 0)
{
ReadBuffer[dwBytesRead+1]='0'; // NULL
printf(TEXT("Writing %d bytes .\n"), dwBytesToWrite);
}
else
{
printf(TEXT("Nada fue leido del archivo \n"));
}

WriteFile(hFile2,// Abre el descriptor
DataBuffer + dwBytesWritten,// Info a escribir
dwBytesToWrite - dwBytesWritten,// numero de bytes a escribir
&dwBytesWritten,// numero de bytes escritos
NULL); // Sin overlap

printf(TEXT("Wrote %d bytes successfully.\n"), dwBytesWritten);

}

CloseHandle(hFile);

CloseHandle(hFile2);

}
  #2 (permalink)  
Antiguo 07/09/2008, 02:45
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: WriteFile

Código:
else
{
printf(TEXT("Nada fue leido del archivo \n"));
break;
}
Aclaro que NO mire lo demas, te recomiendo depurar el codigo.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 07/09/2008, 07:26
Avatar de Eddie1986  
Fecha de Ingreso: enero-2007
Mensajes: 37
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: WriteFile

Cita:
Iniciado por Eternal Idol Ver Mensaje
Código:
else
{
printf(TEXT("Nada fue leido del archivo \n"));
break;
}
Aclaro que NO mire lo demas, te recomiendo depurar el codigo.
Ahi cambie el codigo para que no grabe como loco :P

Sin embargo el problema es que sigue escribiendo basura y no se porque, es la funcion correcta ? yo ya probe con fwrite y_write pero el resultado es el mismo y me quedo sin funciones xDDD

Cualquier ayuda es agradecida

Un abrazo


while ((ReadFile(hFile, ReadBuffer, BUFFER_SIZE-2, &dwBytesRead, NULL)) > 0 )
{
if (dwBytesRead > 0)
{
ReadBuffer[dwBytesRead+1]=
'\0'; // NULL
printf(TEXT("Writing %d bytes .\n"), dwBytesToWrite);
//printf("Texto escrito %s\n",ReadBuffer);
WriteFile(hFile2,// Abre el descriptor
DataBuffer + dwBytesWritten,// Info a escribir
dwBytesToWrite - dwBytesWritten,// numero de bytes a escribir
&dwBytesWritten,// numero de bytes escritos
NULL);// Sin overlap

printf(TEXT(
"Wrote %d bytes successfully.\n"), dwBytesWritten);
}
else
{
printf(TEXT("Nada fue leido del archivo \n"));
getchar();
break;
}

}
  #4 (permalink)  
Antiguo 07/09/2008, 07:32
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: WriteFile

Si queres hacer una copia del archivo lee y escribi lo mismo. Osea si lees en ReadBuffer entonces escribi ese buffer y no otro (DataBuffer + dwBytesWritten). Los bytes a escribir que sean los mismos que fueron leidos ...
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 07/09/2008, 09:27
Avatar de Eddie1986  
Fecha de Ingreso: enero-2007
Mensajes: 37
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: WriteFile

Cita:
Iniciado por Eternal Idol Ver Mensaje
Si queres hacer una copia del archivo lee y escribi lo mismo. Osea si lees en ReadBuffer entonces escribi ese buffer y no otro (DataBuffer + dwBytesWritten). Los bytes a escribir que sean los mismos que fueron leidos ...
Ahi lo cambie pero el problema se mantiene nunca graba todo el archivos por algun motivo lee hasta un punto X.

Archivos de texto los pasa los mas bien pero cualquier archivos binario se va al carajop =( .

Sugerencias son siempre bienvenidas :P

Me quedo asi la parte del codigo:



while ((ReadFile(hFile, ReadBuffer, BUFFER_SIZE-2, &dwBytesRead, NULL)) > 0 )
{
if (dwBytesRead > 0)
{
ReadBuffer[dwBytesRead+1]=
'\0'; // NULL
printf(TEXT("Writing %d bytes .\n"), dwBytesToWrite);
//printf("Texto escrito %s\n",ReadBuffer);
WriteFile(hFile2,// Abre el descriptor
ReadBuffer// Info a escribir
dwBytesToWrite - dwBytesWritten,// numero de bytes a escribir
&dwBytesWritten,// numero de bytes escritos
NULL);// Sin overlap

printf(TEXT(
"Wrote %d bytes successfully.\n"), dwBytesWritten);
}
else
{
printf(TEXT("Nada fue leido del archivo \n"));
getchar();
break;
}

}
  #6 (permalink)  
Antiguo 07/09/2008, 09:46
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: WriteFile

DEPURALO. Para ver instruccion por instruccion que hace el programa.

Esto no parece logico, dwBytesToWrite - dwBytesWritten, lo logico es escribir la misma cantidad de bytes que se leyeron osea dwBytesRead.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 07/09/2008, 12:16
Avatar de Eddie1986  
Fecha de Ingreso: enero-2007
Mensajes: 37
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: WriteFile

Cita:
Iniciado por Eternal Idol Ver Mensaje
DEPURALO. Para ver instruccion por instruccion que hace el programa.

Esto no parece logico, dwBytesToWrite - dwBytesWritten, lo logico es escribir la misma cantidad de bytes que se leyeron osea dwBytesRead.
Lito ^^, ahi anda bien.

Gracias por todo :D

Un abrazo

Eddie
  #8 (permalink)  
Antiguo 07/09/2008, 12:31
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: WriteFile

De nadas
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:55.