如何将一个目录下的所有子目录及文件,拷到另一个目录下?

wandou999 2004-07-16 01:32:18
如何将一个目录下的所有子目录及文件,拷到另一个目录下?
...全文
822 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
shadowWind 2005-02-17
  • 打赏
  • 举报
回复
mark
vicallee 2004-09-10
  • 打赏
  • 举报
回复
mark
ttlb 2004-07-25
  • 打赏
  • 举报
回复
up
youngphoneix 2004-07-25
  • 打赏
  • 举报
回复
忘了说了,
typedef std::string MyString;
youngphoneix 2004-07-25
  • 打赏
  • 举报
回复
以下是我以前封装的一个 WIN32 API类中的一个函数:

/*
函数声明:public
函数功能:对单个文件夹进行复制、移动、删除、重命名操作。
函数参数:
operation:执行的操作,只能是"COPY"、"MOVE"、"DELETE"、"RENAME"中的一个;
Source:源文件夹;
Destination:目标文件夹;
ShowHint:执行操作时,是否显示系统提示,默认为true。
函数返回值:操作成功返回0,操作中取消操作返回1,操作失败返回-1。
注意:Source必须以"C:\\temp"形式赋值,Destination以"C:\\dest"或"C:\\dest\\"形
式赋值均可。若目标文件夹不存在,将只复制或移动源文件夹下文件至新建目标
文件夹;若存在,则将源文件夹整个复制或移动至目标文件夹下。
该函数删除为逻辑删除,即只将文件夹放入回收站。
*/
int FileDirDeal::DirectorOperation( const char* operation,
const char* Source,
const char* Destination,
bool ShowHint )
{
MyString MyStr_old, MyStr_new, MyStr_operation;
MyStr_old = Source;
MyStr_new = Destination;
MyStr_operation = operation;
SHFILEOPSTRUCT op;
ZeroMemory( &op,sizeof(op) );
if( MyStr_old.substr(MyStr_old.length()-1,1) != "\\" )
MyStr_old += "\\";
else if( MyStr_new.substr(MyStr_new.length()-1,1) != "\\" )
MyStr_new += "\\";

//检测源文件夹是否存在
if( !CheckFileDirExist(MyStr_old.c_str(),"dir") )
{
MessageBox(NULL,("源文件夹 "+MyStr_old+" 不存在!").c_str(),"异常!",MB_OK|MB_ICONERROR);
return -1;
}

if( MyStr_operation!="COPY" && MyStr_operation!="MOVE" &&
MyStr_operation!="DELETE" && MyStr_operation!="RENAME" )
{
MessageBox(NULL,"函数 DirectorOperation 操作赋值错误!","异常!",MB_OK|MB_ICONERROR);
return -1;
}

if( MyStr_operation == "COPY" )
op.wFunc = FO_COPY;
else if( MyStr_operation == "MOVE" )
op.wFunc = FO_MOVE;
else if( MyStr_operation == "DELETE" )
{
op.wFunc = FO_DELETE;
MyStr_new.resize(0);
}
else if( MyStr_operation == "RENAME" )
op.wFunc = FO_RENAME;
else
return false;

MyStr_old += '\0';
MyStr_old += '\0';
MyStr_new += '\0';
MyStr_new += '\0';
op.hwnd = 0;
op.pFrom = MyStr_old.c_str();
op.pTo = MyStr_new.c_str();
if( ShowHint == false )
op.fFlags = FOF_ALLOWUNDO|FOF_NOCONFIRMATION; //不显示提示
else
op.fFlags = FOF_ALLOWUNDO; //显示提示

int OK = SHFileOperation( &op );
if( OK == 0 )
{
if( op.fAnyOperationsAborted == true )
return 1; //取消操作,返回1
else
return 0; //正确执行,返回0
}
else
return -1; //操作失败,返回-1
}
nobush 2004-07-25
  • 打赏
  • 举报
回复
没写过XCOPY的程序,倒是目录遍历做过不少,

摘一段你参考,
#include<stdio.h>
#include<stdlib.h>
#include<dir.h>
#define debug 1

int dodir(char * dirnm,char* cmd); /*处理目标文件夹*/

int main(int argc,char*argv[])
{
if(argc<3)
{
printf("SYNTAX: travel targetfolder command\n");
return 0;
}
setdisk((argv[1][0]&0x0f)-1);
if(dodir(argv[1],argv[2]))
{
printf("can't find the folder!\n");
return 1;
}
return 0;
}

int dodir(char * dirnm,char* cmd) /*处理目标文件夹*/
{
struct ffblk *fblk=malloc(sizeof(struct ffblk));
chdir(dirnm);
system(cmd);
findfirst("*",fblk,0x10);
findnext(fblk);
while(!findnext(fblk)) /*找到子文件夹则先处理子文件夹*/
if(dodir(fblk->ff_name,cmd))return 1;
if(0)
{
#if debug
/* 以下是调用文件处理程序*/
#endif
;
}
else
{
free(fblk);
chdir(".."); /*完成后返回上级目录*/
return 0;
}
}
以上是TC2用的,
如果要复制,还要考虑新建目录的问题……
wandou999 2004-07-25
  • 打赏
  • 举报
回复
最好用C
如:
C:\>可执行文件 AAA BBB

AAA和BBB指在DOS下输入的,指两个目录名

就将AAA几下属的所有文件夹,文件 全都拷到BBB目录下
sekelon 2004-07-22
  • 打赏
  • 举报
回复
楼主到底是在windows下还是在dos下要完成操作啊
tuxw 2004-07-22
  • 打赏
  • 举报
回复
将前面的代码整了一下,VC6 编译通过

#include <windows.h>
#include <stdio.h>

