栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何仅在C中列出一级目录?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何仅在C中列出一级目录?

不幸的是,所有基于shell扩展的解决方案都受到最大命令行长度的限制。哪个有所不同(可以

true | xargs --show-limits
找出答案);在我的系统上,大约有2 MB。是的,许多人会争辩说它就足够了-一次比尔·盖茨就拥有640 KB的容量。

(在非共享文件系统上运行某些并行模拟时,在收集阶段,我有时确实在同一目录中有成千上万个文件。是的,我可以做不同的事情,但这恰恰是最简单,最可靠的方法收集数据。实际上,几乎没有POSIX实用程序足以愚蠢地假设“
X对每个人都足够”。)

幸运的是,有几种解决方案。一种是改为使用

find

system("/usr/bin/find . -mindepth 1 -maxdepth 1 -type d");

您还可以根据需要设置输出的格式,而不取决于语言环境:

system("/usr/bin/find . -mindepth 1 -maxdepth 1 -type d -printf '%pn'");

如果要排序的输出,使用

作为分隔符(因为文件名被允许包含换行符),并
-t=
sort
使用
作为分隔符,太。
tr
会为您将它们转换为换行符:

system("/usr/bin/find . -mindepth 1 -maxdepth 1 -type d -printf '%p' | sort -t= | tr -s '' 'n'");

如果要在数组中使用名称,请改用

glob()
function。

最后,就像我不时地竖琴一样,可以使用POSIX

nftw()
函数在内部实现此功能:

#define _GNU_SOURCE#include <stdio.h>#include <ftw.h>#define NUM_FDS 17int myfunc(const char *path,const struct stat *fileinfo,int typeflag,struct FTW *ftwinfo){    const char *file = path + ftwinfo->base;    const int depth = ftwinfo->level;        if (depth != 1 || (typeflag != FTW_D && typeflag != FTW_DNR))        return 0;        if (file[0] != '.')        printf("%s/n", path);        return FTW_SKIP_SUBTREE;}

nftw()
使用上面的电话显然是这样的

if (nftw(".", myfunc, NUM_FDS, FTW_ACTIONRETVAL)) {    }

唯一的 “问题”
的使用

nftw()
是选择文件描述符的函数可以使用的一个好数字(
NUM_FDS
)。POSIX说,一个进程必须始终能够至少有20个打开文件描述符。如果我们减去标准的(输入,输出和错误),则剩下的是17。但是,上面的值不太可能使用超过3。

您可以使用找到实际限制

sysconf(_SC_OPEN_MAX)
,然后减去您的进程可能同时使用的描述符数量。在当前的Linux系统中,每个进程通常限制为1024。

好消息是,只要该数字至少为4或5,那么它只会影响性能:它仅决定

nftw()
必须使用变通办法之前目录树结构的深度。

如果要创建包含许多子目录的测试目录,请使用以下Bash之类的方法:

mkdir lots-of-subdirscd lots-of-subdirsfor ((i=0; i<100000; i++)); do mkdir directory-$i-has-a-long-name-since-command-line-length-is-limited ; done

在我的系统上,正在运行

ls -d */

在该目录中会产生

bash: /bin/ls: Argument list toolong
错误,而
find
命令和
nftw()
基于程序都可以正常运行。

同样,您也无法使用删除目录

rmdir directory-*/
。采用

find . -name 'directory-*' -type d -print0 | xargs -r0 rmdir

代替。或者只是删除整个目录和子目录,

cd ..rm -rf lots-of-subdirs


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/412577.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号