2011-12-12 108 views
1

我在C語言函數中遇到問題。我的應用程序必須列出兩個目錄中的所有文件(尚未實現第二個目錄)。當dir1設置爲「。」時爲當前目錄它列出所有文件。如果我將其更改爲所需的目錄,它將只列出一個文件。C stat()忽略文件

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

main() 
{ 
    DIR *dir1; 
    DIR *dir2; 
    dir1 = opendir ("/home/tom/Documents/Uni/Dropbox/OS/C/1/"); 
    dir2 = opendir ("/home/tom/Documents/Uni/Dropbox/OS/C/2/"); 
    struct dirent *ent; 
    struct stat fileStat; 

    if (dir1 != NULL) 
    { 
     /* while there are files to read in the directory */ 
     while ((ent = readdir (dir1)) != NULL) 
     { 
     /*printf ("In 1\n"); <--debugging--> */ 
     if (stat(ent->d_name,&fileStat) == 0) 
     { 
      /* ignores . and .. and hidden files */ 
      /* printf ("In 2\n"); <--debugging--> */ 
      if(ent->d_name[0] != '.') 
      { 
       /* printf ("In 3\n"); <--debugging--> */ 
       printf ("\n"); 
       printf ("File: %s\n", ent->d_name); 
       printf ("File size: %d\n", fileStat.st_size); 
       printf ("-----------------------------------\n"); 
      } 
     } 
    } 
    /* close the 1st directory */ 
    closedir (dir1); 
    /* close the 2nd directory */ 
    closedir (dir2); 
    } 
    else 
    { 
     /* prints an error if the directory can not be opened */ 
     perror (""); 
    } 
} 

運行程序的結果如下:

[email protected]:~/Documents/Uni/Dropbox/OS/C$ ./ffffuuuuuu 

File: ffffuuuuuu.c 
File size: 1045 
----------------------------------- 

這是目錄中的LS的是讀取結果:

[email protected]:~/Documents/Uni/Dropbox/OS/C/1$ ls -l 
total 36 
-rw-r--r-- 1 tom tom 356 Dec 12 23:36 cwTest2.c 
-rw-r--r-- 1 tom tom 322 Dec 12 23:36 cwTest.c 
-rw-r--r-- 1 tom tom 627 Dec 12 23:36 ffffuuuuuu.c 
-rw-r--r-- 1 tom tom 6 Dec 12 23:32 file 
-rw-r--r-- 1 tom tom 6 Dec 12 23:32 file2 
-rw-r--r-- 1 tom tom 6 Dec 12 23:45 file2.file 
-rw-r--r-- 1 tom tom 15 Dec 12 23:33 file3 
-rw-r--r-- 1 tom tom 15 Dec 12 23:45 file3.file 
-rw-r--r-- 1 tom tom 6 Dec 12 23:45 file.file 

在此先感謝, 湯姆。

+0

你目前的目錄是什麼?這些條目是相對於「/ home/tom/Documents/Uni/Dropbox/OS/C/1 /」(你應該給stat()完整路徑名)還有:條目比「。」多。和「..」以「。」開頭。 – wildplasser

+1

輸出stat的錯誤,你就會知道問題是什麼。 – Beginner

+0

@wildplasser我運行在/ home/tom/Documents/Uni/Dropbox/OS –

回答

0
#include <stdio.h> 
#include <string.h> 
#include <dirent.h> 
#include <sys/stat.h> 
#include <sys/types.h> 

int main (void) 
{ 
    char * dirname = "/home/tom/Documents/Uni/Dropbox/OS/C/1/" ; 
    DIR *dir1; 
    char path[11111]; 
    size_t len; 
    struct dirent *ent; 
    struct stat fileStat; 

    dir1 = opendir (dirname); 
    len = strlen (dirname); 
    memcpy(path, dirname, len+1); 

    struct dirent *ent; 
    struct stat fileStat; 

    if (dir1 != NULL) 
    { 
     /* while there are files to read in the directory */ 
     while ((ent = readdir (dir1)) != NULL) 
     { 
     /*printf ("In 1\n"); <--debugging--> */ 
     strcpy(path+len, ent->d_name); 
     if (stat(path,&fileStat) == 0) 
     { 
      /* ignores . and .. and hidden files */ 
      /* printf ("In 2\n"); <--debugging--> */ 
      if(ent->d_name[0] != '.') 
      { 
       /* printf ("In 3\n"); <--debugging--> */ 
       printf ("\n"); 
       printf ("File: %s\n", ent->d_name); 
       printf ("File size: %d\n", fileStat.st_size); 
       printf ("-----------------------------------\n"); 
      } 
     } 
    } 
    /* close the 1st directory */ 
    closedir (dir1); 
    } 
    else 
    { 
     /* prints an error if the directory can not be opened */ 
     perror (""); 
    } 
return 0; 
} 

更新,因爲有些人不識字,我會在這裏我原來的評論:

什麼是你的當前目錄?這些條目是相對於「/ home/tom/Documents/Uni/Dropbox/OS/C/1 /」(你應該給stat()完整路徑名)還有:條目比「。」多。和「..」以「。」開頭。

+0

沒有文字或任何內容說明你在這裏爲你的解決方案做了什麼。你做了什麼? –

+1

我在OP的評論中加入了它。差異是你的朋友。順便說一句:我更新了。 – wildplasser

+0

與我剪切並粘貼代碼的本地應用程序不同,或者本網站上的某些內容我不知道?順便說一句,-1不是我。 –

1

您必須將名稱指定爲stat(),作爲絕對路徑名或相對於當前目錄的名稱。

如果您的掃描儀正在更改目錄,則(a)您比我更勇敢,(b)您可以使用短名稱,但(c)您必須擔心如何返回到哪裏你開始了。

如果您有POSIX 2008,則可以使用系統調用的*at()變體來簡化生活;但我不確定有多少系統(如果有的話)支持這些呼叫。