既然已经得到了目录的条目名称,那么您需要构造一个更加完整的路径(请参见清单 5),然后调用 lstat() 以获取该条目的相关信息。因为符号链接需要特殊的处理,所以这里使用了 lstat() 函数。您可以使用 readlink() 函数找到其目标文件。
如果该条目是一个目录,那么对这个目录递归地调用 process_Directory(),并将其中所找到的条目数加到运行总数中。如果该条目是一个文件,那么显示其名称和字节数(可在 struct stat 的 st_size 成员中找到)。
清单 5. 处理条目
(void)strncpy( pathName, theDir, PATH_MAX );
(void)strncat( pathName, "/", PATH_MAX );
(void)strncat( pathName, entry.d_name, PATH_MAX );
if( lstat( pathName, &entryInfo ) == 0 ) {
/* stat() succeeded, let's party */
count++;
if( S_ISDIR( entryInfo.st_mode ) ) {
/* directory */
printf( "processing %s/n", pathName );
count += process_directory( pathName );
} else if( S_ISREG( entryInfo.st_mode ) ) {
/* regular file */
printf( "t%s has %lld bytesn",
pathName, (long long)entryInfo.st_size );
} else if( S_ISLNK( entryInfo.st_mode ) ) {
/* symbolic link */
char targetName[PATH_MAX + 1];
if( readlink( pathName, targetName, PATH_MAX ) != -1 ) {
printf( "t%s -> %sn", pathName, targetName );
} else {
printf( "t%s -> (invalid symbolic link!)n",
pathName );
}
}
} else {
printf( "Error statting %s: %sn", pathName, strerror(
errno ) );
}
标签: