//-----------------------------------------------------------------------------

//[TODO] Convertir esta funcion en un hilo para copia asincrona

void CSOSCDDlg::OnOK()

{

��� UpdateData (TRUE);

���

��� //-----------------------------------------------------------------------------

��� // verificar fuente y origen

��� if (!m_bolDestinationAccepted || !m_bolSourceAccepted)

��� {

������� ::MessageBox (NULL, "Selecciona primero el archivo a copiar y\nespecifica luego el archivo a crear para la copia", NULL, MB_OK | MB_ICONEXCLAMATION);

������� return;

��� }

 

��� //-----------------------------------------------------------------------------

��� // abrir el archivo de copia

��� HANDLE����� hArchivoFuente = NULL;

 

��� hArchivoFuente = CreateFile (m_strSource,

������������������������������� �GENERIC_READ,����� //Para lectura

������������������������������� �0,���������������� //No se permite compartir

������������������������������� �NULL,������������� //No seguridad

������������������������������� �OPEN_EXISTING,���� //Falla si no existe

������������������������������� �FILE_ATTRIBUTE_NORMAL,

������������������������������� �NULL);

��� if (hArchivoFuente == INVALID_HANDLE_VALUE)

��� {

������� ::MessageBox (NULL, "No se pudo abrir el archivo de origen.\nVerifica que existe y NO esta siendo usado", NULL, MB_OK | MB_ICONERROR);

������� return;

��� }

 

��� //-----------------------------------------------------------------------------

��� // crear archivo de destino

��� HANDLE����� hArchivoDestino = NULL;

 

��� hArchivoDestino = CreateFile (m_strDestination,

������������������������������� � GENERIC_WRITE,��� //Para escritura

������������������������������� � 0,��������������� //No se permite compartir

������������������������������� � NULL,������������ //No seguridad

������������������������������� � CREATE_ALWAYS,��� //En caso de Falla si no existe

������������������������������� � FILE_ATTRIBUTE_NORMAL,

������������������������������� � NULL);

��� if (hArchivoDestino == INVALID_HANDLE_VALUE)

��� {��

������� ::MessageBox (NULL,"El archivo destino no pudo ser creado.", NULL, MB_OK | MB_ICONERROR);

������� CloseHandle (hArchivoFuente);

������� return;

��� }

���

��� //-----------------------------------------------------------------------------

��� // crear buffer de lectura

��� char��� *pBuffer = NULL;

��� int���� intSizeBuffer = 0;

��� CString strSize;

 

��� GetDlgItemText (IDC_CMB_BUFFER, strSize);

 

��� intSizeBuffer = atoi (strSize);

���

��� pBuffer = new char[intSizeBuffer];

 

��� if (pBuffer == NULL)

��� {

������� ::MessageBox (NULL,"Insuficiente memoria", NULL, MB_OK | MB_ICONERROR);

������� CloseHandle (hArchivoFuente);

������� CloseHandle (hArchivoDestino);

������� return;

��� }

 

��� //-----------------------------------------------------------------------------

��� // comenzar proceso de copia (FileSize < 4GB)

��� DWORD�� dwRead = 0;

��� DWORD�� dwWrite = 0;

��� DWORD�� dwBytesWritten = 0;

��� DWORD�� dwBytesSkipped = 0;

��� DWORD�� dwPtr = 0;

��� bool��� bolContinuar = true;

��� bool��� bolAskInError = true;

��� int���� ret;

 

��� m_bolProcessStarted = true;

 

��� do

��� {

������� if (ReadFile (hArchivoFuente, pBuffer, intSizeBuffer, &dwRead, NULL))

������� {

����������� if (dwRead == 0)

����������� {

��������������� break;// se llego al final del archivo (EXIT DO)

����������� }

 

����������� if (!WriteFile (hArchivoDestino, pBuffer, dwRead, &dwWrite, NULL))

����������� {

��������������� ::MessageBox (NULL, "Error de escritura", NULL, MB_OK | MB_ICONERROR);

��������������� break;// (EXIT DO)

����������� }

 

����������� dwBytesWritten += dwWrite;

������� }

������� else

������� {

����������� //-----------------------------------------------------------------------------

����������� // procesar error de lectura

����������� if (bolAskInError)

����������� {

��������������� m_strBytesCopied.Format ("%ld", dwBytesWritten);

��������������� m_strSkiped.Format ("%ld", dwBytesSkipped);

��������������� UpdateData (FALSE);

��������������� ret = ::MessageBox (NULL, "Se detect� error de lectura\n�Pasar por alto todos los siguientes errores?\n[Cancelar] detendr� la copia aqui",

�� ������� ����                     "Anime Rescue", MB_YESNOCANCEL | MB_ICONEXCLAMATION);

����������� }

����������� else

����������� {

��������������� ret = IDNO;

����������� }

 

����������� switch (ret)

����������� {

��������������� //-----------------------------------------------------------------------------

��������������� case IDYES:

������������������� bolAskInError = false;

������������������� // (continue with IDNO process)

��������������� //-----------------------------------------------------------------------------

��������������� case IDNO:

 

������������������� if (dwBytesWritten + intSizeBuffer < m_dwFileSizeLow)

������������������� {

����������������������� // copiamos el contenido del ultimo bloque leido

����������������������� if (WriteFile (hArchivoDestino, pBuffer, intSizeBuffer, &dwWrite, NULL))

����������������������� {

��������������������������� dwBytesWritten += dwWrite;

��������������������������� dwBytesSkipped += dwWrite;

����������������������� }

����������������������� else

����������������������� {

��������������������������� ::MessageBox (NULL, "Error de escritura", NULL, MB_OK | MB_ICONERROR);

��������������������������� bolContinuar = false;

��������������������������� break;

����������������������� }

 

����������������������� // establecemos nueva posicion para copia

����������������������� dwPtr = SetFilePointer (hArchivoFuente, intSizeBuffer, NULL, FILE_CURRENT);

����������������������� if (dwPtr == 0xFFFFFFFF)

����������������������� {

��������������������������� LPVOID lpMsgBuf;

 

��������������������������� // unhandled error...

��������������������������� FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |

��������������������������������������� �� FORMAT_MESSAGE_FROM_SYSTEM |

��������������������������������������� �� FORMAT_MESSAGE_IGNORE_INSERTS,

��������������������������������������� �� NULL,

��������������������������������������� �� GetLastError(),

��������������������������������������� �� MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language

��������������������������������������� �� (LPTSTR) &lpMsgBuf,

��������������������������������������� �� 0,

��������������������������������������� �� NULL);

 

��������������������������� ret = ::MessageBox (NULL, (LPCTSTR)lpMsgBuf, NULL, MB_RETRYCANCEL | MB_ICONERROR);

��������������������������� // free the buffer.

��������������������������� LocalFree (lpMsgBuf);

 

��������������������������� if (ret == IDCANCEL)��� {bolContinuar = false;}

����������������������� }

������������������� }

������������������� else

������������������� {

����������������������� // copiamos bloque faltante

��������������� ������� if (WriteFile (hArchivoDestino, pBuffer, (m_dwFileSizeLow - dwBytesWritten), &dwWrite, NULL))

����������������������� {

��������������������������� dwBytesWritten += dwWrite;

��������������������������� dwBytesSkipped += dwWrite;

����������������������� }

����������������������� else

����������������������� {

��������������������������� ::MessageBox (NULL, "Error de escritura", NULL, MB_OK | MB_ICONERROR);

����������������������� }

����������������������� bolContinuar = false;

������������������� }

������������������� break;

��������������� //-----------------------------------------------------------------------------

��������������� default:��� // (or IDCANCEL)

������������������� bolContinuar = false;

������������������� break;

����������� }

������� }

 

��� } while ((bolContinuar) && (dwBytesWritten < m_dwFileSizeLow));

 

��� //-----------------------------------------------------------------------------

��� // salir

��� CloseHandle (hArchivoFuente);

��� CloseHandle (hArchivoDestino);

��� delete[] pBuffer;

 

��� m_strBytesCopied.Format ("%ld", dwBytesWritten);

��� m_strSkiped.Format ("%ld", dwBytesSkipped);

��� UpdateData (FALSE);

 

��� m_bolProcessStarted = false;

 

��� ::MessageBox (NULL, "Copia terminada", "CD", MB_OK | MB_ICONEXCLAMATION);

}

 

Hosted by www.Geocities.ws

1