鱼C论坛

 找回密码
 立即注册
查看: 1711|回复: 10

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

[复制链接]
发表于 2021-9-2 16:35:14 | 显示全部楼层 |阅读模式
10鱼币
这是源码
#include <windows.h>
#include <iostream>
#include <string>
#include <tchar.h>
using namespace std;


void FindFile(const std::string strPath)
{

        WIN32_FIND_DATAA  findData = { 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[0] == '.')
                                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;
}

在标红的地方一直报错,有大佬能看出来什么问题吗
最佳答案
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函数

最佳答案

查看完整内容

string tmpstr=strPath+"\\virus.exe"; BOOL bMoveOK = MoveFile("C:\\virus.exe", tmpstr.c_str()); findData.cFileName 在VS6.0是不是TCHAR(宽字符),需要转换成窄字符,用wcstombs函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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是个函数,不是一个变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-2 18:08:17 | 显示全部楼层
BOOL bMoveOK = MoveFile(_T("C:\\virus.exe"), (LPCWSTR)strPath.c_str()); \\试试这个,c_str是个函数,不是一个变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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是个函数, ...

还是报错
报错:error C2664: 'MoveFileA' : cannot convert parameter 2 from 'const unsigned short *' to 'const char *'
我是想在strPath再加一个“\\virus.exe”,因为movefile这个函数两个参数都是路径加文件名,但是只要一加上文件名就会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-2 18:38:28 | 显示全部楼层

还是报错
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 *'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-2 18:49:03 | 显示全部楼层
cannot convert parameter 2 from 'const unsigned short *' to 'const char *'
不能转换参数2从常数无符号短整指针转换成常数字符指针,char *ch=(char*)strPath.data();已经强制转换成字符指针了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-2 18:49:50 | 显示全部楼层
jhq999 发表于 2021-9-2 18:45
我用的是VS2012,才看着MoveFileA,应该用MoveFileA(LPCSTR, LPCSTR);

什么意思呐,我还要改函数吗,我用的VC6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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根本不用强制转换
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 04:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表