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

📄 dirtraverse.c

📁 这是Linux环境下的openobex
💻 C
字号:
#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <stdio.h>#include <string.h>#include <unistd.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/param.h>#include <dirent.h>#include "dirtraverse.h"#include "debug.h"#define TRUE  1#define FALSE 0//// Read all files in a directory. Continue recusively down in directories.//int visit_dir(char *path, visit_cb cb, void *userdata){	struct stat statbuf;	DIR *dir;	struct dirent *dirent;	char t[MAXPATHLEN];	int len;	int ret = 1;	dir = opendir(path);	if(dir == NULL) {		return -1;	}	dirent = readdir(dir);	while(dirent != NULL) {		if(strcmp(".", dirent->d_name) == 0) {		}		else if(strcmp("..", dirent->d_name) == 0) {		}		else {			snprintf(t, MAXPATHLEN, "%s/%s", path, dirent->d_name);			if(lstat(t, &statbuf) < 0) {				return -1;			}			else if(S_ISREG(statbuf.st_mode)) {				ret = cb(VISIT_FILE, t, "", userdata);				if( ret  < 0)					goto out;			}						else if(S_ISDIR(statbuf.st_mode)) {				ret = cb(VISIT_GOING_DEEPER, dirent->d_name, path, userdata);				if( ret < 0)					goto out;				len = strlen(path);				sprintf(path, "%s%s/", path, dirent->d_name);				ret = visit_dir(t, cb, userdata);				if(ret < 0)					goto out;				ret = cb(VISIT_GOING_UP, "", "", userdata);				if(ret < 0)					goto out;				path[len] = '\0';			}			else {				// This was probably a symlink. Just skip			}		}		dirent = readdir(dir);	}out:	return ret;}//////int visit_all_files(char *name, visit_cb cb, void *userdata){	struct stat statbuf;	int ret;	char path[MAXPATHLEN];	if(stat(name, &statbuf) < 0) {		DEBUG(0, "Error stating %s\n", name);		ret = -1;		goto out;	}	if(S_ISREG(statbuf.st_mode)) {		/* A single file. Just visit it, then we are done. */		ret = cb(VISIT_FILE, name, "", userdata);	}	else if(S_ISDIR(statbuf.st_mode)) {		/* A directory! Enter it */		snprintf(path, MAXPATHLEN, "%s", name);		/* Don't notify app爄f going "down" to "." */		if(strcmp(name, ".") == 0)			ret = 1;		else			ret = cb(VISIT_GOING_DEEPER, name, "", userdata);		if(ret < 0)			goto out;		ret = visit_dir(path, cb, userdata);		if(ret < 0)			goto out;		ret = cb(VISIT_GOING_UP, "", "", userdata);		if(ret < 0)			goto out;	}	else {		/* Not file, not dir, don't know what to do */		ret = -1;	}out:	return ret;}#if 0int visit(int action, char *name, char *path, void *userdata){	switch(action) {	case VISIT_FILE:		printf("Visiting %s\n", filename);		break;	case VISIT_GOING_DEEPER:		printf("Going deeper %s\n", filename);		break;	case VISIT_GOING_UP:		printf("Going up\n");		break;	default:		printf("going %d\n", action);	}	return 1;}//////int main(int argc, char *argv[]){//	visit_all_files("Makefile", visit);//	visit_all_files("/usr/local/apache/", visit);	visit_all_files("testdir", visit);	return 0;}#endif

⌨️ 快捷键说明

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