2011-11-05 102 views
2

我想列出文件和他们的大小在“第一”文件夹,但我越来越奇怪的重复每两个文件。为什么文件大小会重复?

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

struct dirent *dirPtr; 
struct stat st; 

void main() 
{ 
    DIR * dirp; 
    if((dirp=opendir("first"))==NULL) 
    { 
     printf("There has been an error"); 
    } 

    while(dirPtr=readdir(dirp)) 
    { 
     printf("%s - ", dirPtr->d_name); 
     stat(dirPtr->d_name, &st); 
     printf(" file size: %lu\n", st.st_size); 
    } 
    closedir(dirp); 
} 

这是我的输出:

enter image description here

有谁知道为什么发生这种情况?

+4

'无效main' - ** ** Raaaaaaaarrrrrrrrgggggggghhhhhhhh – pmg

回答

2

对于初学者来说,你应该从查询返回结果“的stat()”,并打印如果统计()失败,错误#(而不是文件大小)。

又道: “执行opendir()” 是从一些任意目录读取文件。

问:“dirPtr-> d_name”包含完整的文件路径...或者只是一个文件名?换句话说,你是否试图从错误的目录中“stat()”?

+0

我的猜测是,STAT()返回-1。 – wildplasser

+1

刚添加: '如果(STAT(dirPtr-> d_name,&ST)== -1) { PERROR( “STAT”); }' 和我的输出改为: 。 - 文件大小:4096 .. - 文件大小:4096 test.c的 - 文件大小:2566 统计:没有这样的文件或目录 CProg2a.doc - 文件大小:2566 统计:没有这样的文件或目录 Ç介绍.ppt - 文件大小:2566 – user1031204

+0

Kewl :)所以现在你明白了这个问题。有几种解决方案,包括1)在stat()之前加上文件名的路径(例如“strcpy(full_path,dirname); strcat(full_path,filename)”或2)chdir()。并且总是检查可能失败的函数的返回值:) – paulsm4

1

每个目录至少有两个条目,将当前目录 - 单点. - 与父目录 - 两个点..

2

你基本上调用stat("test.c", &st)stat应该如何知道test.c在哪个目录?我不认为它可以。

我想你应该尝试做stat("./first/test.c", &st)stat("/full/path/to/first/test.c", &st)。更重要的是,你应该找像stat一些函数,接受struct dirent作为参数,所以你不必担心连接字符串。

我去看看是否有这样的功能和编辑我的答案,如果我找到一个。

+1

正确,则可列出目录中的文件“第一”,但你正在做的“STAT”的呼叫,因为他们在当前目录 - STAT实际上是返回一个错误,“大小”你得到的只是随机未初始化数据在st结构中。 – Soren

相关问题