2016-05-31 17 views
0

Я записал небольшой код C на linux с функцией creat. Я использовал его пару раз с тем же именем файла и тем же mode и каждый раз, когда он перезаписывает мой файл с новым временем и разрешением без ошибки EEXIST.creat() перезаписать мой файл

if (creat(name, mode) < 0) 
{ 
    printf("something went wrong with create! %s\n", strerror(errno)); 
    exit(1); 
} 

В чем проблема?

+0

Если это не то, что вы хотите, почему вы звоните 'creat' ?! –

+0

Я хочу создать, но я хочу, чтобы он сначала проверял, существует ли этот файл. –

+0

Можете ли вы быть очень, очень конкретными в отношении того, что вы хотите сделать? Что вы хотите, если файл уже существует? Что вы хотите, если файл не существует? Что вы хотите, если файл существует, но является символической ссылкой? –

ответ

3

EEXIST возвращается только в том случае, если O_CREAT | O_EXCL используется в флагах для open. В то время как creat(2) действительно подразумевает O_CREAT, это не означает O_EXCL, только O_CREAT | O_WRONLY | O_TRUNC.

Вы должны использовать open. Функция

+0

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

+2

@DvirNaim Вы хотите открыть файл правильно, создав его, если он не существует и не работает, если он существует? Это верно? Если это так, вам не нужно пытаться открыть его «первым», все, что вам нужно сделать, это попытаться открыть его таким образом, чтобы сбой не удался, если файл уже существует. –

+0

нашел это .. Я пробовал, что труп сделает эту работу для меня .. Я был worng ... http: //stackoverflow.com/questions/230062/whats-the-best-way-to-check-if-a -file-exists-in-c-cross-platform –

3

Creat() такая же, как:

open(path, O_CREAT | O_TRUNC | O_WRONLY, mode); 

Вам нужно флаги O_APPEND писать в конце файла

Таким образом, вы должны использовать open()read()write()

EDIT

Exemple:

#include <fcntl.h> 
#include <unistd.h> 

int is_file_exist (char *filename) 
{ 
    struct stat buffer; 
    return (stat (filename, &buffer) == 0); 
} 

void open_read_write() { 
    int fd; 

    if (!is_file_exist("./file")) 
    return ; 
    // open a file descriptor, if not, create 
    fd = open("./file", O_RDWR | O_APPEND); 
    // thanks to O_APPEND, write() writes at the end of the file 
    write(fd, "hello world\n", 12); 
    // close the file descriptor 
    close(fd); // important ! 
} 
+0

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

+0

Точно, но вы можете создать свою собственную функцию, чтобы облегчить задачу Функция 'open()' дает вам «дескриптор файла», он необходим для чтения или записи в файл –

+0

Как ..? какие инструменты мне нужны ..? –

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