C++ wxCopyFile&引用;错误5:访问被拒绝;即使在使用管理员权限运行时

C++ wxCopyFile&引用;错误5:访问被拒绝;即使在使用管理员权限运行时,c++,wxwidgets,C++,Wxwidgets,我正在编写一个非常简单的程序,它编辑XML文件并将用户指定的图像复制到运行.exe的文件夹中 我遇到的问题是wxCopyFile。当我第一次运行该程序(在VisualStudio2019中使用调试模式)时,我收到“错误5:拒绝访问”,因此我尝试从调试文件夹运行.exe。我又犯了同样的错误。然后我以管理员的身份运行了它,再次出现了相同的错误!之后,我复制了另一个文件夹中的.exe文件,并以管理员权限进行了尝试,但再次失败 以下是程序要求用户选择所需图像的代码: void GUI::OnSelect

我正在编写一个非常简单的程序,它编辑XML文件并将用户指定的图像复制到运行.exe的文件夹中

我遇到的问题是wxCopyFile。当我第一次运行该程序(在VisualStudio2019中使用调试模式)时,我收到“错误5:拒绝访问”,因此我尝试从调试文件夹运行.exe。我又犯了同样的错误。然后我以管理员的身份运行了它,再次出现了相同的错误!之后,我复制了另一个文件夹中的.exe文件,并以管理员权限进行了尝试,但再次失败

以下是程序要求用户选择所需图像的代码:

void GUI::OnSelectImg(wxCommandEvent& event) {
    wxFileDialog* selectImage = new wxFileDialog(NULL,
        wxString("Select the country's flag..."),
        wxEmptyString,
        wxEmptyString,
        wxT("PNG image files (*.png)|*.png") //Allow only pngs!
    );

    if (selectImage->ShowModal() == wxID_CANCEL) {
        delete selectImage;
        return;
    }

    fileMGR.SetImagePath(selectImage->GetPath());
    imagePathLabel->SetLabel(selectImage->GetPath()); //Updates the label
    delete selectImage;
}
还有带有wxCopyFile的部分

void GUI::OnAddCountry(wxCommandEvent& event) {
    //Has he specified a flag?
    if (fileMGR.GetImagePath().IsEmpty()) {
        wxMessageBox(
            wxString("You have not specified an image for the country's flag!\nSpecify one and try again!"),
            "No image selected!",
            wxOK | wxICON_ERROR,
            this
        );
        return;
    }

    if (!wxCopyFile(fileMGR.GetImagePath(), wxStandardPaths::Get().GetDataDir())) {
        wxMessageBox(
            wxString("Failed to copy the selected image!"),
            "Failed to copy the image!",
            wxOK | wxICON_ERROR,
            this
        );
        return;
    }

    //Other not important actions...
}
这里也是。我做错了什么?提前谢谢

从中可以看出,它的两个参数都必须是文件名;但是,第二个参数是目录。这导致函数尝试创建一个文件,其中已存在同名目录,从而导致错误


因此,您需要为第二个参数提供包含文件名的完整路径,而不仅仅是目录名。wxCopyFile()似乎模仿了它在MSW上使用的方法。可以说,他们的行为不是最方便的,但这超出了这个问题的范围。

Test-您可以从命令提示符或拖放手动复制文件吗?是的,我可以,通过拖放和使用CMD(甚至不给它管理员权限),然后目标文件可能正在使用中(打开)当您的程序正在运行时。@RichardCriten目标文件和源文件均未打开。它可能在运行时被您的.exe锁定,正如@RichardCriten所暗示的那样……一旦您打开并将文件加载到您的程序中,请检查它是否确实被锁定(复制前)