首页
社区
课程
招聘
[原创]用递归实现目录结构的复制
发表于: 2009-8-8 21:56 6838

[原创]用递归实现目录结构的复制

2009-8-8 21:56
6838
// CopyFileA.cpp : Defines the entry point for the console application.
//

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

char szSrcName[256];//[COLOR="Blue"]保存当前目录的名字(非路径)[/COLOR]
char szFindDir[256];//保[COLOR="Blue"]存FindFirstFile的第一个参数[/COLOR]

char src[256];//[COLOR="Blue"]源路径[/COLOR]
char dst[256];//[COLOR="RoyalBlue"]目的路径[/COLOR]

//[COLOR="RoyalBlue"]判断是否是文件[/COLOR]
BOOL IsFile(LPSTR lpFile)
{
  DWORD dwFileAtt=GetFileAttributes(lpFile);
  if ((dwFileAtt&FILE_ATTRIBUTE_DIRECTORY)!=0)
  {
    return FALSE;
  }
  return TRUE;
}


//[COLOR="Blue"]通过当前路径获取当前文件名[/COLOR]
void GetSrcFileName(LPSTR src)
{
  int n=lstrlen(src);
  for (;src[n-1]!='\\';n--)
    ;
  lstrcpy(szSrcName,src+n);
}

//[COLOR="Blue"]进入目录[/COLOR]
void EnterDirectory(LPSTR src,LPSTR file)
{
  int n=lstrlen(src);
  if (src[n-1]=='\\')
  {
    memcpy(src+n,file,lstrlen(file)+1);
  }
  else
  {
    memcpy(src+n,"\\",1);
    memcpy(src+n+1,file,lstrlen(file)+1);
  }
}

//[COLOR="Blue"]离开目录[/COLOR]
void LeaveDirectory(LPSTR path)
{
  int n=lstrlen(path)-1;
  for (;path[n]!='\\';n--)
    ;
  path[n]='\0';
}

//[COLOR="Blue"]初始化szFindDir变量[/COLOR]
void InitFind(LPSTR src)
{
  int n=lstrlen(src);
  if  (src[n-1]=='\\')
  {
    memcpy(szFindDir,src,n);
    memcpy(szFindDir+n,"*",2);
  }
  else
  {
    memcpy(szFindDir,src,n);
    memcpy(szFindDir+n,"\\*",3);
  }
}

//[COLOR="Blue"]复制的递归函数[/COLOR]
void MyCopyFile()
{
  if (IsFile(src))
  {    
    printf(src);
    printf("\n复制到\n");
    printf(dst);
    printf("\n\n");
    
    //[COLOR="Blue"]具体的复制是在这里实现[/COLOR]    

[COLOR="Blue"]//do[/COLOR]
    LeaveDirectory(src);
    return;
  }
  else
  {
    InitFind(src);
    WIN32_FIND_DATA* lpWfd=new WIN32_FIND_DATA;//[COLOR="Blue"]如果直接定义WIN32_FIND_DATA Wfd,当目录结构比较复杂,则程序运行到最后会出错,因为堆栈容易满[/COLOR]                          //[COLOR="Blue"]则程序运行到最后会出错,因为堆栈容易满[/COLOR]    HANDLE hFile=FindFirstFile(szFindDir,lpWfd);
    GetSrcFileName(src);
    EnterDirectory(dst,szSrcName);
    do
    {
      if ((lstrcmp(lpWfd->cFileName,".") & lstrcmp(lpWfd->cFileName,".."))!=0)
      {
        EnterDirectory(src,lpWfd->cFileName);
        MyCopyFile();
      }
    } while(FindNextFile(hFile,lpWfd));
    delete lpWfd;
    LeaveDirectory(dst);
    LeaveDirectory(src);
  }
}


//main
int main(int argc, char* argv[])
{
  if (argc!=3)
  {
    printf("useage:\r\ncopyfilea src dst\n \
        \rexample:\r\n \
        \rcopyfilea c:\\ d:\\ 把c盘内容全部复制到d盘\r\n \
        \rcopyfilea c:\\boot.ini d:\\dir 把c:\\boot.ini复制到存在的目录d:\\dir\r\n \
        \rcopyfilea c:\\windows d:\\dir 把目录c:\\windows复制到d:\\dir目录中\r\n \
        \r\t\t本程序只是示例,打印出复制过程中的目录结构"); 
    getchar();
    return 1;
  }
  lstrcpy(src,argv[1]);
  lstrcpy(dst,argv[2]);
  MyCopyFile();
  return 0;
}

                                  //by hatling 
                                  //2009.8.8

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (1)
雪    币: 392
活跃值: (89)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
2
算法和思想都很好,支持
2009-8-8 22:19
0
游客
登录 | 注册 方可回帖
返回
//