IFileOperation File Copy Move

IFileOperationÀ» ÀÌ¿ëÇØ ÆÄÀÏ º¹»ç, Æú´õ º¹»ç, Æú´õ À̵¿À» Çغ¸ÀÚ.
½ÇÇà ¿¹Á¦ Äڵ常 ÀÖ°í ÀÚ¼¼ÇÑ ¼³¸íÀº »ý·«ÇÑ´Ù.

¾Æ·¡´Â Æú´õ º¹»ç ½ÇÇà½Ã ÁøÇà »óŸ¦ º¸¿©ÁÖ°í ÀÖ´Ù.


»ç¿ë¹ýÀº ´ÙÀ½°ú °°´Ù.

void Test()
{
    CopyFile(_tstring(TEXT("E:\\aitest\\code09\\conveyer.py")), _tstring(TEXT("¾È´¨.py")), _tstring(TEXT("E:\\aitest\\°¥¶õ´Ù")));
    CopyDirectory(_tstring(TEXT("E:\\aitest\\code09")), _tstring(TEXT("E:\\aitest\\°¥¶õ´Ù")));
    MoveDirectory(_tstring(TEXT("E:\\aitest\\code07")), _tstring(TEXT("E:\\aitest\\°¥¶õ´Ù")));
}

±¸Çö ÄÚµå
#include <Shobjidl.h>
#include <atlbase.h>  //A2W_EX
#include <atlconv.h>  //A2W_EX

#ifndef _TSTRING_DEFINED
#define _TSTRING_DEFINED
typedef std::basic_string<WCHAR> _tstring;
#endif

bool RemoveFolder(_tstring folderName, bool useRecycleBin = true)
{
    bool ret = false;
    const WCHAR* pFrom = NULL;

#ifdef UNICODE
    pFrom = folderName.c_str();
#else
    USES_CONVERSION_EX;
    pFrom = A2W_EX(folderName.c_str(), folderName.length());
#endif
    IFileOperation* pfo;

    HRESULT hr;
    hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
    if (SUCCEEDED(hr))
    {
        HRESULT hr = CoCreateInstance(CLSID_FileOperation, NULL, CLSCTX_ALL, IID_PPV_ARGS(&pfo));
        if (SUCCEEDED(hr))
        {
            DWORD flags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI;
            if (useRecycleBin) { flags |= FOF_ALLOWUNDO; }  // ÈÞÁöÅë¿¡ ³Ö±â
            hr = pfo->SetOperationFlags(flags);

            if (SUCCEEDED(hr))
            {
                IShellItem *psiFrom = NULL;
                hr = SHCreateItemFromParsingName(pFrom, NULL, IID_PPV_ARGS(&psiFrom));

                if (SUCCEEDED(hr))
                {
                    hr = pfo->DeleteItem(psiFrom, NULL);
                    if (SUCCEEDED(hr))
                        printf("success\n");
                    else
                        printf("fail\n");

                    psiFrom->Release();
                }

                if (SUCCEEDED(hr))
                {
                    hr = pfo->PerformOperations();
                    if (SUCCEEDED(hr))
                    {
                        ret = true;
                    }
                }
            }
            pfo->Release();
        }
    }

    CoUninitialize();
    return ret;
}

