2013-12-18 1 views
0

파일 경로가 주어진 경우 모든 파일과 하위 디렉토리를 재귀 적으로 나열하려고합니다. 이것은 파일 경로가 읽기/쓰기가 가능한지 (줄을 주석으로 처리했는지) 확인하는 코드를 추가 할 때까지 작동합니다. 이제는 재귀 루프로 들어 가지 않습니다. 이 예는 파일 권한을 테스트 fopen의 사용을 대체 할 access를 사용하여 내 코드파일 경로가 읽기 및 쓰기 가능인지 확인

#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 (DIR)'???? – Recker

+0

나는이 아니 그 오류가 있지만 순자산은 그것을 시도, 이제 파일 – user2541163

+0

당신이 항목에 값을 할당했다에는 출력이없는 생각 'while' 루핑 구조체에 대해 오류가 있습니다 ... [This] (http://linux.die.net/man/3/readdir)는 도움이 될 수 있습니다 ... 반환 값 섹션의 정보에 따라 조건을 변경하십시오. .. – Recker

답변

2

입니다.

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 아이폰을위한 콘솔 응용 프로그램을 쓰고 있다고합니다. stat(), access() 또는 fopen()을 사용하여 차이가 있습니까? 분명히 나는 ​​fopen()과 access()를 사용해 보았고, 대부분의 아이폰 시스템 경로는 나에게 확신을주지 못하는 읽기 쉽고 쓰기 쉬운 것을 준다. – user2541163

+0

위에서 언급했듯이 주된 차이점은'access'는 실제 사용자/그룹 ID를 사용하여 파일 권한에 대해 테스트한다는 것입니다. 'stat'를 사용하면 유효 사용자/그룹에 대해서도 테스트 권한을 선택할 수 있습니다. 나는 아이폰이나 감옥에 대해 아무것도 모른다. 아마 jail breaking 프로세스가 사용 권한을 변경하거나 사용자 권한을 상승시킬 수 있습니까? – Duck

+0

감사합니다. U는 나에게 큰 도움이되었다. – user2541163