void main()
{
WIN32_FIND_DATA FileData;
HANDLE hSearch;
DWORD dwAttrs;
char szDirPath[] = "D:\\temp\\t1\\";
char szNewPath[MAX_PATH];

// Create a new directory.
if ( !CreateDirectory( szDirPath, NULL ) )
{
printf("Couldn't create new directory.\n");
return;
}

// Start searching for .TXT files in the current directory.
hSearch = FindFirstFile( "*.txt", &FileData );
if ( hSearch == INVALID_HANDLE_VALUE )
{
printf("No .TXT files found.");
return;
}

// Copy each .TXT file to the new directory
// and change it to read only, if not already.
BOOL fFinished = FALSE;
while (!fFinished)
{
lstrcpy(szNewPath, szDirPath);
lstrcat(szNewPath, FileData.cFileName);
if (CopyFile(FileData.cFileName, szNewPath, FALSE))
{
dwAttrs = GetFileAttributes(FileData.cFileName);
if (!(dwAttrs & FILE_ATTRIBUTE_READONLY))
{
SetFileAttributes(szNewPath,
dwAttrs | FILE_ATTRIBUTE_READONLY);
}
}
else
{
printf("Couldn't copy file.");
return;
}

if (!FindNextFile(hSearch, &FileData))
{
if (GetLastError() == ERROR_NO_MORE_FILES)
{
MessageBox(NULL, "No more .TXT files.",
"Search completed.", MB_OK);
fFinished = TRUE;
}
else
{
printf("Couldn't find next file.");
return;
}
}
}

// Close the search handle.
FindClose(hSearch);
}
groock 2004-07-22
  • 打赏
  • 举报
回复
解释一下$1是第二个参数$2是第三个参数
使用方法
$sh my.sh /tmp/myfile /tmp/newfile
groock 2004-07-22
  • 打赏
  • 举报
回复
干吗不用shell
#/sbin/sh

cp -r $1 $2
maxgjd 2004-07-20
  • 打赏
  • 举报
回复
c语言中怎么找到某目录下的子目录并操作它
hxy2003 2004-07-20
  • 打赏
  • 举报
回复
..........
babam 2004-07-20
  • 打赏
  • 举报
回复
在window下
SHFileOperation()
用shell这个比较简单
wandou999 2004-07-19
  • 打赏
  • 举报
回复
to:herryhuang(Herry) (
谢谢!

lianxi110.c(15): error C2059:文章结构错皖
 :'if'lianxi110.c(23): error C2040:'hSearch':'int ''void *'和间接操作的
水平不相同。
lianxi110.c(不是定数23): error C2099:初始化孩子。
lianxi110.c(24): error C2059:文章结构错误
:'if'lianxi110.c(33): error C2059:文章结构愁
貅 :'while'lianxi110.c(70): error C2373:'FindClose':再定义。是不同的形式修深
ó孩子。
C:\PROGRA~1\MICROS~3\VC98\INCLUDE\winbase.(请h确认2480):'FindC
lose'的宣言。

不好意思,是日文译成中文的,请改一下
herryhuang 2004-07-19
  • 打赏
  • 举报
回复
下面的代码摘自MSDN July 2004,适用于WIN32平台

#include <windows.h>
#include <stdio.h>

WIN32_FIND_DATA FileData;
HANDLE hSearch;
DWORD dwAttrs;
char szDirPath[] = "c:\\TEXTRO\\";
char szNewPath[MAX_PATH];
char szHome[MAX_PATH];

BOOL fFinished = FALSE;

// Create a new directory.

if (!CreateDirectory(szDirPath, NULL))
{
printf("Couldn't create new directory.");
return;
}

// Start searching for .TXT files in the current directory.

hSearch = FindFirstFile("*.txt", &FileData);
if (hSearch == INVALID_HANDLE_VALUE)
{
printf("No .TXT files found.");
return;
}

// Copy each .TXT file to the new directory
// and change it to read only, if not already.

while (!fFinished)
{
lstrcpy(szNewPath, szDirPath);
lstrcat(szNewPath, FileData.cFileName);
if (CopyFile(FileData.cFileName, szNewPath, FALSE))
{
dwAttrs = GetFileAttributes(FileData.cFileName);
if (!(dwAttrs & FILE_ATTRIBUTE_READONLY))
{
SetFileAttributes(szNewPath,
dwAttrs | FILE_ATTRIBUTE_READONLY);
}
}
else
{
printf("Couldn't copy file.");
return;
}

if (!FindNextFile(hSearch, &FileData))
{
if (GetLastError() == ERROR_NO_MORE_FILES)
{
MessageBox(hwnd, "No more .TXT files.",
"Search completed.", MB_OK);
fFinished = TRUE;
}
else
{
printf("Couldn't find next file.");
return;
}
}
}

// Close the search handle.

FindClose(hSearch);



wandou999 2004-07-19
  • 打赏
  • 举报
回复
to :cnxiaohai(相声独一处(灌水是我无言的抗议))
谢谢!!

不是DOS命令,正象 flyelf(空谷清音) ( ) 说的,但我不会具体用法

TO: flyelf(空谷清音) ( ),谢谢
能具体点说吗?
EternalBlue 2004-07-19
  • 打赏
  • 举报
回复
linux下
system("cp -r SrcDir DestDir");
dos下忘了copy怎样写了,嘻嘻
cnxiaohai 2004-07-19
  • 打赏
  • 举报
回复
to wandou999(弯豆)

看来我无能为力了

这几个函数我没有用过

由于放假在家

手边没有资料

对不起啊
herryhuang 2004-07-19
  • 打赏
  • 举报
回复
楼主:
麻烦把程序看清再编译,那段MSDN的程序不是一个完整的程序,你要自己包装一下的。
加载更多回复(7)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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