void CopyFile(_tstring srcName, _tstring newName, _tstring destFolder)
{
    IFileOperation  *pfo;
    IShellItem      *psiFrom = NULL;
    IShellItem      *psiTo = NULL;

    const WCHAR* pFrom = NULL;
    const WCHAR* pNew = NULL;
    const WCHAR* pDestFolder = NULL;
#ifdef UNICODE
    pFrom = srcName.c_str();
    pNew = newName.c_str();
    pDestFolder = destFolder.c_str();
#else
    USES_CONVERSION_EX;
    pFrom = A2W_EX(srcName.c_str(), srcName.length());
    pNew = A2W_EX(newName.c_str(), newName.length());
    pDestFolder = A2W_EX(destFolder.c_str(), destFolder.length());
#endif

    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
    if (SUCCEEDED(hr))
    {
        OutputDebugString(TEXT("[OSK_DLL_PWN] CoInitializeEx"));
        hr = CoCreateInstance(CLSID_FileOperation, NULL, CLSCTX_ALL, IID_PPV_ARGS(&pfo));
        if (SUCCEEDED(hr))
        {
            hr = pfo->SetOperationFlags(FOF_NOCONFIRMATION |
                FOF_SILENT |
                FOFX_SHOWELEVATIONPROMPT |
                FOFX_NOCOPYHOOKS |
                FOFX_REQUIREELEVATION |
                FOF_NOERRORUI);
            if (SUCCEEDED(hr))
            {
                hr = SHCreateItemFromParsingName(pFrom, NULL, IID_PPV_ARGS(&psiFrom));
                if (SUCCEEDED(hr))
                {
                    if (NULL != pDestFolder)
                    {
                        hr = SHCreateItemFromParsingName(pDestFolder, NULL, IID_PPV_ARGS(&psiTo));
                    }
                    if (SUCCEEDED(hr))
                    {
                        hr = pfo->CopyItem(psiFrom, psiTo, pNew, NULL);
                    }
                }
                if (SUCCEEDED(hr))
                {
                    hr = pfo->PerformOperations();
                }
            }
            pfo->Release();
        }
        CoUninitialize();
    }
}

void MoveDirectory(_tstring  srcPath, _tstring destPath)
{
    IFileOperation  *pfo;
    IShellItem      *psiFrom = NULL;
    IShellItem      *psiTo = NULL;

    const WCHAR* pFrom = NULL;
    const WCHAR* pTo = NULL;
#ifdef UNICODE
    pFrom = srcPath.c_str();
    pTo = destPath.c_str();
#else
    USES_CONVERSION_EX;
    pFrom = A2W_EX(srcPath.c_str(), srcPath.length());
    pTo = A2W_EX(destPath.c_str(), destPath.length());
#endif

    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
    if (SUCCEEDED(hr))
    {
        hr = CoCreateInstance(CLSID_FileOperation, NULL, CLSCTX_ALL, IID_PPV_ARGS(&pfo));
        if (SUCCEEDED(hr))
        {
            //ÁøÇà ´ëÈ­ »óÀÚ Ç¥½Ã
            hr = pfo->SetOperationFlags(FOF_NOCONFIRMATION |
                FOFX_SHOWELEVATIONPROMPT |
                FOFX_NOCOPYHOOKS |
                FOFX_REQUIREELEVATION |
                FOF_NOERRORUI);

            /*
            hr = pfo->SetOperationFlags(FOF_NOCONFIRMATION |
                FOF_SILENT |
                FOFX_SHOWELEVATIONPROMPT |
                FOFX_NOCOPYHOOKS |
                FOFX_REQUIREELEVATION |
                FOF_NOERRORUI);
            */
            //hr = pfo->SetOperationFlags(FOF_NO_UI);

            if (SUCCEEDED(hr))
            {
                hr = SHCreateItemFromParsingName(pFrom, NULL, IID_PPV_ARGS(&psiFrom));
                if (SUCCEEDED(hr))
                {
                    if (NULL != pTo)
                    {
                        hr = SHCreateItemFromParsingName(pTo, NULL, IID_PPV_ARGS(&psiTo));
                    }
                    if (SUCCEEDED(hr))
                    {
                        hr = pfo->MoveItems(psiFrom, psiTo);
                    }
                }
                if (SUCCEEDED(hr))
                {
                    hr = pfo->PerformOperations();
                }
            }
            pfo->Release();
        }
        CoUninitialize();
    }
}

