• XSS.stack #1 – первый литературный журнал от юзеров форума

C++ CopyFile implementation

Paramedic

RAM
Пользователь
Регистрация
25.11.2019
Сообщения
111
Реакции
83
C++:
    BOOL pCopyFile(LPWSTR SourceFilePath, LPWSTR DestinationFilePath)
    {
        BOOL Return = FALSE;

        if (!SourceFilePath || !DestinationFilePath)
        {
#ifdef __DEBUG
            OutputDebugStringW(L"Utils::pCopyFile - error occured. One of the passed parameters is NULL.");
#endif
            return Return;
        }

        if (GetFileAttributesW(DestinationFilePath) != INVALID_FILE_ATTRIBUTES)
        {
#ifdef __DEBUG
            OutputDebugStringW(L"Utils::pCopyFile - error occured. Destination file already exists.");
#endif
            return Return;
        }

     
        HANDLE SourceFileHandle = CreateFileW(SourceFilePath, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);

        if (SourceFileHandle == INVALID_HANDLE_VALUE)
        {
#ifdef __DEBUG
            OutputDebugStringW(L"Utils::pCopyFile - error occured. Can't obtain handle of the source file.");
#endif
            goto Cleanup;
        }

        HANDLE DestinationFileHandle = CreateFileW(DestinationFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);

        if (DestinationFileHandle == INVALID_HANDLE_VALUE)
        {
#ifdef __DEBUG
            OutputDebugStringW(L"Utils::pCopyFile - error occured. Can't obtain handle of the destination file.");
#endif
            goto Cleanup;
        }

        HANDLE FileMappingHandle = CreateFileMappingW(SourceFileHandle, NULL, PAGE_READONLY, 0, 0, NULL);

        if (!FileMappingHandle)
        {
#ifdef __DEBUG
            OutputDebugStringW(L"Utils::pCopyFile - error occured. Can't create file mapping.");
#endif
            goto Cleanup;
        }

        LPVOID FileData = MapViewOfFile(FileMappingHandle, FILE_MAP_READ, 0, 0, 0);

        if (!FileData)
        {
#ifdef __DEBUG
            OutputDebugStringW(L"Utils::pCopyFile - error occured. Can't map file to memory.");
#endif
            goto Cleanup;
        }

        DWORD BytesWritten = 0;

        if (!WriteFile(DestinationFileHandle, FileData, GetFileSize(SourceFileHandle, NULL), &BytesWritten, NULL))
        {
#ifdef __DEBUG
            OutputDebugStringW(L"Utils::pCopyFile - error occured. Can't write data to the destination file.");
#endif
            goto Cleanup;
        }

        Return = TRUE;

    Cleanup:
        if (SourceFileHandle)
        {
            CloseHandle(SourceFileHandle);
        }

        if (DestinationFileHandle)
        {
            CloseHandle(DestinationFileHandle);
        }

        if (FileData)
        {
            UnmapViewOfFile(FileData);
        }

        return Return;
    }
 
Последнее редактирование:
(Сори если что) И.. чем оно лучше CopyFileW?
аверы попросту более лояльны к такому методу копирования, проверено лично
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Странный у вас кодстайл сударь(мое личное мнение)

C:
Cleanup:
    if (SourceFileHandle)
    {
        CloseHandle(SourceFileHandle);
    }

    if (DestinationFileHandle)
    {
        CloseHandle(DestinationFileHandle);
    }

    if (FileData)
    {
        UnmapViewOfFile(FileData);
    }
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Странный у вас кодстайл сударь(мое личное мнение)

C:
Cleanup:
    if (SourceFileHandle)
    {
        CloseHandle(SourceFileHandle);
    }

    if (DestinationFileHandle)
    {
        CloseHandle(DestinationFileHandle);
    }

    if (FileData)
    {
        UnmapViewOfFile(FileData);
    }
Хз, я попечному не шарю) но в чём странность? Этим кодом закрываются хендлы, разве хендлы не надо закрывать? Я думаю надо.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Хз, я попечному не шарю) но в чём странность? Этим кодом закрываются хендлы, разве хендлы не надо закрывать? Я думаю надо.
Конечно надо ,но прост ,это можно было сделать несколько иначе(и по моему мнению лучше) ,просто я внес свои 5 копеек
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Конечно надо ,но прост ,это можно было сделать несколько иначе(и по моему мнению лучше) ,просто я внес свои 5 копеек
Давай пример
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Как это относится к закрытию хендлов?
Никак ,я предложил ещё один вариант копирования файлов
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Странный у вас кодстайл сударь(мое личное мнение)

C:
Cleanup:
    if (SourceFileHandle)
    {
        CloseHandle(SourceFileHandle);
    }

    if (DestinationFileHandle)
    {
        CloseHandle(DestinationFileHandle);
    }

    if (FileData)
    {
        UnmapViewOfFile(FileData);
    }
так я же попросил дать правильную на ваш взгляд реализацию закрытия хендлов
 
Пожалуйста, обратите внимание, что пользователь заблокирован
так я же попросил дать правильную на ваш взгляд реализацию закрытия хендлов
Тк это и не было ответом на твой вопрос. Я просто предложил ещё один вариант. А про закрытие хендлов - у меня просто другой код стайл и я бы сделал без гото ,те код просто не так бы выглядил(это не означает ,что я говорю ,что надо использовать что-то иное вместо CloseHandle)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх