1

次のコードを使用して、親ディレクトリの名前を取得しようとしています。

dirp=opendir(cur_spot);
printf("parent name: %s\n", readdir(dirp)->d_name);
closedir(dirp);

cur_spotは'..'を保持します。

私はこれをループで実行し、ディレクトリをルートに登り続けます。これは、出力のシーケンスです。

.
.bash_logout
.
.
srv

途中でiノードをチェックしているので、正しくトラバースしていることがわかります。

d_nameとは異なるものを使用する必要がありますか?

ありがとう

4

2 に答える 2

2

私はsjsの答えの下のコメントのアイデアに基づいてこれを思いついた:

#include <dirent.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <sys/stat.h>
#include <limits.h>
#include <errno.h>

int LookupName(const char* parent, ino_t ino, char *name, size_t size)
{
  DIR *dp = opendir(parent);
  if (!dp) return -1;

  int ret = -1;
  struct dirent *de;
  while (de = readdir(dp))
  {
    if (de->d_ino == ino)
    {
      strncpy(name, de->d_name, size);
      ret = 0;
      break;
    }
  }

  closedir(dp);
  if (ret == -1) errno = ENOENT;
  return ret;
}

int GetWorkdir(char *workdir, size_t size)
{
  struct stat st;
  if (stat(".", &st)) return -1;

  char path[PATH_MAX];
  strncpy(path, "..", sizeof(path));

  memset(workdir, '\0', sizeof(workdir));

  char name[PATH_MAX];
  while (1)
  {
    if (LookupName(path, st.st_ino, name, sizeof(name))) return -1;
    if (!strcmp(name, "..") || !strcmp(name, "."))
    {
      strncpy(name, "/", sizeof(name));
      strncat(name, workdir, sizeof(name));
      strncpy(workdir, name, size);
      break;
    }

    if (workdir[0] != '\0')
    {
      strncat(name, "/", sizeof(name));
    }

    strncat(name, workdir, sizeof(name));
    strncpy(workdir, name, size);

    if (stat(path, &st)) return -1;

    strncat(path, "/..", sizeof(path));
  }

  return 0;
}

int main(int argc, char **argv)
{
  char workDir[PATH_MAX];

  assert(!GetWorkdir(workDir, sizeof(workDir)));
  printf("%s\n", workDir);
}
于 2012-12-07T05:56:32.430 に答える
0

readdirディレクトリを読んでいるので、あなたが言うとき

printf("parent name: %s\n", readdir(dirp)->d_name);

実際には、ディレクトリ..の名前ではなく、内部の最初のエントリの名前を印刷するように求めています。..

何をしようとしているのかによっては、の出力を解析getcwdする方が良いアプローチかもしれません。

于 2012-12-07T04:17:34.197 に答える