| //----------------------------------------------------------------------------- //[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); }
|