- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
更新:我已经通过在调用 opendir() 之前使用 chdir() 更改当前工作目录解决了该问题。所以我假设 opendir() 只能打开当前工作目录中的目录。所以我的新问题是,我正确吗?
我目前正在编写 Windows 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 arguments\n");
}
//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() 的调用将找不到该文件。
关于c - st_mode 值不正确 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14330466/
这个问题在这里已经有了答案: stat() error 'No such file or directory' when file name is returned by readdir() (2
有没有办法使用 st_mode 值来识别对象是文件还是目录? 我正在使用 paramiko lstat() 从 sftp 文件中检索 st_mode 信息。 最佳答案 是的,stat structur
这个问题已经有答案了: stat outputting the wrong values for files in a directory (1 个回答) 已关闭 9 年前。 我正在编写一个程序来打印
编译器:Code::Blocks(GNU GCC) 平台:Windows(x86) 更新:我已经通过在调用 opendir() 之前使用 chdir() 更改当前工作目录解决了该问题。所以我假设 op
为了尝试在每次程序执行时创建一个新目录,我写了以下内容: #include #include #include #include #include int main(int argc, ch
谁能告诉我 ST_MODE 函数中的数字是什么意思? 例子: >>>import os >>>stat = os.stat('/home') >>>print stat.st_mode 16877
我想知道一个文件是一个目录还是一个普通文件 stat : #define _DEFAULT_SOURCE #include #include #include int is_regular_fi
我是 Unix 编程和 C 的初学者,我有两个关于 struct stat 及其字段 st_mode 的问题: 当如下访问 st_mode 字段时,返回什么类型的数字(八进制、十进制等)? struc
我试图理解该 stat 命令的 stat 结构的 st_mode 字段的标志,但我遇到了这么困难的时期!我找到了这个例子 here , 但我真的不明白这个代码片段: if ( mode & S_IRU
我是 Unix 编程和 C 的初学者,我有两个关于 stat struc 及其字段 st_mode 的问题: 访问如下 st_mode 字段时,返回什么类型的数字(八进制、十进制等)? struct
我正在尝试使用 C 中的 stat 函数调用来打印 Linux 中文件的权限。我在网上找到了一些有用的代码,其中包含这些段 printf( (fileStat.st_mode & S_IRUSR) ?
我快要疯了。我正在尝试编写一个可以存储和提取文件的存档库。存档文件如下所示: file contents (154 byte) 每个文件都由 header ( ) 标识,其中包含四个“标签”(以逗
我有一个检查文件 st_mode 的代码: self.assertEqual(16877, os.stat(my_directory).st_mode) 只有老派的 unix 专家才能流畅地破译整数值
我正在尝试使用返回的 stat 结构中的 st_mode,该结构是我通过以下方式从 stat() 调用获得的; char *fn = "test.c" struct s
我是一名优秀的程序员,十分优秀!