您的位置:首页 > 其它

则替换当前目录下包含在目录的所有.的文件中的TAB -> 4 spaces

2010-04-15 17:01 549 查看
/*
操作方法: 在生成的可执行程序(test.exe)目录下编写一个bat文件
例如a.bat
内容:
test.exe .h
则替换当前目录下包含在目录的所有.h的文件中的TAB -> 4 spaces
*/

#include <stdio.h>
#include <string.h> // strncpy
#include <stdlib.h> // tolower
#include <io.h> // struct _finddata_t
#include "direct.h" // _chdir
#include "sys/stat.h" // S_IWRITE

#define AUTO_RUN

#define EXT_PROMAT (const char )'.'
#define MAX_EXT_NAME_LEN (int)4

#define MAX_FILE_PATH_LEN (int)256
#define TERR -1
#define TOK 0

char EXT_EXE_NAME[MAX_EXT_NAME_LEN+1] = {0};

#define TMP_FILE "tmp"
#define LOG_HEADER "log"
FILE *fpLog = NULL;

int SwitchOp(char *SRC_FILE)
{
FILE *fpSrc = NULL;
FILE *fpDst = NULL;
int nData;
char chCmd[50] = {0};
int nCount = 0;

fpSrc = fopen(SRC_FILE, "rt");
if (NULL == fpSrc)
{
printf("Open %s fail, not have this file !/n", SRC_FILE);
return -1;
}

fpDst = fopen(TMP_FILE, "wt");
if (NULL == fpDst)
{
printf("Create %s fail, not have this file !/n", TMP_FILE);
fclose(fpSrc);
return -1;
}

nData = fgetc(fpSrc);
while (EOF != nData)
{
if ('/t' == nData)
{
fputs(" ", fpDst);
nCount++;
}
else
{
fputc(nData, fpDst);
}
nData = fgetc(fpSrc);
}
fclose(fpSrc);
fclose(fpDst);

printf("Replace file: %s TAB to file: %s 4 spaces finish, nCount:%d/n", SRC_FILE, TMP_FILE, nCount);
fprintf(fpLog, "Replace file: %s TAB to file: %s 4 spaces finish, nCount:%d/n", SRC_FILE, TMP_FILE, nCount);

if (-1 == unlink(SRC_FILE)) // 删除搜索到的文件
{ // 失败
printf("%s :%d: can not delete the file: %s/n", __FILE__, __LINE__, SRC_FILE);
}

if (-1 == rename(TMP_FILE, SRC_FILE)) // 重名名临时文件为搜索到的文件
{ // 失败
printf("%s :%d: can not rename the file: %s to %s/n", __FILE__, __LINE__, TMP_FILE, SRC_FILE);
}

return 0;
}

/*==========================================================================
函 数 名 : IsValidExtName
功 能 : 判断文件的扩展名是否为需要的,即为有效?
目前支持的扩展名长度仅为4,如.exe,.bat,.bmp...
算法实现 : 无
参 数 : [in] const char *lpcstrName - 文件名,全路径
[in] int nTotalLen - 文件名长度
返 回 值 : 有效返回TOK,无效返回TERR
作 者 : jernymy
日 期 : 20100415
==========================================================================*/
static int IsValidExtName(const char *lpcstrName, unsigned int dwTotalLen)
{
char chData[MAX_EXT_NAME_LEN+1] = {0};
unsigned int dwPos = dwTotalLen;
unsigned int dwExtLen;

if (NULL == lpcstrName)
{
printf("NULL == lpcstrName/n");
return TERR;
}

// 定位到扩展名的位置上
while (dwPos>0 && (*(lpcstrName+dwPos) != '.'))
{
dwPos--;
}

dwExtLen = dwTotalLen - dwPos;
// 如果当前的扩展名超过的扩展名的最大长度,或者没有扩展名,失败(.jpeg, makefile)
if (dwExtLen > MAX_EXT_NAME_LEN)
{
printf("dwExtLen:%d > MAX_EXT_NAME_LEN:%d/n", dwExtLen, MAX_EXT_NAME_LEN);
return TERR;
}
strncpy(chData, lpcstrName+dwPos, dwExtLen);

// 如果当前的扩展名和输入的扩展名长度不相等,失败(.c / .cpp)
if (dwExtLen != strlen(EXT_EXE_NAME))
{
return TERR;
}

// 如果当前的扩展名和输入的扩展名长度相等,但是内容不相等失败(.c / .h)
if (0 != strncmp(chData, EXT_EXE_NAME, dwExtLen))
{
return TERR;
}

return TOK;
}

