c++如何实现文件夹的复制

qq_37350941 2017-04-07 11:55:31
具体的需求是:
源文件夹内有多个子文件夹,子文件夹中内含文件(如图片),如何实现将源文件完全复制到目的文件夹内呢?

我只会写c代码,但是c实现起来这个功能好像很困难,请问如果用c++的话该如何写呢?最好有详细的c++代码,我真的不太会c++,谢谢各位大神了





附一篇我查到的资料:
http://blog.csdn.net/u012750702/article/details/52738859
...全文
1981 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
怀念小时候725 2020-01-05
  • 打赏
  • 举报
回复
14楼是驱动层的吧?
赵4老师 2017-08-15
  • 打赏
  • 举报
回复
引用 15 楼 qq_25676553 的回复:
[quote=引用 8 楼 zhao4zhong1 的回复:] [quote=引用 3 楼 qq_37350941 的回复:] [quote=引用 2 楼 bjym1987 的回复:] dos copy不就可以了,赵老师可以给你来一打
怎么写呢?[/quote]
char srcdir[256];
char desdir[256];
char cmdstr[1000];
strcpy(srcdir,"D:\\srcdir");
strcpy(desdir,"E:\\mydir\\desdir");
sprintf(cmd.str,"cmd /c echo D | xcopy /cherky \"%s\" \"%s\" >NUL",srcdir,desdir);
WinExec(cmdstr,SW_HIDE);
[/quote] 为什么我运行你这段代码报了100多个错。。直接停止编译了?是我的环境不对吗?[/quote] 新建Visual C++、Win32控制台空项目,设置使用多字节字符集,
#pragma warning(disable:4996)
#include <string.h>
#include <stdio.h>
#include <windows.h>
char srcdir[256];
char desdir[256];
char cmdstr[1000];
int main() {
    strcpy(srcdir,"D:\\srcdir");
    strcpy(desdir,"E:\\mydir\\desdir");
    sprintf(cmdstr,"cmd /c echo D | xcopy /cherky \"%s\" \"%s\" >NUL",srcdir,desdir);
    WinExec(cmdstr,SW_HIDE);
    return 0;
}
qq_25676553 2017-08-15
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
[quote=引用 3 楼 qq_37350941 的回复:] [quote=引用 2 楼 bjym1987 的回复:] dos copy不就可以了,赵老师可以给你来一打
怎么写呢?[/quote]
char srcdir[256];
char desdir[256];
char cmdstr[1000];
strcpy(srcdir,"D:\\srcdir");
strcpy(desdir,"E:\\mydir\\desdir");
sprintf(cmd.str,"cmd /c echo D | xcopy /cherky \"%s\" \"%s\" >NUL",srcdir,desdir);
WinExec(cmdstr,SW_HIDE);
[/quote] 为什么我运行你这段代码报了100多个错。。直接停止编译了?是我的环境不对吗?
GKatHere 2017-04-09
  • 打赏
  • 举报
回复
很处以前写的,更改下用吧

//	比较两个目录下的所有文件,并检测dst的更新时间是否与src相同,不同则更新
//		调用方式: NTSTATUS rtCr = CheckRefresh(L"D:\\新建文件夹\\1\\*.*", L"D:\\新建文件夹\\2", TRUE);	
NTSTATUS CheckRefresh(LPCWSTR pathSrc, LPCWSTR pathDst, BOOL copyNotExist);
// cpp
#include "StdAfx.h"
#include "比较文件并更新.h"

//	比较两个目录下的所有文件,并检测dst的更新时间是否与src相同,不同则更新
NTSTATUS CheckRefresh(LPCWSTR pathSrc, LPCWSTR pathDst, BOOL copyNotExist)
{
	if(!pathSrc || !pathDst)
		return -__LINE__;

	HANDLE hFindSrc = INVALID_HANDLE_VALUE;

	WIN32_FIND_DATAW fndDataSrc;

	//	检测目录是存大
	hFindSrc = FindFirstFileW(pathDst, &fndDataSrc);
	if ( INVALID_HANDLE_VALUE == hFindSrc)
		return -__LINE__;
	FindClose(hFindSrc);

	hFindSrc = FindFirstFileW(pathSrc, &fndDataSrc);
	if ( INVALID_HANDLE_VALUE == hFindSrc)
		return -__LINE__;

	//
	long slashAt = -1;
	for(long n=wcslen(pathSrc) -1; n >=0; n--)
	{
		if (pathSrc[n] == L'\\')
		{	
			slashAt =n;
			break;
		}
	}
		if (slashAt <= 0)
			return -__LINE__;



		//
	WCHAR* srcName = new WCHAR[MAX_PATH];
	WCHAR* dstName = new WCHAR[MAX_PATH];
	WCHAR* srcDir = new WCHAR[MAX_PATH];
	__try
	{
		

		BOOL fndYet;
		while(fndYet = FindNextFile(hFindSrc, &fndDataSrc))
		{

			if(fndDataSrc.cFileName[wcslen(fndDataSrc.cFileName) -1] == L'.')
				continue;

			WCHAR* at = fndDataSrc.cFileName;//wcsstr(fndDataSrc.cFileName, pathSrc);
			if (!at)
				return -__LINE__;
			swprintf_s(dstName, MAX_PATH, L"%ws\\%ws", pathDst, at);

			wcsncpy_s(srcName, MAX_PATH,pathSrc, slashAt+1);
			wcscat_s(srcName, MAX_PATH,fndDataSrc.cFileName);

			

			WIN32_FILE_ATTRIBUTE_DATA dstFData;
			BOOL bGt = GetFileAttributesExW(dstName, GetFileExInfoStandard, &dstFData);

			if (fndDataSrc.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
				if (!bGt)
				{
					OutputDebugStringW(__FUNCTIONW__ L" CreateDirectoryW\n");
					OutputDebugStringW(srcName);
					OutputDebugStringW(dstName);
					::CreateDirectoryW(dstName, NULL);
				}

				wcscpy_s(srcDir, MAX_PATH, srcName);
				wcscat_s(srcDir, MAX_PATH, pathSrc + slashAt);

				CheckRefresh(srcDir, dstName, copyNotExist);
			}
		
			else if (fndDataSrc.ftLastWriteTime.dwHighDateTime != dstFData.ftLastWriteTime.dwHighDateTime ||
				fndDataSrc.ftLastWriteTime.dwLowDateTime != dstFData.ftLastWriteTime.dwLowDateTime
				)
			{
				OutputDebugStringW(__FUNCTIONW__ L" copyIt File\n");
				OutputDebugStringW(srcName);
				OutputDebugStringW(dstName);
				::CopyFileW(srcName, dstName, FALSE);
			}

		}

		return __LINE__;
	}__finally
	{
		FindClose(hFindSrc);
		delete[] srcName;
		delete[] dstName;
		delete[] srcDir;
	}
}

