簡體   English   中英

錯誤:stat:C編程中沒有這樣的文件或目錄,opendir()和stat()

[英]ERROR: stat: No Such File Or Directory, opendir() and stat() in C programming

嘿,謝謝您的閱讀。

我正在制作一個程序,該程序接受1個參數(目錄),並使用opendir()/ readdir()讀取目錄中的所有文件,並使用stat顯示文件類型(reg,鏈接,目錄等)。 在外殼程序中執行我的程序時,我收到錯誤消息“ No Such file or Directory”(我在使用Redhat Linux)。 這是我的代碼:

#define _BSD_SOURCE
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {

    DIR *dirp;
    struct dirent* dent;
    struct stat info;

//If no args
    if(argc == 1){

        argv[1] = ".";  

            dirp=opendir(argv[1]); // specify directory here: "." is the "current directory"
            do {
                dent = readdir(dirp);
                if (dent)
                {
//////////////////////////////////////////////////////////////////////////
               if (stat(dent->d_name, &info) == -1) {
               perror("stat");
               exit(EXIT_FAILURE);
           }

           switch (info.st_mode & S_IFMT) {
           case S_IFBLK:  printf("block device\n");            break;
           case S_IFCHR:  printf("character device\n");        break;
           case S_IFDIR:  printf("dir ");                      break;
           case S_IFIFO:  printf("FIFO/pipe\n");               break;
           case S_IFLNK:  printf("lnk ");                      break;
           case S_IFREG:  printf("reg ");                      break;
           case S_IFSOCK: printf("socket\n");                  break;
           default:       printf("unknown?\n");                break;
           }

//////////////////////////////////////////////////////////////////////////

                    printf("%s \n", dent->d_name);

                }
            } while (dent);
            closedir(dirp);

       }

////////////////////////////////////////////////////////////////////////////////////////////////
//If specified directory    
    if(argc > 1){

        dirp=opendir(argv[1]); // specify directory here: "." is the "current directory"
        do {
            dent = readdir(dirp);
            if (dent)
            {

/////////////////////////////////////////////////////////////////////////////////////           
               if (stat(dent->d_name, &info) == -1) {
               perror("stat");
               exit(EXIT_FAILURE);
           }



           switch (info.st_mode & S_IFMT) {
           case S_IFBLK:  printf("block device\n");            break;
           case S_IFCHR:  printf("character device\n");        break;
           case S_IFDIR:  printf("dir ");                      break;
           case S_IFIFO:  printf("FIFO/pipe\n");               break;
           case S_IFLNK:  printf("lnk ");                      break;
           case S_IFREG:  printf("reg ");                      break;
           case S_IFSOCK: printf("socket\n");                  break;
           default:       printf("unknown?\n");                break;
           }
//////////////////////////////////////////////////////////////////////////////////////
//           printf("%s\n", argv[1]);

                printf("%s \n", dent->d_name);
            }
        } while (dent);
        closedir(dirp);

   } 
return 0;    
}

有任何想法嗎? 我有點卡住了。 感謝您的輸入

另外,是否將使用stat輸出“鏈接”類型的文件,還是必須使用lstat? 不知道在這種情況下如何使用lstat,如果我將結構類型更改為“ struct lstat info”,則會引發錯誤。

dent->d_name是相對於當前目錄的文件名(例如“ /home/barney/myfile.txt”),而不是文件的絕對完整路徑(例如/home/barney/sources/myfile.txt),這是stat期望的。

這就是為什么stat無法找到路徑。 在每次調用stat之前打印dent->d_name ,以觀察這些錯誤的路徑。

編輯:您可以嘗試chdir()將您的工作目錄更改為argv [1]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM