递归遍历目录

工作中的一个小程序,主要是递归遍历目录下的SQC文件,将所有文件名组成一个批处理文件的内容,该批处理文件的名称由目录组成,比如src_pub_api.bat是src/pub/api目录下的所有文件,

 

-----------------------------------------------------------------------------------------------------------------------------------

set directory="D:/test/test_pc/db2/src/pub/api"

for %%a in ( caltranf,       crtacct,        feeapi,         feepro) do call build_one %%a %directory% D:/test/test_pc/db2/proc/src/pub/api
for %%a in ( gaccinfo.bak,   gaccinfo,       getsubdt,       getsubw) do call build_one %%a %directory% D:/test/test_pc/db2/proc/src/pub/api
for %%a in ( otherfee,       pstcrtau,       pubproc,        stsgen) do call build_one %%a %directory% D:/test/test_pc/db2/proc/src/pub/api
for %%a in ( taxrate) do call build_one %%a %directory% D:/test/test_pc/db2/proc/src/pub/api

-----------------------------------------------------------------------------------------------------------------------------------

 

代码如下:

 

/************************************************************************/
/* 对目录内的SQC文件递归生成bat文件          */
/************************************************************************/


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

//保留bat文件内容的缓冲区大小
#define BAT_BUF_SIZE 30*1024


BOOL
is_root(
    char* lpszPath
)
{
 char szRoot[4];
 wsprintf(szRoot, "%c://", lpszPath[0]);
 return (lstrcmp(szRoot, lpszPath) == 0);
}

void
mk_bat_recursive(
 char* lpszPath
)
{
 char   szFind[MAX_PATH];
 char   dest_string[MAX_PATH];
 char   write_file[MAX_PATH];
 WIN32_FIND_DATA wfd;
 HANDLE   hFind;
 BOOL   first_flag = TRUE;
 BOOL   ret = TRUE;
 char   bat_string[BAT_BUF_SIZE];
 int    i = 0;
 char*   p = NULL;
 int    len = 0;
 char* ext;
 
 char file_name[MAX_PATH];
 char tmp_string[128]; 
 FILE*  fp;

 lstrcpy(szFind, lpszPath);
 if (!is_root(szFind))
  lstrcat(szFind, "//");
 lstrcat(szFind, "*.*");

 hFind = FindFirstFile(szFind, &wfd);

 if (hFind == INVALID_HANDLE_VALUE)
  return;
 
 p = strstr(lpszPath, "db2//");
 if (p != NULL)
 {
  char* tmp;
  char* tmp1;
  BOOL    end_flag = FALSE;

  len = strlen(lpszPath) - strlen(p) + 3;
  strncpy(dest_string, lpszPath, len);
  dest_string[len] = '/0';
  strcat(dest_string, "//proc");
  strcpy(write_file, dest_string);
  strcat(dest_string, p+3);

  strcat(write_file, "//");

  tmp = strchr(p, '//');
  while (tmp != NULL)
  {
   tmp = tmp + 1;

   tmp1 = strchr(tmp, '//');
   if (tmp1 != NULL)
   {
    len = (int)(tmp1 - tmp);
    strncpy(tmp_string, tmp, len);
    tmp_string[len] = 0;

    strcat(write_file, tmp_string);
    strcat(write_file, "_");

    tmp = tmp1;
   }
   else
   {
    strcpy(tmp_string, tmp);
    len = strlen(tmp);
    tmp_string[len] = 0;
    strcat(write_file, tmp_string);

    strcat(write_file, ".bat");

    tmp = NULL;
   
   }   

  }

 }

 do
 {
  if (wfd.cFileName[0] == '.')
  {
   ret = FindNextFile(hFind, &wfd);
  
   continue;
  }
  if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  {
   char szFile[MAX_PATH];
   if (is_root(lpszPath))
    wsprintf(szFile, "%s%s", lpszPath, wfd.cFileName);
   else
    wsprintf(szFile, "%s//%s", lpszPath, wfd.cFileName);

   //如果是目录则递归
   mk_bat_recursive(szFile);
  
   ret = FindNextFile(hFind, &wfd);  
  }
  else
  {  
   ext = strrchr(wfd.cFileName, '.');
  
   if (ext != NULL && stricmp(ext, ".SQC") == 0)
   {
    if (first_flag)
    {
     wsprintf(bat_string, "set directory=/"%s/"/n/n", lpszPath);
     wsprintf(tmp_string, "for %%%%a in (");
     strcat(bat_string, tmp_string);

     len = strlen(wfd.cFileName) - strlen(ext);
     strncpy(file_name, wfd.cFileName, len);
     file_name[len] = 0;
     wsprintf(tmp_string, "%s, ", file_name);
     strcat(bat_string, tmp_string);
    
     i++;

     first_flag = FALSE;
    }
    else
    {
     if (i % 5 == 0)
     {
      len = strlen(bat_string) - strlen("/t");
     
      bat_string[len-1] = '/0';
     
      wsprintf(tmp_string, ") do call build_one %%%%a %%directory%% ");
     
      strcat(bat_string, tmp_string);
     
      strcat(bat_string, dest_string);
     
      wsprintf(tmp_string, "/nfor %%%%a in (");
      strcat(bat_string, tmp_string);
     }
    
     len = strlen(wfd.cFileName) - strlen(ext);
     strncpy(file_name, wfd.cFileName, len);
     file_name[len] = 0;
     wsprintf(tmp_string, "%s, ", file_name);
     strcat(bat_string, tmp_string);

     i++;    
    }
   }

   ret = FindNextFile(hFind, &wfd);
  
   if (ret == FALSE && first_flag == FALSE)
   {   
    len = strlen(bat_string) - strlen("/t");
   
    bat_string[len-1] = '/0';
   
    wsprintf(tmp_string, ") do call build_one %%%%a %%directory%% ");
   
    strcat(bat_string, tmp_string);
   
    strcat(bat_string, dest_string);

    fp = fopen(write_file, "w");
    if (fp != NULL)
    {
     fwrite(bat_string, 1, strlen(bat_string), fp);

     fclose(fp);
    }

    memset(bat_string, 0, BAT_BUF_SIZE);
   }
  } 

 } while (ret);

 FindClose(hFind);
}


int
main(int argc, char* argv[])
{
 if (argc != 2)
 {
  exit(-1);

  return -1;
 }

 mk_bat_recursive(argv[1]);

 return 0;
}


程序主要使用了windows 两个文件的api函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值