static void SearchFile(void);

/*==========================================================================
函 数 名 : ChmodFile
功 能 : 修改一个文件的属性,如果文件的属性为只读的时候,使不能删除该文件的
所以将该文件改成可写的属性,并删除,重命名,然后再将属性修改为只读。
算法实现 : 无
参 数 : [in] const char *chFilePath - 文件的全路径名
[in] unsigned int nOldMode - 文件的原有的属性
[in] int nNewMode - 要求改成的属性
返 回 值 : 无
作 者 : jernymy
日 期 : 20100415
==========================================================================*/
static int ChmodFile(const char *chFilePath, unsigned int nOldMode, int nNewMode)
{
if ( (nOldMode & _A_RDONLY)
|| (nOldMode & _A_HIDDEN)
|| (nOldMode & _A_SYSTEM) )
{
fprintf(fpLog, "file attrib:%d/n", nOldMode);
printf("file attrib:%d/n", nOldMode);
if (-1 == chmod(chFilePath, nNewMode))
{
printf("chmod :%s %d fail!/n", chFilePath, nNewMode);
return TERR;
}
}
return TOK;
}

/*==========================================================================
函 数 名 : ProcessFile
功 能 : 处理文件或者目录
如果是文件则同时是对应扩展名的文件,则删除
如果是目录同时不是"."或者"..",则进入目录并递归调用
算法实现 : 无
参 数 : [in] struct _finddata_t tFile - 传入结构体信息
返 回 值 : 无
作 者 : jernymy
日 期 : 20100415
==========================================================================*/
static void ProcessFile(struct _finddata_t tFile)
{
char chFilePath[MAX_FILE_PATH_LEN];
unsigned int dwIdx;
unsigned int dwLen;

if (tFile.attrib & _A_SUBDIR)
{ // 是目录
if (tFile.name[0] != '.') // '.', '..'这两个目录为不操作的目录
{
_chdir(tFile.name); // 改变工作目录为搜索到的目录-进入该目录
_getcwd(chFilePath, MAX_FILE_PATH_LEN); // 得到当前目录的绝对路径
SearchFile(); // 递归的搜索
_chdir(".."); // 退回到上级目录
}
}
else
{ // 是文件
_getcwd(chFilePath, MAX_FILE_PATH_LEN);
dwLen = strlen(tFile.name);
for (dwIdx = 0; dwIdx < dwLen; dwIdx++)
{
tFile.name[dwIdx] = tolower(tFile.name[dwIdx]); // 把字符转换成小写字母,非字母字符不做出处理
}

if (TERR == IsValidExtName(tFile.name, dwLen))
{
return;
}
strcat(chFilePath, "//");
strcat(chFilePath, tFile.name);
puts(chFilePath); // 输出搜索到的文件

if (TERR == ChmodFile(chFilePath, tFile.attrib, S_IWRITE))
{
return;
}

SwitchOp(chFilePath);
ChmodFile(chFilePath, tFile.attrib, S_IREAD);
}
}

/*==========================================================================
函 数 名 : SearchFile
功 能 : 遍历所有的文件和目录
算法实现 : 无
参 数 : 无
返 回 值 : 无
作 者 : jernymy
日 期 : 20100415
==========================================================================*/
static void SearchFile(void)
{
int nFHandle;
struct _finddata_t tFile;

nFHandle = _findfirst("*", &tFile);
if (-1 == nFHandle)
{
return;
}
else
{
ProcessFile(tFile);
}

while (0 == _findnext(nFHandle, &tFile))
{
ProcessFile(tFile);
}

_findclose(nFHandle);

return;
}

int main(int argc, char **argv)
{
char chLog[50] = {0};
#ifdef AUTO_RUN
if (argc < 2) // no input parameter
{
printf("input parameter is too short, must 2 parameter/n");
return -1;
}

strncpy(EXT_EXE_NAME, argv[1], MAX_EXT_NAME_LEN);
#else
strncpy(EXT_EXE_NAME, ".h", MAX_EXT_NAME_LEN);
#endif

printf("now ext:%s/n", EXT_EXE_NAME);
sprintf(chLog, "%s_%s.txt", LOG_HEADER, EXT_EXE_NAME+1);
fpLog = fopen(chLog, "wt");

if (NULL == fpLog)
{
printf("Create Log file:%s fail!!!/n", chLog);
}

SearchFile();
if (NULL != fpLog)
{
fclose(fpLog);
}
getchar();

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