- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在制作一个在 Linux shell 中运行的程序,它接受一个参数(一个目录),并显示目录中的所有文件及其类型。
输出应该是这样的:
<< ./Program testDirectory
Dir directory1
lnk linkprogram.c
reg file.txt
如果没有参数,它使用当前目录。这是我的代码:
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
int main(int argc, char *argv[])
{
struct stat info;
DIR *dirp;
struct dirent* dent;
//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)
{
printf("%c ", dent->d_type);
printf("%s \n", dent->d_name);
/* if (!stat(dent->d_name, &info))
{
//printf("%u bytes\n", (unsigned int)info.st_size);
}*/
}
} 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)
{
printf("%c ", dent->d_type);
printf("%s \n", dent->d_name);
/* if (!stat(dent->d_name, &info))
{
printf("%u bytes\n", (unsigned int)info.st_size);
}*/
}
} while (dent);
closedir(dirp);
}
return 0;
}
由于某些原因,dent->d_type
没有显示文件类型。我不太确定该怎么做,有什么建议吗?
最佳答案
d_type
是一种速度优化,可在支持时节省 lstat(2)
调用。
作为readdir
(3) man page指出,并非所有文件系统都在 d_type
字段中返回真实信息(通常是因为需要额外的磁盘搜索来读取 inode,如果您不使用 ,XFS 就是这种情况mkfs.xfs -n ftype=1
(由 -m crc=1
暗示,这还不是默认设置)。总是设置 DT_UNKNOWN
的文件系统在现实生活,而不是你可以忽略的东西。XFS 不是唯一的例子。
您始终需要能够回退到使用 lstat
(2) 的代码如果 d_type==DT_UNKNOWN
,如果文件名本身不足以决定它是无趣的。 (某些调用者就是这种情况,例如 find -name
或扩展 glob,例如 *.c
,这就是为什么 readdir
不会产生如果需要额外的磁盘读取,则填充它的开销。)
Linux getdents(2)
手册页有一个示例程序可以执行您正在尝试执行的操作,包括一个链式三元运算符 block ,用于将 d_type
字段解码为文本字符串。 (正如其他答案所指出的,您的错误是将其作为字符打印出来,而不是将其与 DT_REG
、DT_DIR
等进行比较)
无论如何,其他答案大多涵盖了一些内容,但遗漏了关键细节,即您需要回退 d_type == DT_UNKNOWN
(Linux 上为 0。d_type
存储在以前的填充字节中,直到 Linux 2.6.4)。
为了便于移植,您的代码需要检查 struct dirent
甚至有一个 d_type
字段(如果您使用它),否则您的代码甚至不会在 GNU 和 BSD 系统之外编译。 (参见 readdir(3)
)
我为 finding directories with readdir 写了一个例子,当 d_type 在编译时不可用、为 DT_UNKNOWN 和符号链接(symbolic link)时,使用 d_type
回退到 stat
。
关于检查一个目录。 readdir 返回的条目是目录、链接或文件。 dent->d_type 没有显示类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23958040/
DIR *dir_ptr; struct dirent *dir_entery; dir_ptr = opendir("/tmp"); while (dir_ptr&&(dir_entery = re
我惊讶地发现手册页中包含 readdir 的两个冲突变体的条目。 在 READDIR(2) 中,它特别指出你不想使用它: This is not the function you are intere
我在 Julia 1.7 的 readdir 上使用 isdir 过滤器时遇到了一些问题。运行以下命令: println(readdir("data/")) println(isdir("data/S
我有一个当前正在使用 while 循环处理的目录。文件名实际上是这样的日期: updates.20130831.1445.hr updates.20140831.1445.hr updates.201
int indent = 0; int listDir(const char* dirname){ DIR* dir; struct dirent* d; if(!(dir =
我使用以下代码循环遍历目录以打印出文件的名称。但是,并未显示所有文件。我尝试过使用 clearstatcache 但没有效果。 $str = ''; $ignore = array('
我使用以下代码循环遍历目录以打印出文件的名称。但是,并未显示所有文件。我尝试过使用 clearstatcache 但没有效果。 $str = ''; $ignore = array('
到目前为止,我知道在 Perl 中打开和读取目录的两种方法。您可以使用 opendir、readdir 和 closedir 或者您可以简单地使用 glob 来获取目录的内容。 示例: 使用 op
我正在编写一个点文件存储库管理器,但删除存储库的命令不起作用。它转到存储库文件夹,然后它必须列出所有文件和目录,以便我能够删除它们。问题是,它列出了我需要删除的每个文件或目录,但它排除了非空的 .gi
使用server and client代码。我尝试添加通过 readdir() 实现的 ls 功能 我的 *connection_handler 看起来像这样: void *connection_ha
我有一个使用 readdir() 的函数。我使用 stat() 来获取有关我作为参数提供的目录中的文件的信息。 folder_name[] is actually the absolute path
这个问题已经有答案了: Crash or "segmentation fault" when data is copied/scanned/read to an uninitialized point
嗨,我正在尝试编写一个使用 readdir 的程序,但我读取的条目未按排序顺序。我还应该寻找什么。 最佳答案 尝试scandir,它可以一次读取整个目录并为您对名称进行排序。 关于c - readdi
在 main 中,我使用 deletefolder() 调用以下函数: void deletefolder(){ struct dirent *next_file; DIR *folder
我有一段相当简单的代码来获取 C++ 目录中的文件列表。令人费解的是,目录中的 135 个文件中只有 68 个最终存储在 vector 文件名中。发生了什么事? DIR* pDIR = opendir
我正在尝试读取和处理目录中的所有文件。 如果只使用 readdir() 并计算目录中的文件数,一切都很好。但是,如果我复制文件名 strcpy() 并传递给不同的函数,readdir() 会在读取 4
所以我循环调用 readdir() 函数并将生成的文件名添加到链表中的新节点。通过设置 file_list = add_file_node() 解决问题后,我遇到了 dir_list 循环在访问目录时
我写了一个简单的图片库脚本女巫检查文件夹并显示文件夹中的所有图像我有代码删除 .和 .. 但它不起作用,我不明白为什么任何帮助都会很棒,因为我是 PHP 中 dir 函数的新手。我在链接周围有灯箱标签
这个问题在这里已经有了答案: List regular files only (without directory) problem (2 个答案) 关闭 10 年前。 我的目标是计算目录中的文件数
这是我希望打印的 Perl 脚本 found执行时: #!/usr/bin/perl use warnings; use strict; use utf8; use Encode; use const
我是一名优秀的程序员,十分优秀!