工作中的一个小程序,主要是递归遍历目录下的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函数。