赵4老师 2017-04-09
  • 打赏
  • 举报
回复
引用 12 楼 u010165006 的回复:
[quote=引用 11 楼 zhao4zhong1 的回复:] [quote=引用 10 楼 qq_37350941 的回复:] [quote=引用 9 楼 zhao4zhong1 的回复:] 上帖第6行 cmd.str里面的.删掉。
没有没不用命令行的方法啊[/quote] 我已经多次强调调用命令行的好处了: system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。 如果嫌system黑窗口一闪,将system("...")替换为WinExec("cmd /c ...",SW_HIDE); [/quote] xcopy貌似是外部命令,有人把它替换成恶意程序怎么办?[/quote] 你替换一下试试不就知道了。
老王爱上猫 2017-04-07
  • 打赏
  • 举报
回复
dos copy不就可以了,赵老师可以给你来一打
qq_37350941 2017-04-07
  • 打赏
  • 举报
回复
另外,最好是没有界面的,可以直接写到配置文件中
ooolinux 2017-04-07
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
[quote=引用 10 楼 qq_37350941 的回复:] [quote=引用 9 楼 zhao4zhong1 的回复:] 上帖第6行 cmd.str里面的.删掉。
没有没不用命令行的方法啊[/quote] 我已经多次强调调用命令行的好处了: system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。 如果嫌system黑窗口一闪,将system("...")替换为WinExec("cmd /c ...",SW_HIDE); [/quote] xcopy貌似是外部命令,有人把它替换成恶意程序怎么办?
赵4老师 2017-04-07
  • 打赏
  • 举报
回复
引用 10 楼 qq_37350941 的回复:
[quote=引用 9 楼 zhao4zhong1 的回复:] 上帖第6行 cmd.str里面的.删掉。
没有没不用命令行的方法啊[/quote] 我已经多次强调调用命令行的好处了: system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。 如果嫌system黑窗口一闪,将system("...")替换为WinExec("cmd /c ...",SW_HIDE);
qq_37350941 2017-04-07
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
上帖第6行 cmd.str里面的.删掉。
没有没不用命令行的方法啊
赵4老师 2017-04-07
  • 打赏
  • 举报
回复
上帖第6行 cmd.str里面的.删掉。
赵4老师 2017-04-07
  • 打赏
  • 举报
回复
引用 3 楼 qq_37350941 的回复:
[quote=引用 2 楼 bjym1987 的回复:] dos copy不就可以了,赵老师可以给你来一打
怎么写呢?[/quote]
char srcdir[256];
char desdir[256];
char cmdstr[1000];
strcpy(srcdir,"D:\\srcdir");
strcpy(desdir,"E:\\mydir\\desdir");
sprintf(cmd.str,"cmd /c echo D | xcopy /cherky \"%s\" \"%s\" >NUL",srcdir,desdir);
WinExec(cmdstr,SW_HIDE);
欧阳春晖 2017-04-07
  • 打赏
  • 举报
回复
引用 6 楼 qq_37350941 的回复:
[quote=引用 4 楼 jack960330 的回复:] windows 提供了一个遍历文件夹的方法,逐一进行文件拷贝。。。
但是拷贝过去以后,原来的文件层次结构不就丢失了吗 [/quote] 怎么会丢失呢?如果你确实是按原来的结构进行处理的话
qq_37350941 2017-04-07
  • 打赏
  • 举报
回复
引用 4 楼 jack960330 的回复:
windows 提供了一个遍历文件夹的方法,逐一进行文件拷贝。。。
但是拷贝过去以后,原来的文件层次结构不就丢失了吗
qq_37350941 2017-04-07
  • 打赏
  • 举报
回复
c语言也可以
欧阳春晖 2017-04-07
  • 打赏
  • 举报
回复
windows 提供了一个遍历文件夹的方法,逐一进行文件拷贝。。。
qq_37350941 2017-04-07
  • 打赏
  • 举报
回复
引用 2 楼 bjym1987 的回复:
dos copy不就可以了,赵老师可以给你来一打
怎么写呢?

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