我的真实路径 return 文件为空
My realpath return null for files
我从 C 开始,我需要使用函数 realpath,但我没有找到很多例子。我帮助了自己:link。
我当前的问题是我的函数适用于文件夹,但 realpath return null 当它是文件时。
while ((dir = readdir(rep)) != NULL)
{
if ( !strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..") )
{
// do nothing (straight logic)
} else {
char buf[_POSIX_PATH_MAX];
char *path;
path = realpath(dir->d_name, buf);
if (!path)
{
perror("realpath");
exit(EXIT_FAILURE);
}
}
编辑:我的功能的目的是为文件夹 dir
中的文件和文件夹提供任何绝对真实路径
问题是您未能将当前目录作为给定名称的一部分传递给 realpath
。您不能简单地传递 dir->d_name
(这只是当前目录下的文件或子目录的名称)。您必须将 dir->d_name
(使用 strcat
等)附加到您在调用 opendir
时使用的目录名称。示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <errno.h>
#include <unistd.h>
#ifndef _POSIX_PATH_MAX
#define _POSIX_PATH_MAX 512
#endif
int main (int argc, char **argv) {
if (argc < 2) {
fprintf (stderr, "error: insufficient arguments. usage: %s dirname\n",
argv[0]);
return 1;
}
char *p = argv[1];
size_t len = strlen (p);
while (*p && p[len-1] == '/')
p[--len] = 0;
DIR *rep = opendir (p);
struct dirent *dir = NULL;
if (!rep) {
fprintf (stderr, "error: opendir failed on '%s'\n", p);
return 0;
}
while ((dir = readdir(rep)))
{
if ( !strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..") )
{
// do nothing (straight logic)
}
else {
char buf[_POSIX_PATH_MAX] = {0};
char entry[_POSIX_PATH_MAX] = {0};
char *path = NULL;
errno = 0;
strcat (entry, p);
strcat (entry, "/");
strcat (entry, dir->d_name);
printf ("getting realpath for : '%s'\n", entry);
path = realpath (entry, buf);
if (!path || errno)
{
perror("realpath");
exit(EXIT_FAILURE);
}
else
printf (" realpath for '%s' : %s\n", entry, buf);
}
}
return 0;
}
注意 具体来说:
else {
char buf[_POSIX_PATH_MAX] = {0};
char entry[_POSIX_PATH_MAX] = {0};
char *path = NULL;
errno = 0;
strcat (entry, p);
strcat (entry, "/");
strcat (entry, dir->d_name);
printf ("getting realpath for : '%s'\n", entry);
path = realpath (entry, buf);
其中entry
是保存当前目录的字符串,分隔符'/'
,最后是dir->_dname
.
Example/Output
$ ./bin/realpathtst debug
getting realpath for : 'debug/ptrrtn.c'
realpath for 'debug/ptrrtn.c' : /home/david/dev/src-c/tmp/debug/ptrrtn.c
getting realpath for : 'debug/structinit.c'
realpath for 'debug/structinit.c' : /home/david/dev/src-c/tmp/debug/structinit.c
getting realpath for : 'debug/leetcode.c'
realpath for 'debug/leetcode.c' : /home/david/dev/src-c/tmp/debug/leetcode.c
我从 C 开始,我需要使用函数 realpath,但我没有找到很多例子。我帮助了自己:link。 我当前的问题是我的函数适用于文件夹,但 realpath return null 当它是文件时。
while ((dir = readdir(rep)) != NULL)
{
if ( !strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..") )
{
// do nothing (straight logic)
} else {
char buf[_POSIX_PATH_MAX];
char *path;
path = realpath(dir->d_name, buf);
if (!path)
{
perror("realpath");
exit(EXIT_FAILURE);
}
}
编辑:我的功能的目的是为文件夹 dir
中的文件和文件夹提供任何绝对真实路径问题是您未能将当前目录作为给定名称的一部分传递给 realpath
。您不能简单地传递 dir->d_name
(这只是当前目录下的文件或子目录的名称)。您必须将 dir->d_name
(使用 strcat
等)附加到您在调用 opendir
时使用的目录名称。示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <errno.h>
#include <unistd.h>
#ifndef _POSIX_PATH_MAX
#define _POSIX_PATH_MAX 512
#endif
int main (int argc, char **argv) {
if (argc < 2) {
fprintf (stderr, "error: insufficient arguments. usage: %s dirname\n",
argv[0]);
return 1;
}
char *p = argv[1];
size_t len = strlen (p);
while (*p && p[len-1] == '/')
p[--len] = 0;
DIR *rep = opendir (p);
struct dirent *dir = NULL;
if (!rep) {
fprintf (stderr, "error: opendir failed on '%s'\n", p);
return 0;
}
while ((dir = readdir(rep)))
{
if ( !strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..") )
{
// do nothing (straight logic)
}
else {
char buf[_POSIX_PATH_MAX] = {0};
char entry[_POSIX_PATH_MAX] = {0};
char *path = NULL;
errno = 0;
strcat (entry, p);
strcat (entry, "/");
strcat (entry, dir->d_name);
printf ("getting realpath for : '%s'\n", entry);
path = realpath (entry, buf);
if (!path || errno)
{
perror("realpath");
exit(EXIT_FAILURE);
}
else
printf (" realpath for '%s' : %s\n", entry, buf);
}
}
return 0;
}
注意 具体来说:
else {
char buf[_POSIX_PATH_MAX] = {0};
char entry[_POSIX_PATH_MAX] = {0};
char *path = NULL;
errno = 0;
strcat (entry, p);
strcat (entry, "/");
strcat (entry, dir->d_name);
printf ("getting realpath for : '%s'\n", entry);
path = realpath (entry, buf);
其中entry
是保存当前目录的字符串,分隔符'/'
,最后是dir->_dname
.
Example/Output
$ ./bin/realpathtst debug
getting realpath for : 'debug/ptrrtn.c'
realpath for 'debug/ptrrtn.c' : /home/david/dev/src-c/tmp/debug/ptrrtn.c
getting realpath for : 'debug/structinit.c'
realpath for 'debug/structinit.c' : /home/david/dev/src-c/tmp/debug/structinit.c
getting realpath for : 'debug/leetcode.c'
realpath for 'debug/leetcode.c' : /home/david/dev/src-c/tmp/debug/leetcode.c