2013-12-18 3 views
0

Я пытаюсь перечислить все файлы и подкаталоги, рекурсивно заданные путь к файлу. Это работает до тех пор, пока я не попытаюсь добавить код, чтобы проверить, доступен ли путь к файлу для чтения/записи (который я прокомментировал строки). Теперь он не входит в рекурсивный цикл. Это мой кодПроверка, является ли путь к файлу доступным и доступным для записи

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

void listDir(char *name, FILE *fp) 
{ 
    DIR *dir; 
    struct dirent *entry; 

    if (!(dir = opendir(name))) 
     return; 
    if (!(entry = readdir(dir))) 
     return; 

    do { 
     FILE *fileCopy; 
     char read[50]; 
     char write[50]; 
     char path[1024]; 
     int len = snprintf(path, sizeof(path)-1, "%s/%s", name, entry->d_name); 
     path[len] = 0; 
     if (entry->d_type == DT_DIR) 
     { 
      if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) 
       continue; 
      // if((fileCopy = fopen(path, "rb")) == NULL){ 
      //  strcpy(read,"Not Readable"); 
      // } 
      // else{ 
      //  strcpy(read,"Readable"); 
      // } 
      // if((fileCopy = fopen(path, "wb")) == NULL){ 
      //  strcpy(write,"Not Writable"); 
      // } 
      // else{ 
      //  strcpy(write,"Writable"); 
      // } 
      fprintf(fp,"[D]%s - %s,%s\n", path,read,write); 
      listDir(path ,fp); 
     } 
     else 
     { 
      // if((fileCopy = fopen(path, "rb")) == NULL){ 
      //  strcpy(read,"Not Readable"); 
      // } 
      // else{ 
      //  strcpy(read,"Readable"); 
      // } 
      // if((fileCopy = fopen(path, "wb")) == NULL){ 
      //  strcpy(write,"Not Writable"); 
      // } 
      // else{ 
      // strcpy(write,"Writable"); 
      // } 
      fprintf(fp,"[F]%s - %s,%s\n", path,read,write); 
     } 
    } while ((entry = readdir(dir))); 
    closedir(dir); 

} 

int main(void) 
{ 
    FILE *fp; 
     fp = fopen("/var/mobile/Applications/FileIOAccess.txt", "w"); 
    listDir("/var",fp); 
    fclose(fp); 
    return 0; 
} 
+0

'(запись == READDIR (реж)' ???? – Recker

+0

Я считаю, что это не та ошибка, но ANW попробовал, теперь нет никакого вывода в файле – user2541163

+0

Вы были присваивая значение для записи, которая является ошибочный для цикла while while ... [This] (http://linux.die.net/man/3/readdir) может быть полезным ... попробуйте изменить условие в соответствии с информацией в разделе «Возвращаемое значение». .. – Recker

ответ

2

В этом примере используется access заменить использование fopen для проверки прав доступа к файлам.

void listDir(char *name, FILE *fp) 
{ 
    DIR *dir; 
    struct dirent *entry; 

    if (!(dir = opendir(name))) 
     return; 

    if (!(entry = readdir(dir))) 
     return; 

    do 
    { 
     char readString[50] = {0}; 
     char writeString[50] = {0}; 
     char path[1024]; 
     char filetype; 

     snprintf(path, sizeof(path)-1, "%s/%s", name, entry->d_name); 

     if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) 
      continue; 

     if (access(path, R_OK) == 0) 
      strcpy(readString, "Readable"); 
     else 
      strcpy(readString, "Not Readable"); 

     if (access(path, W_OK) == 0) 
      strcpy(writeString, "Writable"); 
     else 
      strcpy(writeString, "Not Writable"); 

     switch (entry->d_type) 
     { 
      case DT_UNKNOWN: filetype = '?'; break; 
      case DT_FIFO: filetype = 'P'; break; 
      case DT_CHR:  filetype = 'C'; break; 
      case DT_DIR:  filetype = 'D'; break; 
      case DT_BLK:  filetype = 'B'; break; 
      case DT_REG:  filetype = 'F'; break; 
      case DT_LNK:  filetype = 'L'; break; 
      case DT_SOCK: filetype = 'S'; break; 
      case DT_WHT:  filetype = 'W'; break; 
      default:   filetype = '?'; break; 
     } 

     fprintf(fp,"[%c]%s - %s,%s\n", filetype, path, readString, writeString); 

     if (entry->d_type == DT_DIR) 
      listDir(path, fp); 

    } while ((entry = readdir(dir))); 

    closedir(dir); 
} 
+0

Еще один вопрос, не уверен, что вы знакомы с этим. Допустим, я пишу консольное приложение для jailbroken iphone. Есть ли разница с использованием stat(), access() или fopen()? По-видимому, я пытался использовать функции fopen() и access(), и большинство системных путей iphone дают мне возможность чтения и записи, и я не уверен. – user2541163

+0

Как я уже упоминал выше, основное отличие состоит в том, что 'access' использует реальные идентификаторы пользователя/группы для тестирования против разрешений файлов. С помощью 'stat' у вас есть выбор разрешений на тестирование для эффективного пользователя/группы. Я ничего не знаю о том, что iphone или тюрьма нарушают его. Возможно, процесс взлома тюрьмы меняет разрешения или повышает ваши привилегии пользователя? – Duck

+0

Хорошо спасибо. Я очень помог мне. – user2541163

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