- “inum_to_filename”:接受三个参数(要转换的i节点号,指向写入名称的缓冲区的指针和缓冲区的大小)。返回值为空。具体实现如下: 1.打开当前目录, 2.读取第一个目录条目, 3.如果当前目录的inode与传递的inode匹配,则将名称复制到缓冲区并返回。 4.否则读取下一个目录条目并重复上一步。 - “filename_to_inum”:接受一个参数(表示文件名的char *)。返回相应的i节点号。具体实现如下: 1.将文件的inode信息读入内存中的结构体。 2.如果有任何问题,请显示相应的错误信息。 3.从结构体中返回i节点号。 - “display_path”:接受一个参数(当前工作目录的i节点)。返回值为空。具体实现如下: 1.创建一个字符数组,用作目录名称的缓冲区。 2.使用“filename_to_inode”获取父目录的inode。 3.如果父目录inode等于当前inode,则已到达根目录并可以返回。 4.否则,切换到父目录并使用“inum_to_filename”查找传递到函数的inode的名称。使用步骤1中的缓冲区进行存储。 5.递归调用“display_path”以显示绝对路径。
以下是代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
void inum_to_filename (int inode_arg, char *pathBuffer, int size_arg) {
DIR *dir_ptr = opendir(".");
struct dirent *dirent_ptr = readdir(dir_ptr);
int counter = 0;
while (counter != 1) {
if (inode_arg == dirent_ptr->d_ino) {
strcat(pathBuffer, "/");
strcat(pathBuffer, dirent_ptr->d_name);
counter = counter + 1;
return;
} else {
dirent_ptr = readdir(dir_ptr);
}
}
closedir(dir_ptr);
}
int filename_to_inum (char *src) {
int res = 0;
struct stat info;
int result = stat(src, &info);
if (result != 0) {
fprintf(stderr, "Cannot stat ");
perror(src);
exit(EXIT_FAILURE);
} else {
res = info.st_ino;
}
return res;
}
void display_path (int ino_src) {
int bufSize = 4096;
char pathBuffer[bufSize];
int ino_prnt = filename_to_inum("..");
if (ino_src == ino_prnt) {
//print for test
inum_to_filename(ino_src, pathBuffer, bufSize);
printf("%s", pathBuffer);
return;
} else {
//print for test
chdir("..");
inum_to_filename(ino_src, pathBuffer, bufSize);
display_path(ino_prnt);
printf("%s", pathBuffer);
}
}
int main (int argc, char *argv[]) {
int c_ino = filename_to_inum(".");
display_path(c_ino);
printf("\n");
}
目前显示的是“/./MyName”,其中MyName是服务器上我的个人目录。这就是我正在运行程序的目录。当使用pwd时,返回“/home/MyName”。我不确定下一步如何正确获取绝对路径。
inum_to_filename()
返回之前关闭你打开的目录,否则会泄漏 DIR 描述符。(顺便提一下,根目录的父目录的 inode 也是根目录的 inode。也就是说,/.
的 inode 与/..
相同,通常是 inode 号为 2。) - Jonathan Lefflerwhile
循环中有一个早期返回,当函数成功(大多数情况下)时使用它,并且它不会关闭目录。始终查看每个退出路径。 - Jonathan Leffler