#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’