2016-06-25 5 views
0

は基本的に、これはディレクトリストリームを開き、シンボリックリンクを探し、コードのシンプルな作品でなければなりません。シンボリックリンクが見つかるたびに、それが印刷されます( "シンボリックリンクが見つかりました")。 しかし、lstat(dirp->d_name,&bufコールでは常に値<が返されますが、その理由はわかりません。 私は、私は後で私のコードでclosedir()を呼び出す必要があります知っている2つのシンボリックリンク、ファイルフォルダを開くと、フォルダ内のターミナルウィンドウを開き、 ln -s ciao.txt link1ln -s ciao2.txt link2 を実行しているを作成し、これを気にしないでください。LSTATは、<0

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

void main (int argc, char* argv[]) 
{ 
    char buffer[100],dir[100]; 
    struct stat buf; 
    int x; 
    DIR *dp; 
    struct dirent *dirp; 
    if((dp=opendir(argv[1]))==NULL) 
    { 
     printf("\nError opening directory stream, now exiting...\n"); 
     exit(-1); 
    } 
    while((dirp=readdir(dp))!=NULL) 
     { 
      lstat(dirp->d_name,&buf); 
      if(S_ISLNK(buf.st_mode))  
       printf("\n%s Is a symbolic link\n",dirp->d_name); 
      else 
       printf("\n%s Is not a symbolic link\n",dirp->d_name); 



     } 


} 

何か助けていただければ幸いです。ありがとう。

+0

私はLSTATコールをチェックし、それが0 <戻っていると私は理由を知りません。 –

答えて

1

d_nameは、ディレクトリ内のファイル名ではなくフルパス名です。あなたはあなたが探しているディレクトリにchdirをeitherしなければならないか、ファイルの絶対パス名を構成しなければなりません。

最も簡単な解決策は自分のwhileループの前にこの行を追加することです:

chdir(argv[1]); 
+0

素早い答えをありがとう。基本的に、もし私が "私のやり方"をしたいのなら、私は/ home/myuser/Desktop/myfileなどのような完全なパス名が必要でしょうか? –

+0

はい、 'chdir'を使いたくない場合は、ファイルの絶対パス名を構築する必要があります。 (あるいは、完全にするために、 '../../../ Desktop/myfile'のような相対パス名を使うこともできます。) –

+0

ありがとうございました。 –

関連する問題