有没有办法保证退回的列表中的订单readdir?
我有代码:
opendir(my $DIR, $src) or die "Error opening $src";
# Loop for each file in the directory
while (my $file = readdir($DIR))
{
print "$file\n";
}
Run Code Online (Sandbox Code Playgroud)
但它以随机顺序返回.现在我知道通过快速谷歌搜索有很多解决方案,但我找不到我需要的确切顺序.基本上我希望文件夹显示为FIRST或LAST,而不是文件之间.
例如,现在,如果我有文件夹结构:
folder
folder
file1
file2
file3
Run Code Online (Sandbox Code Playgroud)
我得到了结果:
file2
folder
folder
file1
file3
Run Code Online (Sandbox Code Playgroud)
我真的想要的时候:
folder
folder
file1
file2
file3
Run Code Online (Sandbox Code Playgroud)
要么:
file1
file2
file3
folder
folder
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这个目标?
我正在制作一个在Linux shell中运行的程序,并接受一个参数(一个目录),并显示目录中的所有文件及其类型.
输出应该是这样的:
<< ./Program testDirectory
Dir directory1
lnk linkprogram.c
reg file.txt
Run Code Online (Sandbox Code Playgroud)
如果没有参数,则使用当前目录.这是我的代码:
#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);
}*/ …Run Code Online (Sandbox Code Playgroud) 我需要搜索以特定模式开头的目录中的文件,比如说"abc".我还需要消除结果中以".xh"结尾的所有文件.我不知道如何在Perl中做到这一点.
我有这样的事情:
opendir(MYDIR, $newpath);
my @files = grep(/abc\*.*/,readdir(MYDIR)); # DOES NOT WORK
Run Code Online (Sandbox Code Playgroud)
我还需要从结果中删除所有以".xh"结尾的文件
谢谢,毕
另请参阅:文档中的哪些内容表示测试readdir的定义性?.(不重复;只是密切相关.)
许多人将下面的循环视为惯用语:
while (defined(my $file = readdir($dir)) {
...
}
Run Code Online (Sandbox Code Playgroud)
代替:
while (my $file = readdir($dir)) {
...
}
Run Code Online (Sandbox Code Playgroud)
因为假设文件名只是"0"(零),所以应该使用后一版本,它应该终止循环,而当没有更多文件时它返回'undef'.
但是在过去的某个时刻,这个测试已经defined()停止了必要 - 似乎有一些特殊的案例代码允许后一个版本无论如何都能工作.
我想知道这是如何工作的?
奇怪的是,如果我更换调用readdir()与调用foo()来代替:
sub foo
{
my ($dir) = @_;
return readdir($dir);
}
while (my $file = foo($dir)) {
...
}
Run Code Online (Sandbox Code Playgroud)
那么代码确实做了我期望的事情,并在找到名为"0"的文件时终止循环.
(在MacOS X 10.5.6上使用Perl 5.8.9进行测试)
我有一点问题.我正在从目录中读取文件并且它可以工作,但它在开始时读取了两个额外的文件......它是什么?例如,有一个文件列表:"A348", "A348A", "A348B"
这是我得到的:".", "..", "A348", "A348A", "A348B" ???
DIR *dir;
struct dirent *dp;
char * file_name;
while ((dp=readdir(dir)) != NULL) {
file_name = dp->d_name;
}
Run Code Online (Sandbox Code Playgroud) 在阅读目录时,我目前有以下内容:
fs.readdir(tests, (err, items) => {
if(err){
return cb(err);
}
const cmd = items.filter(v => fs.lstatSync(tests + '/' + v).isFile());
k.stdin.end(`${cmd}`);
});
Run Code Online (Sandbox Code Playgroud)
首先,我需要在 fs.lstatSync 周围进行 try/catch,我不想添加它。但是有没有办法fs.readdir只用来查找文件呢?
就像是:
fs.readdir(tests, {type:'f'}, (err, items) => {});
Run Code Online (Sandbox Code Playgroud)
有人知道怎么做吗?
我以前在Dev-cpp中使用过这种代码:
if((dh = opendir(folder)) !== false){
while((file = readdir(dh)) !== false){
// do my stuff
}
closedir(dh);
}
Run Code Online (Sandbox Code Playgroud)
但现在我使用MSVC++,我不知道如何在那里添加这些文件,我试图在那里复制dirent.h/dir.h/errno.h,但它给出了与这些文件中的另一个包含文件有关的另一个错误. .,通过查看文件,我看到mingw的东西,所以它的编译器相关?idk MSVC++使用什么编译器,但有可能在MSVC++中复制这些文件并让它工作吗?
我试图从MSDN查找一些代码,但它真的搞砸了,所以我希望我可以使用上面的这些功能...
假设我想对目录中的所有文件调用某个命令,并设置一个监视来对在该目录中创建的所有文件调用该命令。如果我做:
while( ( sdi = readdir( d )) != NULL ) { ... }
closedir( d );
/* Files created here will be missed */
inotify_add_watch( ... );
Run Code Online (Sandbox Code Playgroud)
那么某些文件可能会丢失。如果我inotify_add_watch()在 之前调用readdir(),文件可能会被执行两次(这将需要相当多的基础设施来防止执行两次,而且似乎边缘情况很难处理)。是否有一种简单的方法可以避免记录循环期间处理的所有文件的名称readdir并将它们与结构中返回的名称进行比较inotify_event?我可以最大限度地减少必要的比较量:
while( ( sdi = readdir( d )) != NULL ) { ... }
inotify_add_watch( ... );
while( ( sdi = readdir( d )) != NULL ) { /* record name */ ... }
closedir( d );
Run Code Online (Sandbox Code Playgroud)
通常第二个readdir()循环不会执行任何操作,但这感觉像是一个糟糕的黑客。
在UNIX®系统线程参考中,在"线程安全"标题下的是"不保证在所有UNIX系统上都是线程安全的"功能列表.此列表中不存在函数scandir(),而列表中显示readdir().
然而,scandir()的glibc 源清楚地显示为调用readdir(),而不是线程安全的readdir_r().因为某些其他原因,scandir()在列表中被省略了,或者由于某种原因我是否缺少线程安全?
我是我大学系统编程课的助教。最近,学生们正在完成一项涉及复制该程序的作业pwd。
一些学生注意到了似乎不一致的地方。当他们从 readdir 条目中读取 ino 时,它会给出与统计同一目录时不同的 inode。他们中的许多人都在问为什么。目录项的索引节点不应该指向目标目录所在的索引节点吗?如果是这样,为什么 stat 给出不同的 inode?
这是一些示例代码来演示:
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#define DIR_NAME "~redacted~"
int getReaddirInode(char* entName)
{
DIR* directory;
struct dirent* entry;
ino_t result;
if ((directory = opendir(".")) == NULL)
{
perror("opendir");
exit(1);
}
while ((entry = readdir(directory)) != NULL)
{
if (strcmp(entName, entry->d_name) == 0)
{
result = entry->d_ino;
break;
}
}
if (entry == NULL)
{
fprintf(stderr, "No such directory: %s.\n", …Run Code Online (Sandbox Code Playgroud)