2015-10-25 1 views
0

У меня возникают проблемы, чтобы манипулировать каталоги в C.C манипулировать каталоги: как расположить в директории, давая свое имя в главных аргументах

  1. Я хочу дать название 2-каталогов в качестве аргумента на основном
  2. проверить, если первый каталог существует (в текущем пути)
  3. открыть каталог
  4. вызова функции (что я создал) для создания файлов и делать вещи внутри исходного каталог
  5. закройте каталог и перейдите во второй каталог и выполните то же самое.

Я написал свой код, но он все еще не делает вещи в каталогах, которые я дал на main, вместо этого он выглядит так, что я всегда позиционируется в текущем каталоге, так что вызов открыть каталог не хорош ???

Вот что я сделал:

int main(int argc, char *argv[]) 
    { 
     int i = 0; 
     char cwd[1024]; 
     if(argc < 3) 
     { 
      printf("Erreur dans les arguments\n"); 
     } else 
     { 
      for(i = 1; i < argc; i++) 
      { 
      if (getcwd(cwd, sizeof(cwd)) == NULL) 
      { 
       printf("an error occured when getting current directory\n"); 
      } 
      // make a path to the directory 
      strcat(cwd, "/"); 
      strcat(cwd, argv[i]); 
      strcat(cwd, "/"); 
      printf("cwd %s\n", cwd); 
      //check if directory exist and readable 
      //if((rep = opendir(argv[i])) != NULL) not working also 
      if((rep = opendir(cwd)) != NULL) 
      { 
       getcwd(cwd, sizeof(cwd)); 
       printf("cwd %s\n", cwd); 

       // do some stuff on the directory 

       //int result = createFile("file.txt"); // this function works fine but the file is always created in the current directory 
      } 
     } 
    } 
    } 

если кто-то может помочь, это будет понятно. Спасибо.

+0

@chux Нет декларации не видно в этом коде. – ameyCU

+0

@chux и ameyCU жаль, ребята, это часть большой программы, которую я сделал, и я не хотел ставить всю программу здесь, поэтому я забыл о букете, мне очень жаль. Я редактировал вопрос. – cbInfo009

+0

Вам нужно только один раз вызвать 'getcwd()', если вы не используете 'chdir()' для изменения каталога. Вам не нужно префиксное значение из 'getcwd()'; вы можете использовать '.' для обозначения текущего каталога. Или вы можете просто использовать имя без изменений; пользователь может ввести абсолютное имя (начиная с '/') или относительное имя (не начиная с '/') по своему усмотрению. Это дает лучшую гибкость. –

ответ

0

Вот некоторые рабочий код:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <dirent.h> 

int main(int argc, char **argv) 
{ 
    int i = 0; 
    char path[1024]; 

    if (argc < 3) 
    { 
     fprintf(stderr, "Usage: %s dir1 dir2 [...]\n", argv[0]); 
     exit(1); 
    } 

    for (i = 1; i < argc; i++) 
    { 
     DIR *rep; 
     if ((rep = opendir(argv[i])) != NULL) 
     { 
      struct dirent *dp; 
      while ((dp = readdir(rep)) != 0) 
      { 
       if (strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0) 
        continue; 
       printf("Name: %s/%s\n", argv[i], dp->d_name); 
      } 
      closedir(rep); 

      snprintf(path, sizeof(path), "%s/%s", argv[i], "filename.txt"); 
      FILE *fp = fopen(path, "w"); 

      if (fp == 0) 
       fprintf(stderr, "Failed to create file %s\n", path); 
      else 
      { 
       fprintf(fp, "File %s created successfully\n", path); 
       fclose(fp); 
      } 
     } 
    } 
    return 0; 
} 

Пример запуска:

$ mkdir junk1 junk1/subdir junk2 junk2/subdir-too 
$ cp /dev/null junk1/forget-me-not 
$ cp /dev/null junk2/hallelujah-chorus 
$ ./dodir junk1 junk2 
Name: junk1/forget-me-not 
Name: junk1/subdir 
Name: junk2/hallelujah-chorus 
Name: junk2/subdir-too 
$ ls -l junk? 
junk1: 
total 8 
-rw-r--r-- 1 jleffler staff 45 Oct 25 00:11 filename.txt 
-rw-r--r-- 1 jleffler staff 0 Oct 25 00:11 forget-me-not 
drwxr-xr-x 2 jleffler staff 68 Oct 25 00:11 subdir 

junk2: 
total 8 
-rw-r--r-- 1 jleffler staff 45 Oct 25 00:11 filename.txt 
-rw-r--r-- 1 jleffler staff 0 Oct 25 00:11 hallelujah-chorus 
drwxr-xr-x 2 jleffler staff 68 Oct 25 00:11 subdir-too 
$ rm -fr junk? 
$ 
+0

так что я возобновляю: opendir (argv [i]), чтобы открыть каталог с указанным именем, readdir (rep), чтобы прочитать, что находится в каталоге, и вы можете получить путь к этому каталогу, чем созданный файл ..etc. теперь есть способ вызвать эту функцию (я расскажу ниже), которая берет любую строку как параметр и выполняет ее внутри каталога argv [i], я не знаю, как дать ему путь или позиционировать в argv [i ] withowt с использованием пути: int createFolder (char * target) { char buffer [100] = {0}; snprintf (буфер, sizeof (буфер), "mkdir% s", цель); return (система (буфер)); } – cbInfo009

+0

как у отступать код в комментарии ?? потому что мой выглядит ужасно ...>. <" – cbInfo009

+0

Я показал, как создать файл в каталоге, вы можете сделать это в функции, а не в основной программе. Используя' system() 'и' mkdir' команду неудобно, вместо этого используйте системный вызов 'mkdir()'.Вы должны передать хотя бы 'argv [i]' и, возможно, имя подкаталога в функцию 'createFolder()', вот и все. –

0

opendir не изменяет текущий рабочий каталог. Он открывает вверх по каталогу и дает вам ручку.

Чтобы на самом деле изменить текущий рабочий каталог, вам необходимо позвонить chdir.

+0

поблагодарить u за ответ, так что если я делаю int cpt = chdir (cwd); автоматически я буду располагаться в каталоге, а затем я вызываю функцию для создания файла? – cbInfo009

+0

@Potato: Вы можете использовать 'chdir()', но вам нужно быть осторожным, если вы это сделаете. Обработка второго имени каталога будет сложнее, если вы это сделаете (посмотрите 'fchdir()' и как открыть каталог, чтобы вы могли использовать 'fchdir()'). Возможно, вы можете выполнять свою работу без 'chdir()'; просто префикс имени каталога, которому вы были присвоены любое имя, с которым вам нужно работать. Обратите внимание, что имена из 'readdir()' будут содержать только имя относительно каталога, из которого вы читаете; вам нужно префикс имени с именем каталога, если вы не выполняете 'chdir()', но я бы избегал 'chdir()', если это возможно. –

+0

@JonathanLeffler, спасибо u за ответы :), но я до сих пор не могу это исправить, я не уверен, понимаете ли вы, что я хочу делать. скажите мне: is if ((rep = opendir (argv [i]))! = NULL) означает, что я размещен в каталоге argv [i]?если каталог открыт, почему я не могу делать свои вещи там? – cbInfo009

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