st_mode值-C不正确

  • 本文关键字:不正确 mode st posix
  • 更新时间 :
  • 英文 :

  • 编译器:代码::块(GNU GCC(
  • 平台:Windows(x86(

更新:在调用opendir((之前,我使用chdir((更改了当前的工作目录,从而解决了这个问题。因此,我假设opendir((只能打开当前工作目录中的目录。所以我的新问题是,我是对的吗?

我目前正在编写一个基本的模仿窗口的dir命令。当"."通配符用作opendir((的参数时,我的程序可以正常工作。但是当我不使用通配符,而是指定一个目录时。我的程序不会打开指定给它的目录。例如,如果我键入c:\windows,它会打开c:\,并且每个文件的st_mode都是相同的。至少我假设它们都是一样的,因为所有的文件类型(DIR、file、OTHER(都是一样。

#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <dirent.h>
int main(int argc, char* argv[])
{
//'directory' points to the directory | 'directory_contents' is used with readdir() to read the directory's('directory') contents.
DIR *directory;
struct dirent *directory_contents;
struct stat file_info;
//IF no argument is present display the contents of the current directory | IF there is an arugment display the contents of that argument | ELSE Too many arguments
if (argc == 1)
{
    directory = opendir(".");
}
else if (argc == 2)
{
    //New Code
    chdir(argv[1]); directory = opendir(".");
    //Old Code
    directory = opendir(argv[1]);
}
else
{
    printf("ERROR: Extra argumentsn");
}
//Checks to see if the directory opened above was actually opened.
if (directory == NULL)
{
    printf("ERROR: Failed to open '%s'.n", argv[1]);
    return 2;
}
else
{
    //WHILE there are file names to be read THEN read the file names
    while (directory_contents = readdir(directory))
    {
        stat(directory_contents->d_name, &file_info);
        //Test for directory
        if(S_ISDIR(file_info.st_mode))
        {
            //File type
            printf("<DIR>   ");
            //File name
            if(strlen(directory_contents->d_name) <= 15)
            {
                printf("%-15s", directory_contents->d_name);
            }
            else if(strlen(directory_contents->d_name) > 15)
            {
                printf("%.12s.. ", directory_contents->d_name);
            }
            //File premissions
            printf("<%c%c%c>n", ((file_info.st_mode & S_IRUSR)==0) ? '-' : 'r', ((file_info.st_mode & S_IWUSR)==0) ? '-' : 'w', ((file_info.st_mode & S_IXUSR)==0) ? '-' : 'x');
        }
        //Test for a regular file.
        else if(S_ISREG(file_info.st_mode))
        {
            //File type
            printf("<FILE>  ");
            //File name
            if(strlen(directory_contents->d_name) <= 15)
            {
                printf("%-15s", directory_contents->d_name);
            }
            else if(strlen(directory_contents->d_name) > 15)
            {
                printf("%.12s.. ", directory_contents->d_name);
            }
            //File premissions
            printf("<%c%c%c> ", ((file_info.st_mode & S_IRUSR)==0) ? '-' : 'r', ((file_info.st_mode & S_IWUSR)==0) ? '-' : 'w', ((file_info.st_mode & S_IXUSR)==0) ? '-' : 'x');
            //File size
            if (file_info.st_size < 1000)
            {
                printf("<%-3i B>n", file_info.st_size);
            }
            else if ( (file_info.st_size > 1000) && (file_info.st_size < 1000000) )
            {
                printf("<%-3i KB>n", file_info.st_size/1000);
            }
            else if ( (file_info.st_size > 1000000) && (file_info.st_size < 1000000000) )
            {
                printf("<%-3i MB>n", file_info.st_size/1000000);
            }
            else
            {
                printf("<%-3i GB>n", file_info.st_size/1000000000);
            }
        }
        //Symbolic Link etc.
        else
        {
            //File type
            printf("<OTHER> ");
            //File name
            if(strlen(directory_contents->d_name) <= 15)
            {
                printf("%-15s", directory_contents->d_name);
            }
            else if(strlen(directory_contents->d_name) > 15)
            {
                printf("%.12s.. ", directory_contents->d_name);
            }
            //File premissions
            printf("<%c%c%c>n", ((file_info.st_mode & S_IRUSR)==0) ? '-' : 'r', ((file_info.st_mode & S_IWUSR)==0) ? '-' : 'w', ((file_info.st_mode & S_IXUSR)==0) ? '-' : 'x');
        }
    }
}
}

是的,我知道我输出的权限完全无关,因为Window使用了ACL。我只是在windows上写这个程序,因为我现在别无选择,但它是为Linux操作系统设计的。

stat(directory_contents->d_name,

这条线就是问题所在。d_name字段只是没有任何目录的文件名。因此,除非该目录恰好是当前目录,否则对stat()的调用将找不到该文件。

相关内容

  • 没有找到相关文章

最新更新