2016-01-19 3 views
0

Я пытаюсь переместить каталог со всем содержимым внутри другого каталога, и я застрял. Я пытаюсь скопировать каждый файл из исходного каталога в пункт назначения, а затем удалить его. Я тоже застрял в этом. Но могу ли я как-то с помощью функции rename(). Если да, то как?Рекурсивный каталог перемещения в C

КОД UPDATE

void move_file(const char *name, const char *new_name) { 
    size_t len = 0; 
    char *buffer; 
    long lSize; 

    FILE *source = fopen(name, "r"); 
    FILE *target = fopen(new_name, "w");  

    if (source == NULL || target == NULL) { 
     fprintf(stderr, "Error occurred when opening files\n"); 
     exit(1); 
    } 

    fseek(source, 0, SEEK_END); 
    lSize = ftell(source); 
    rewind(source); 

    buffer = (char*)malloc(sizeof(char) * lSize); 

    result = fread(buffer, 1, lSize, source); 

    if (result != lSize) { 
     fprintf(stderr, "Reading error\n"); 
     exit(2); 
    } 

    fwrite(buffer, 1, sizeof(buffer), target); 

    fclose(source); 
    fclose(target); 

    if (!remove(source)) { 
     fprintf(stderr, "Error deleting file\n"); 
    } 
} 

И моя вторая функция.

void move_directory(const char *target, const char *destination) { 
    DIR *dir = opendir(target); 

    if (dir) { 
     char Path[256]; 
     char *EndPtr = Path; 
     struct dirent *e; 
     strcpy(Path, target); 
     EndPtr += strlen(target); 

     while ((e = readdir(dir)) != NULL) { 
      struct stat info; 
      strcpy(EndPtr, e->d_name); 

      if (!strcmp(e->d_name, ".") || !strcmp(e->d_name, "..")) { 
       continue; 
      } 

      if (!stat(Path, &info)) { 
       if (S_ISDIR(info.st_mode)) { 
        move_directory(Path); 
       } else 
       if (S_ISREG(info.st_mode)) { 
        move_file(e->d_name, e->d_name); 
       } 
      } 
     } 
    } 
} 

Я застрял, у меня нет никаких идей, как я должен действовать. Это то, что у меня есть до сих пор.

UPDATE: Как я могу теперь сосредоточиться на своей папке назначения и создать папку, точно такую ​​же, как у меня в настоящее время, где мои скопированные файлы должны быть перенесены?

+1

Просьба подробно остановиться на «Я застрял»: как далеко вы получили, и с каким аспектом у вас возникли проблемы? –

+0

Это все, что у меня есть. Я довольно не знаю, как сделать связь между тем, что и где я хочу двигаться. Я еще раз, я пытался копировать каждый файл. Можно ли переименовать() использовать в таких ситуациях? –

+0

rename() требует, чтобы оба файла находились в одной файловой системе. Вы не могли использовать его для перемещения каталога с одного диска на другой. http://www.gnu.org/software/libc/manual/html_node/Renaming-Files.html –

ответ

3

Я не очень на библиотеке C IO, но я могу отметить несколько вопросов

  • Вы не создаете (суб) директорию назначения. Если это не произойдет, ваша копия завершится неудачно.
  • Вы используете жестко кодированные длины для своих путей, которые могут быть слишком короткими. char Path[256], source_file[20], target_file[20].
  • source_file и target_file должны быть параметрами для файла copy_file и считаются таковыми в move_directory(), но объявлены как переменные стека в copy_file(). Если это даже компилируется, не будет никакого значимого значения для любой переменной.
  • Вы копируете файлы, а не перемещаете их. Если вы хотите переместить структуру, вам нужно будет что-то сделать, чтобы удалить файлы и каталоги после успешного хода.
  • Вы копируете один символ за раз с помощью fgetc() и fputc(). Вместо этого используйте буферизированную операцию (fread()/fwrite()).
+0

Я не компилировал это, потому что он не был готов, не было никаких причин для компиляции , Это тоже работает для меня, я не очень хорош в C, поэтому я спрашиваю, потому что я знаю логику этого. Идея состоит в том, чтобы переместить структуру, и я знаю, что существует функция 'rename()', которая перемещает файл в текущем каталоге. Я пытался копировать на самом деле, чтобы имитировать движение, удалив файл позже. –

+0

rename() работает только в одной файловой системе, поэтому вы не можете использовать его для перемещения файла с одного диска на другой или на сетевой диск. –

+1

И код не проверяет записи '..' И '" .. "', что приведет к бесконечной рекурсии. И код не называет 'mkdir' нигде, а это значит, что он не может работать. – user3386109

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