linux编程初试

于 2011年11月30日 发布在 linux应用 跳到评论

今天的java项目搞了一个下午,后来发现是一个小问题纠结了很长时间,悲剧。

刚刚12点,睡不着,就练习下linux编程吧,前段时间买了本《linux程序设计》,感觉挺好的,就随便看看。

照着例题敲了下,顺便总结下:

例程在P104,扫描目录。

本程序的目的是扫描一个目录,并且把目录下的内容输出出来,主要操作在printdir函数内完成。

DIR是一个目录流结构体,在dirent.h头文件中声明,目录流指针(DIR *)被用来完成各种目录操作,其使用方法与普通文件流指针(
FILE *)很相似,目录数据项在dirent结构体中返回,用户不能更改DIR中的字段。dirent结构题中包括d_ino表示文件的inode节点号,表示文件名的name等等,其相应的操作有:

DIR *opendir( const char *name );

/*打开目录失败时返回空指针,打开目录过多可能会失败*/

struct dirent *readdir( DIR *dirp );

/*到达DIR末尾时返回NULL,不改变errno的值*/

long int telldir( DIR *dirp );

/*返回值记录目录流当前位置,返回值可以用seekdir重置位置*/

void seekdir( DIR *dirp, long int loc );

/*重置dirp到loc位置*/

int closedir( DIR *dirp );

/*关闭目录流,成功时候返回0*/

 

printdir函数刚开始时候判断dir是不是能打开,如果打不开就跳出当前函数。

chdir会使程序切换到dir目录。

在while循环中每次从目录流中读出一个dirent,并且跳过.和..,如果是文件则输出文件名,如果是目录则输出目录名并递归输出这个目录。通过depth控制缩排,使输出更有层次感。

 

#include <dirent.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

void printdir(char *dir, int depth ){
	DIR *dp;
	struct dirent *entry;
	struct stat statbuf;

	if( (dp=opendir(dir)) == NULL ){
		fprintf(stdout,"cannot open directory: %s\n",dir);
		return ;
	}

	chdir(dir);
	
	while( (entry=readdir(dp)) != NULL ){
		lstat(entry->d_name,&statbuf);
		if( S_ISDIR( statbuf.st_mode ) ){
			/* Found a directory, but ignore . and .. */
			if( strcmp(".",entry->d_name) == 0 ||
				strcmp("..",entry->d_name) == 0 )
				continue;
			
			printf("%*s%s/\n",depth,"",entry->d_name);
			printdir(entry->d_name,depth+4);
		}
		else 
			printf("%*s%s\n",depth,"",entry->d_name);
	}
	chdir("..");
	closedir(dp);
}

int main(void){
	printf("Directory scan of /home:\n");
	printdir("/home",0);
	printf("done\n");
	return 0;
}

stat结构中会保存文件的状态信息,其中包含了文件权限和类型信息,
UID,GID,访问时间(atime,ctime,mtime)等等。这个程序用到了stat中的st_mode和与之相关联的宏。st_mode包含了文件权限和类型信息,用sys/stat.h中的宏S_ISDIR判断判断st_mode可以知道数据是不是目录。

本文共有 6条评论 | 沙发:文章评论

  1. 名字说道:

    看着你们的blog觉得好活跃。。。我考研考的都快成已经过气的人了。。

  2. 名字说道:

    忘记写名字了。。。gb

  3. Tanky Woo说道:

    Linux程序设计以前看过前面一些,我现在再看APUE在

  4. Tanky Woo说道:

    我也准备转向linux程序设计了,APUE我买的英文版,压力不是一般的大。。。 :!:

留下评论!

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)