Не удается создать файл на Mac на C?

#c #macos

#c #macos

Вопрос:

Я пытаюсь создать файл в этой папке /Users/xxx/yyy/zzz/priya на Mac.

 FILE *f;
f = fopen("/Users/xxx/yyy/zzz/priya/program.txt", "w");
if (f == NULL) {
  printf("unable to open ");
} else {
  fprintf(f, "log presents ...n");
}
  

Но каждый раз я получаю «не удается открыть». Все папки имеют разрешение на чтение и запись.Но не может предоставить разрешение на чтение и запись для Macintosh HD. Является ли это причиной отказа от создания файла? Любой намек будет полезен для меня.

Комментарии:

1. Для чего нужны разрешения /Users/xxx/yyy/zzz/priya ? Также путь в вашей программе не совпадает с путем в вашем заявлении о проблеме? Можете ли вы показать фактический вывод ls -l для любого правильного каталога? Также вы запускаете программу от имени пользователя xxx?

2. Является ли /Users/xxx/yyy/zzz допустимым путем .. ?

3. fopen назначит errno . Вы можете проверить его, чтобы узнать, почему не удалось выполнить вызов. например: if( (f=fopen(path, mode)) == NULL) { perror(path);}

Ответ №1:

Решение находится в комментариях, это альтернативный подход с использованием Mac OSX mkdir(). Он показывает, как создать каждый подкаталог в path.

Перед вызовом fopen() проанализируйте path в массив строк,

 char folder[n][MAX_LEN] = {"Users","xxx","yyy","zzz","priya"}
  

затем проверьте / создайте каждый сегмент, пройдясь по всем каталогам компонентов:

(Пожалуйста, рассмотрите следующий псевдокод, поскольку я отправил его из компилятора, и он не проверен …)

 struct stat st = {0};
len = strlen("/Users/xxx/yyy/zzz/priya");  //length of original path string  
char newDir[len 1];
int status = -1;
memset(newDir, 0, sizeof(newDir));   
for(int i=0;i<n;i  )
{ 
    strcat(newDir, "/");
    strcat(newDir, folder[i])
    status = mkdir(newDir, 0700);
    if ((status != 0) amp;amp; (errno != EEXIST)) 
    {
         //handle error and exit
         break;   
    }
}
  

Комментарии:

1. Вызов stat не требуется. Просто продолжайте и звоните mkdir . Тем не менее, в любом случае проверьте errno mkdir , не удалось ли.

2. @user58697 — Хорошая мысль, отредактировано, чтобы просто использовать ‘mkdir’