linux下给定一个目录,如何获取目录下一个连接文件的文件名?

加盾男爵 2018-05-27 08:05:22
假如有个目录/home/doc,下面有个连接文件,该文件连接到另一个目录即
/home/doc/allName->/home/class

在/home/class下躺了两个文件name1和name2,现在我希望的是同伙目录名/home/doc获得连接文件/home/doc/allName的文件名

char dirPath[BUFF_SIZE] = {"/home/doc/"};
DIR* dp = opendir(DIR_PATH);
struct dirent* dir;
while((dir = readdir(dp)) != NULL)
{
int len = strlen(dir->d_name) + strlen(dirPath) + 1;
char fileName[len];
strncpy(fileName,dirPath,strlen(dirPath)+1);
strcat(fileName,dir->d_name);
printf("%s\n",fileName);
}

这里我希望的输出结果/home/doc/allName
但实际的输出结果确实
/home/class/name1
/home/class/name2
这种情况该怎么解决?
...全文
1638 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2018-05-29
  • 打赏
  • 举报
回复
ls 是根据后面的文件属性决定列举什么的吧。默认情况下: 如果参数是文件或链接(不管指向什么),直接列举出文件或链接本身的属性。 这种情况,绝对不是用 opendir/readdir。 如果参数是文件夹(非指向文件夹的链接),则列举该文件夹下的全部内容。 这种情况,才是用 opendir/readdir。 而你的代码,直接将 /dev/fd 以文件夹的方式打开,那当然列举的是文件了。 你代码里有过获取它自身的属性吗?并没有。 如果你想列举 /dev/fd,那你当然是要对 /dev 目录进行 opendir/readir 了。
加盾男爵 2018-05-28
  • 打赏
  • 举报
回复
引用 4 楼 SXJIAKE 的回复:
经测试你的代码编译不过:
引用
char dirPath[BUFF_SIZE] = {"/home/doc/"}; DIR* dp = opendir(DIR_PATH); struct dirent* dir; while((dir = readdir(dp)) != NULL) { int len = strlen(dir->d_name) + strlen(dirPath) + 1; char fileName[len]; strncpy(fileName,dirPath,strlen(dirPath)+1); strcat(fileName,dir->d_name); printf("%s\n",fileName); }
修改后编译过了:
#include <stdio.h>
#include <stdlib.h>

#include <sys/types.h>
#include <dirent.h>

int main(int argc, char *argv[])
{
        char path[] = "/usr/doc";
        DIR *dp = opendir(path);
        if (dp != NULL)
        {
                struct dirent *dir;
                while ((dir = readdir(dp)) != NULL)
                {
                        printf("%s\n",dir->d_name);
                }
                closedir(dp);
        }
        return 0;
}
测试并没有发现你的问题。 而且!!!就算你没搞错你真正读取的路径,你读取的不是 /home/doc 这一层么,怎么会把 doc 中的文件夹链接中的文件读取出来了?
我的系统是ubuntu 12.04 你的代码里我把
 char path[] = "/usr/doc";
换成了
 char path[] = "/dev/fd";
这个目录下刚好是个连接到别的目录的文件 命令ls -l /dev/fd输出是 jiadun@jiadun-desktop:~/linux_c/4th/ShowDir2$ ls -l /dev/fd lrwxrwxrwx 1 root root 13 5月 29 2018 /dev/fd -> /proc/self/fd 但运行代码程序输出结果是 jiadun@jiadun-desktop:~/linux_c/4th/ShowDir2$ ./a.out . .. 0 1 2 3
「已注销」 2018-05-28
  • 打赏
  • 举报
回复
经测试你的代码编译不过:
引用
char dirPath[BUFF_SIZE] = {"/home/doc/"}; DIR* dp = opendir(DIR_PATH); struct dirent* dir; while((dir = readdir(dp)) != NULL) { int len = strlen(dir->d_name) + strlen(dirPath) + 1; char fileName[len]; strncpy(fileName,dirPath,strlen(dirPath)+1); strcat(fileName,dir->d_name); printf("%s\n",fileName); }
修改后编译过了:
#include <stdio.h>
#include <stdlib.h>

#include <sys/types.h>
#include <dirent.h>

int main(int argc, char *argv[])
{
        char path[] = "/usr/doc";
        DIR *dp = opendir(path);
        if (dp != NULL)
        {
                struct dirent *dir;
                while ((dir = readdir(dp)) != NULL)
                {
                        printf("%s\n",dir->d_name);
                }
                closedir(dp);
        }
        return 0;
}
测试并没有发现你的问题。 而且!!!就算你没搞错你真正读取的路径,你读取的不是 /home/doc 这一层么,怎么会把 doc 中的文件夹链接中的文件读取出来了?
赵4老师 2018-05-28
  • 打赏
  • 举报
回复
你还可以参考ls命令对应的源代码。
加盾男爵 2018-05-28
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。 如果嫌system黑窗口一闪,将system("...")替换为WinExec("cmd /c ...",SW_HIDE); linux下使用ls命令。
办法不止一种,但我希望知道问题出在哪里 我没办法保证这辈子不用系统api。。。
赵4老师 2018-05-28
  • 打赏
  • 举报
回复
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。 如果嫌system黑窗口一闪,将system("...")替换为WinExec("cmd /c ...",SW_HIDE); linux下使用ls命令。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