如何在C中按类型获取目录下的所有文件的列表

时间:2012-08-24 05:44:05

标签: c unix

我必须在ls中模拟unix的{​​{1}}函数。

我必须创建一个程序“通过C中的类型获取任何目录下的所有文件”。

我用Google搜索并找到了获取文件列表的程序,但它们按字母顺序排序;我希望按文件类型排序。拜托,任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

必须将文件存储在内存中的某个位置。由于这看起来像学校项目,我建议将文件名加载到链表中,并使用其中一种算法对链表进行排序。这可能就是练习本身的目的。

对于file type,我们假设为“扩展”,即.MP3是“Fraunhofer MPEG Layer 3”类型,即使有人可能已重命名.WMA文件并将其命名为.MP3。要检测“真实”文件类型,您需要使用一种称为“魔术文件”的东西,并且有一个libmagic,但是它值得吗? (如果是博士论文或商业课程,那么答案就是'地狱是'。如果该课程要由普通教授评分,那么你就可以判断是否有被认为“过于聪明”的风险。)

链表条目应该是struct,包含文件名和指向其扩展名的指针;最后你可以通过考虑扩展名是“文件名中最后一个点之后的任何内容”来找到,因此你可以利用strrchr函数。请记住,有些文件没有扩展名。

您判断是否使用节省内存的黑客,例如将指针存储到扩展名,或者使用strdup复制扩展名。前者更快更精简,但你必须记住第一个结构指针(文件名)必须被释放,第二个绝对不能。有两个指针表现不同可能被认为是错误的编码实践(它是)或一个聪明的黑客(它是),这取决于你是否重视维护时间或速度/内存。

至于文件名本身的检索,没有全可移植的方式,因此这导致了Boost等库的开发。但是对于学校项目,也许您可​​以限制使用POSIX系统并使用opendirreaddirclosedirstat

一个好的做法和明智的做法是将操作(目录检索,列表排序,列表显示)分离到不同的函数中,以便您可以单独和增量地测试它们(例如:文件夹检索确实检索所有内容)并且您可以按未排序的顺序显示文件等。)。