2008-11-21 1 views
1

Я создал папку и после того, как я открыл файл внутри этой папки, напишите на ней. Случается, что после этого я пытаюсь открыть файл, но у меня нет прав, поэтому мне нужно его вручную изменить.Как получить разрешение на чтение в недавно созданной папке и файле в C?

/* str1 has tha name of the folder */ 
/* str the bytes I want to write in the file inside the folder*/ 
... 

    mkdir(str1,0777);  
    if (filefd < 0) { 

     strncpy(auxstr, str, MAX_MSG + 1); 
     strcat(str1,"\\"); 
     strcat(str1, auxstr); 
     filefd = open (str1, O_RDWR | O_CREAT | O_TRUNC); 

     nbytes -= (strlen(str) + 1); 
     memcpy(auxstr, &str[strlen(str)+1], nbytes); 
     memcpy(str, auxstr, nbytes); 

    } 

    /*write to the file */ 
    if ((nwritten = write(filefd, str, nbytes)) != nbytes) { 
     printf ("can't write on file\n"); 
     break; 
    } 

Что я должен изменить, чтобы иметь разрешения на открытие созданного файла?

Спасибо большое,


: s

с = 0_CREATE я до сих пор проблема не имеющих разрешения на чтение файла. я должен установить их вручную


И у меня уже есть 0_CREAT на открытом

открытой (str1, O_RDWR | O_CREAT | O_TRUNC);

+0

Вы должны проверить статус возврата из системного вызова mkdir(); он может потерпеть неудачу. Непонятно, почему filefd будет отрицательным, но это часть проблемы с фрагментами кода и неполными (не) рабочими примерами. – 2008-11-25 05:36:08

+0

Вы также должны проверить статус возврата из системного вызова open(); он может потерпеть неудачу. Я также обнаружил операции memcpy() после непонятного вызова open(). – 2008-11-25 05:58:33

ответ

3

Что CesarB пытается сказать вам, что вам нужно предоставить разрешения в качестве третьего аргумента:

filefd = open (str1, O_RDWR | O_CREAT | O_TRUNC, 0777); 

И, пожалуйста, используйте «Добавить комментарий "вместо ответа на свой вопрос.

3

БЕЗОПАСНОСТЬ КАСАЕТСЯ

Вопрос использует 0777 разрешения на каталоге - нет! В обычном ходе событий вам не следует создавать каталог с разрешением 0777. Вы можете использовать 01777, как на /tmp; грубо говоря, что гарантирует, что люди, удаляющие файл из каталога, имеют разрешение на изменение файла. Но вы не должны разрешать всем пользователям удалять любые файлы из каталога. И утверждая, что настройка umask защитит вас, хотя, вероятно, и правильна, по-прежнему не является хорошим оправданием для испортить жизнь тех, кто не знает, как установить ее безопасно. Используйте 0755 или, возможно, 0775, но не 0777.

В одном из ответов используется разрешение 0777 на файл - нет! Аргумент аналогичен аргументу для каталогов, с добавлением оговорки, что большинство людей не создают исполняемые файлы при создании файлов (писатели-компоновщики будут исключением из этого общего правила) и независимо от того, должен ли результирующий файл быть исполняемым , все равно невероятно плохая идея разрешить кому бы то ни было изменять программу. Используйте 0644 или 0664; редко существует веская причина для использования 0666 и еще реже - причина для использования 0777.

0

Проблема в том, что вы используете неправильный разделитель путей - вы пытаетесь использовать обратную косую черту '\\' для разделения компонентов. Это разделитель путей для Windows. Поскольку вы, кажется, используете операционную систему на основе nix, вы должны использовать косую черту '/' в качестве разделителя путей. Фактически даже в Windows вы должны использовать косую черту, поскольку она более переносимая - Windows автоматически преобразует косые черты в обратную косую черту.

В результате вы пытаетесь создать файл с именем «foo \ bar» в текущем каталоге, и это, вероятно, не работает, поскольку у вас нет прав на создание файла в текущем каталоге.

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

  • Нет связанных вопросов^_^