【问题标题】:"Double dot" directory name in C?C中的“双点”目录名称?
【发布时间】:2011-11-08 18:13:11
【问题描述】:

我正在为类编写一个程序,我想知道一些代码的输出。我有一些这样的代码:

DIR* dir = opendir(".");
struct dirent* reader;

while ((reader = readdir(dir)) != NULL)
{
//print the name of the path found by reader.
}

现在一切正常,但我注意到前两个列表总是:

.
..
//rest of files here

现在我假设第一个点 . 只是当前目录的名称,但第二个双点是做什么用的?我知道cd .. 可以让您在文件层次结构中上升,但我不知道为什么在读取子目录名称时会输出它。

我担心的原因是因为我想递归遍历所有文件,但是如果我遍历..,那里的第一个目录名称是.,这会导致循环。那么我该如何避免这种情况呢?

【问题讨论】:

  • 它来自文件系统本身——在 C 之外。

标签: c macos opendir


【解决方案1】:

.. 是父目录。除非你在文件系统根目录,在这种情况下它与根目录相同。

基本上,您想检查您的dir 变量是否等于...。如果是,则跳过该目录。

您可以通过将该检查放入您的 while 循环中来实现这一点,或者通过从您的目录数组中过滤掉这两个目录来实现。

哦,请确保您不会意外跳过以. 开头的目录,因为这些目录仍然有效。确保整个目录名称为...

【讨论】:

    【解决方案2】:

    当下降到一个目录结构时,限制递归很重要——仅仅忽略.(当前目录)和..(父目录)是不够的(但它确实避免了一些无用的旅行:-) .考虑一个链接到. 的符号链接文件foo——它的效果与关注. 的效果相同。

    要么保留深度计数,要么保留“可见目录”或结构(智能实现可以检测和修剪周期)。还可以考虑使用readlink 来检查目标。 (注意hardlinks to directories can be created in OS X 所以 readlink 可以提供帮助,但不会忽略其他守卫的需要。)

    编码愉快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多