2015-11-05 2 views
0

Я начинаю с C, и мне нужно использовать функцию realpath, но я не нахожу много примеров. Я помог себе в этом: link. Моя текущая проблема заключается в том, что моя функция работает для папки, но realpath возвращает null, когда это файл.My realpath возвращает 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); 
      } 
    } 

EDIT: Цель моей функции, чтобы иметь какие-либо абсолютные realpaths для файлов и папок в папке реж

+0

Вы должны проверить 'errno' после вызова' 'realpath' для EACCES, EINVAL, EIO, ELOOP, ENAMETOOLONG, ENOENT' или' ENOTDIR', чтобы выяснить, почему , Я подозреваю, что вы найдете его «ENOTDIR». –

+0

Когда я делаю: 'printf (" ERROR:% s \ n ", strerror (errno));' i have: 'Нет такого файла или каталога'. Я уверен, что файл существует. – filol

+0

Каков ваш рабочий каталог? 'dir-> d_name' - это просто базовое имя - имя файла * после * последнего '/'. –

ответ

1

Проблема вы не в состоянии передать текущий каталог как часть имени, данного realpath. Вы не можете просто передать dir->d_name (это просто имя файла или подкаталога под текущим каталогом). Вы должны добавить dir->d_namestrcat и т. Д.) К названию каталога, которое вы использовали в своем обращении к 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.

Пример/Выход

$ ./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 
+0

Thx, я работаю, потому что на данный момент у меня есть ядро, сбрасываемое кодом. – filol

+0

Thx, это работает! – filol

+0

Я не мог понять, как вы указали верхний каталог файла, который вы ищете? Нужно ли мне знать, где это, найти точный каталог? Что делать, если я хотел бы искать все возможные терминальные команды unix, чей я не знаю ни одного верхнего каталога? –

Смежные вопросы