则替换当前目录下包含在目录的所有.的文件中的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;
}
操作方法: 在生成的可执行程序(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;
}
相关文章推荐
- linux查找当前目录下包含某一单词的所有文件并进行替换
- linux下查找当前目录下,所以包含&quot;&lt;s3c2410.h&gt;&quot;的普通文件
- python 文件和目录 当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径。
- 在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径
- #include<bits/stdc++.h>包含C++的所有头文件
- [linux]查找当前目录下所有文件内容是否包含某字符
- grep命令查找当前目录下包含某个字符串的所有文件
- linux命令行查找当前目录下所有文件是否包含特定string
- #include<bits/stdc++.h>包含C++的所有头文件
- Linux常用自定义脚本系列(find-in-jar) - 在当前目录中查找包含着某个类的所有jar文件
- 搜索当前目录下所有文件包含某关键词的文本/文件名/行号
- 当前目录下有a和b两个文件,执行命令“ls>c”,请问文件c里面的内容是什么?
- #include<bits/stdc++.h>包含C++的所有头文件
- 7-zip 把当前目录下所有的文件压缩成zip,同时不包含档案目录文件
- perl,替换当前目录下所有文件中的某个串
- 【代码】当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出绝对路径
- 编写一个Python程序,能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径
- Linux查找当前目录及其子目录下所有包含指定字符串的文件
- 查找当前目录下所有文件中的文本:grep "text" * -nR
- #include<bits/stdc++.h>包含C++的所有头文件