曾记得,当年要来公司实习的时候,公司的技术主管给我们都出了一道编程题目,题目倒是不难,但还是挺有意思。今天在看有关文件操作相关的内容,想起了,又做了一下。不过这次做得有些仓促,没有做完,先做一部分,后面的有时再补上。
题目的要求是从命令行启动程序,程序的参数为给出的扫描目录,获得目录下所有的文件,并生成相应的xml文件。(由于xml相关的操作api还不了解,就暂时没有做这部分。)
做出来的代码如下:
-----------------------------------------code start--------------------------------------------------------------
-------------------------------------------ls_dir.c-----------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
void usage(void)
{
printf("Usage: ls_dir dirname /n");
}
int main(int argc, char *argv[])
{
DIR *dp;
struct dirent *filename;
struct stat info;
mode_t mode;
char dir[100];
if( argc < 2 )
{
usage();
exit(1);
}
int main(int argc, char *argv[])
{
DIR *dp;
struct dirent *filename;
struct stat info;
mode_t mode;
char dir[100];
if( argc < 2 )
{
usage();
exit(1);
}
dp = opendir(argv[1]);
if( !dp )
{
fprintf(stderr, "open directory error!! /n");
return 0;
}
while( filename = readdir(dp) )
{
sprintf(dir,"%s/%s",argv[1],filename->d_name);
stat(dir, &info);
if(S_ISDIR(info.st_mode))
printf("This is a directory. /n");
printf("filename: %-10s d_info:%ld d_reclen:%us /n",
filename->d_name, filename->d_ino, filename->d_reclen);
}
closedir(dp);
return EXIT_SUCCESS;
}
----------------------------------------------code end------------------------------------------------------------------------------
涉及到的结构体有struct dirent,系统中的定义如下,可以用man readdir来获得帮助:
struct dirent {
long d_ino; /* inode number */
off_t d_off; /* offset to this dirent */
unsigned short d_reclen; /* length of this d_name */
char d_name[NAME_MAX+1]; /* filename (null-terminated) */
}
struct stat结构体定义如下:
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for filesystem I/O */
blkcnt_t st_blocks; /* number of blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
实现过程:
1->opendir打开输入的目录字符串,将结果保存到DIR指针中。
2->readdir依次读取DIR指针指向,直到DIR指针为NULL
3->从dirent结构体中读取每个文件的名字、长度等信息。
4->用stat获取文件的信息
5->通过宏命令来判断文件的类型