void CopyDirectory(_tstring  srcPath, _tstring destPath)
{
    IFileOperation  *pfo;
    IShellItem      *psiFrom = NULL;
    IShellItem      *psiTo = NULL;

    const WCHAR* pFrom = NULL;
    const WCHAR* pTo = NULL;
#ifdef UNICODE
    pFrom = srcPath.c_str();
    pTo = destPath.c_str();
#else
    USES_CONVERSION_EX;
    pFrom = A2W_EX(srcPath.c_str(), srcPath.length());
    pTo = A2W_EX(destPath.c_str(), destPath.length());
#endif

    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
    if (SUCCEEDED(hr))
    {
        hr = CoCreateInstance(CLSID_FileOperation, NULL, CLSCTX_ALL, IID_PPV_ARGS(&pfo));
        if (SUCCEEDED(hr))
        {
            //ÁøÇà ´ëÈ­ »óÀÚ Ç¥½Ã
            hr = pfo->SetOperationFlags(FOF_NOCONFIRMATION |
                FOFX_SHOWELEVATIONPROMPT |
                FOFX_NOCOPYHOOKS |
                FOFX_REQUIREELEVATION |
                FOF_NOERRORUI);

            /*
            hr = pfo->SetOperationFlags(FOF_NOCONFIRMATION |
                FOF_SILENT |
                FOFX_SHOWELEVATIONPROMPT |
                FOFX_NOCOPYHOOKS |
                FOFX_REQUIREELEVATION |
                FOF_NOERRORUI);
            */
            //hr = pfo->SetOperationFlags(FOF_NO_UI);

            if (SUCCEEDED(hr))
            {
                hr = SHCreateItemFromParsingName(pFrom, NULL, IID_PPV_ARGS(&psiFrom));
                if (SUCCEEDED(hr))
                {
                    if (NULL != pTo)
                    {
                        hr = SHCreateItemFromParsingName(pTo, NULL, IID_PPV_ARGS(&psiTo));
                    }
                    if (SUCCEEDED(hr))
                    {
                        hr = pfo->CopyItems(psiFrom, psiTo);
                    }
                }
                if (SUCCEEDED(hr))
                {
                    hr = pfo->PerformOperations();
                }
            }
            pfo->Release();
        }
        CoUninitialize();
    }
}

void Test()
{
    CopyFile(_tstring(TEXT("E:\\aitest\\code09\\conveyer.py")), _tstring(TEXT("¾È´¨.py")), _tstring(TEXT("E:\\aitest\\°¥¶õ´Ù")));
    CopyDirectory(_tstring(TEXT("E:\\aitest\\code09")), _tstring(TEXT("E:\\aitest\\°¥¶õ´Ù")));
    MoveDirectory(_tstring(TEXT("E:\\aitest\\code07")), _tstring(TEXT("E:\\aitest\\°¥¶õ´Ù")));
}

´Ù¿î·Îµå:  filecopy_move.cpp

Âü°í)
ÇÏÀ§Æú´õ Æ÷ÇÔ, Æú´õ Àüü¸¦ º¹»çÇÏÀÚ
https://jangjy.tistory.com/378

ƯÀÌ»çÇ×À¸·Î ÆÄÀÏ¸í µÚ¿¡ \0 À» µÎ¹ø ºÙ¿©¾ß ¹®Á¦ ¾ø¾ú´ø°Å °°Àº±â¾ïÀÌ ÀÖ±äÇÕ´Ï´Ù.

Remove Directory
https://mindgear.tistory.com/239
https://ofekshilon.com/2009/12/25/deleting-folders/

SHFileOperation ´ë½Å IFileOperationÀ» »ç¿ë ±ÇÀå

IFileOperation  CopyItems
http://programingstudy2013.blogspot.com/2016/02/ifileoperationcopyitems.html
https://github.com/microsoft/Windows-classic-samples/blob/main/Samples/Win7Samples/winui/shell/appplatform/fileoperations/FileOperationSample.cpp