Как исправить «файл сохраняет исходное местоположение и после копирования не копирует расширение»? - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь создать программу, которая копирует себя, пока она работает, в новое место без сохранения исходного файла. как только он скопирован, я получил файл без расширения, но как мне преодолеть это?

int _tmain(int argc, _TCHAR* argv[])
{
    TCHAR szFilepath[MAX_PATH];
    TCHAR szFilename[MAX_PATH];
    TCHAR szDestpath[MAX_PATH];

    /* Get the current executable's full path */
    GetModuleFileName(NULL, szFilepath, MAX_PATH);
    std::wcout << "filepath: " << szFilepath << std::endl;

    /* Extract just the name */
    GetFileTitle(szFilepath, szFilename, MAX_PATH);
    std::wcout << "filename: " << szFilename << std::endl;

    //Set the destination folder path
    _tcscpy(szDestpath, L"D:\\");

    //Set the destination file path
    _tcscat(szDestpath, szFilename);

    std::wcout << "dest path: " << szDestpath << std::endl;

    // copys the file of your '.exe'

    if (!CopyFile(szFilepath, szDestpath, FALSE)) {
        std::cout << "couldnt copy the file";
    }
    else {
        std::cout << "copied";
    }
    return 0;
}

1 Ответ

1 голос
/ 22 мая 2019

Согласно документации для GetFileTitle():

GetFileTitle возвращает строку, которую система будет использовать для отображения имени файла пользователю. Отображаемое имя включает расширение, только если это предпочтение пользователя для отображения имен файлов . Это означает, что возвращаемая строка может не точно идентифицировать файл, если он используется в вызовах функций файловой системы.

Вы должны использовать более подходящую функцию, чтобы получить фактическое имя файла, например PathFindFileName():

#include <windows.h>
#include <shlwapi.h>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    WCHAR szFilepath[MAX_PATH];
    LPWSTR lpszFilename;
    WCHAR szDestpath[MAX_PATH];

    /* Get the current executable's full path */
    GetModuleFileNameW(NULL, szFilepath, MAX_PATH);
    std::wcout << L"filepath: " << szFilepath << std::endl;

    /* Extract just the name */
    lpszFilename = PathFindFileNameW(szFilepath);
    std::wcout << L"filename: " << lpszFilename << std::endl;

    /* Set the destination folder path and file name */
    PathCombineW(szDestpath, L"D:\\", lpszFilename);
    std::wcout << L"dest path: " << szDestpath << std::endl;

    // copys the file of your '.exe'

    if (!CopyFileW(szFilepath, szDestpath, FALSE)) {
        std::wcout << L"couldnt copy the file";
    }
    else {
        std::wcout << L"copied";
    }
    return 0;
}

Или вы можете просто разобрать имя файла самостоятельно, используя обычные строковые операции C ++, например:

#include <windows.h>
#include <iostream>
#include <string>

int _tmain(int argc, _TCHAR* argv[])
{
    WCHAR szFilepath[MAX_PATH];
    std::wstring wFilepath;
    std::wstring wFilename;
    std::wstring wDestpath;

    /* Get the current executable's full path */
    wFilepath = std::wstring(szFilepath, GetModuleFileNameW(NULL, szFilepath, MAX_PATH));
    std::wcout << L"filepath: " << wFilepath << std::endl;

    /* Extract just the name */
    wFilename = wFilepath.substr(wFilepath.find_last_of(L"\\/")+1);
    std::wcout << L"filename: " << wFilename << std::endl;

    /* Set the destination folder path and file name */
    wDestpath = L"D:\\" + wFilename;
    std::wcout << L"dest path: " << wDestpath << std::endl;

    // copys the file of your '.exe'

    if (!CopyFileW(wFilepath.c_str(), wDestpath.c_str(), FALSE)) {
        std::wcout << L"couldnt copy the file";
    }
    else {
        std::wcout << L"copied";
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...