电脑技术学习

UNIX 文件系统基本操作

dn001

  既然已经得到了目录的条目名称,那么您需要构造一个更加完整的路径(请参见清单 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 ) );
    }

标签: