⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fsch.c

📁 linux系统下实现类似win的对多个文件的文件内容检索的功能
💻 C
字号:
/** * Title: cploader.c * Type: C (*.c) * Complier: gcc version 3.3.2 20031022 (Red Hat Linux 3.3.2-1) * Description: send file to armboard's flash * Copyright: Copyright (c) 2004 * Company: djws * author djws * version 1.0 */ /* search the file or directory's content */#include <stdlib.h>#include <stdio.h>#include <string.h>#include <dirent.h>#include <sys/stat.h>#define PRINT_VERSION printf("version 1.0\n");long flen(FILE *fp);void print_help();void default_init(char *filename, char *topic, char *schstr);void myerror(char *str);void file_search(char *filename, char *str, char *topic);void do_search(char *filename, char *topic, char *str);int count;//int showcount;//char show[5] = "/-\\-";longflen(FILE *fp) {	int i = 0;	if(fp == NULL)		return 0;	if(fseek(fp, 0, SEEK_SET))		return 0;	while(!feof(fp)) {		i++;		fgetc(fp);	}	if(fseek(fp, 0, SEEK_SET))		return 0;	return i-1;}voidprint_help() {	printf("Example: fsch [options]... [parameter]...\n");	printf("Options: \n");	printf("               -f, --filename  [PATH]    set your search path (or file's name), default is '/root'\n");	printf("               -t, --topic     [KEY]     set the key which files' name include, default is empty\n");	printf("               -s, --string    [string]  set the string your want to search in the file, default is 'DJWS'\n");	printf("               -h, --help                print help\n");	printf("               -v, --version             print version\n");	printf("Finished.\n");}voiddefault_init(char *filename, char *topic, char *schstr) {	strcpy(filename, "/root");	strcpy(topic, "");	strcat(schstr, "DJWS");}voidmyerror(char *str) {	printf("%s\n", str);	exit(0);}voidfile_search(char *filename, char *str, char *topic) {	FILE *fp = NULL;	long len = 0;	char *buf = NULL;	int i, j, k;	char tmp[1024];	if(strstr(filename, topic) == NULL) {		//printf("! filename=%s topic=%s\n", filename, topic);		strcpy(tmp, filename);		return;	}	//l = strlen(filename)+12;	//printf("Check file: %s\n", filename);	if((fp=fopen(filename, "rb")) == NULL) {		printf("fail to open the file: %s\n", filename);		return;	}	fseek(fp, 0, SEEK_SET);	len = flen(fp);	if(len < strlen(str)) {		fclose(fp);		return;	}	buf = (char *)malloc(2048);	while(len > 2048) {		fread((void *)buf, 2048, 1, fp);		for(i=0;i<1024;i++) {			for(j=0;j<strlen(str);j++)				tmp[j] = *(buf+i+j);			tmp[strlen(str)] = '\0';			if(strcmp(tmp, str) == 0) {				/*printf("\r");				for(k=0;k<l;k++)					printf(" ");				printf("\r");*/				count++;				printf("%s\n", filename);				fclose(fp);				free(buf);				return;			}		}		len -= 1024;		fseek(fp, -1024, SEEK_CUR);	}	fread((void *)buf, len, 1, fp);	for(i=0;i<len-strlen(str);i++) {		for(j=0;j<strlen(str);j++)			tmp[j] = *(buf+i+j);		tmp[strlen(str)] = '\0';		if(strcmp(tmp, str) == 0) {			/*printf("\r");			for(k=0;k<l;k++)				printf(" ");			printf("\r");*/			count++;			printf("%s\n", filename);			fclose(fp);			free(buf);			return;		}	} 	free(buf);	/*printf("\r");	for(k=0;k<l;k++)		printf(" ");	printf("\r");*/	fclose(fp);}voiddo_search(char *filename, char *topic, char *str) {	char tmp[1280];	DIR *dp = NULL;	struct dirent *dirp = NULL;	struct stat filestat;	int len = strlen(filename);	if(filename[len-1] == '/')		filename[len-1] = 0;	if(stat(filename, &filestat) < 0)		myerror("Stat Read Error.\n");	if(S_ISREG(filestat.st_mode)) {		file_search(filename, str, topic);		return;	}	else if(S_ISDIR(filestat.st_mode)) {		if((dp=opendir(filename)) == NULL) {			printf("Can't open directory%s\n", filename);			return;		}		strcpy(tmp, filename);		while((dirp=readdir(dp)) != NULL) {			strcat(tmp, "/");			strcat(tmp, dirp->d_name);			if((strcmp(dirp->d_name, ".")==0) || (strcmp(dirp->d_name, "..")==0)) {			strcpy(tmp, filename);			continue;			}			/*if(strstr(tmp, topic) == NULL) {				strcpy(tmp, filename);				continue;			}*/			if(stat(tmp, &filestat) < 0)				myerror("Stat Read Error.\n");			if(S_ISDIR(filestat.st_mode)) {				do_search(tmp, topic, str);			}			else if(S_ISREG(filestat.st_mode)) {				file_search(tmp, str, topic);			}			strcpy(tmp, filename);		}		closedir(dp);	}	else {		printf("File type error, must be a file or a directory!\n");		return;	}}intmain(int argc, char **argv) {	char cmd[1024];	char param[1024];	int i = 1;	int readparam = 0;	char topic[1024];	char filename[1024];	char schstr[1024];	default_init(filename, topic, schstr);	while(i < argc) {		i++;		if(strlen(argv[i-1]) > 1023) {			printf("Too long Parameter, Error.\n");			print_help();			exit(0);		}		if(readparam == 1) {			strcpy(param, argv[i-1]);			if(param[0] == '-') {				printf("Parameter Error.\n");				print_help();				exit(0);			}			if((strcmp(cmd, "--string")==0) || (strcmp(cmd, "-s")==0)) {				strcpy(schstr, param);			}			else if((strcmp(cmd, "--filename")==0) || (strcmp(cmd, "-f")==0)) {				strcpy(filename, param);			}			else if((strcmp(cmd, "--topic")==0) || (strcmp(cmd, "-t")==0)) {				strcpy(topic, param);			}			else {				printf("Parameter Error.\n");				print_help();				exit(0);			}			readparam = 0;		}		else {			strcpy(cmd, argv[i-1]);			if(strlen(cmd) <= 1) {				printf("Parameter Error.\n");				print_help();				exit(0);			}			if(cmd[0] != '-') {				printf("Parameter Error.\n");				print_help();				exit(0);			}			if((strcmp(cmd, "--help")==0) || (strcmp(cmd, "-h")==0)) {				print_help();				exit(0);			}			if((strcmp(cmd, "-version")==0) || (strcmp(cmd, "-v")==0)) {				PRINT_VERSION				exit(0);			}			readparam = 1;		}	}	if((readparam==1) && (argc!=1)) {			print_help();			exit(0);	}	printf("\nfound string \"%s\" in followed files:\n\n", schstr);	count = 0;//	showcount = 0;	do_search(filename, topic, schstr);	printf("\n%d files found.\nEND!\n", count);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -