2016-05-31 9 views
0

Ich schrieb einen kleinen C-Code auf Linux mit einer creat-Funktion. Ich habe es mehrmals mit dem gleichen Dateinamen und dem gleichen mode verwendet und jedes Mal, wenn es meine Datei mit einer neuen Zeit und Erlaubnis ohne EEXIST Fehler überschreibt.creat() überschreiben meine Datei

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

Was ist das Problem?

+0

Wenn das nicht das, was Sie wollen, warum rufst du 'creat' ?! –

+0

Ich möchte erstellen, aber ich möchte es zuerst überprüfen, ob diese Datei existiert. –

+0

Können Sie sehr genau sein, was genau Sie tun möchten? Was möchten Sie tun, wenn die Datei bereits existiert? Was möchten Sie tun, wenn die Datei nicht existiert? Was möchten Sie tun, wenn die Datei existiert, aber eine symbolische Verbindung ist? –

Antwort

3

EEXIST wird nur zurückgegeben, wenn O_CREAT | O_EXCL in den Flags zu open verwendet wird. Während creat(2) impliziert O_CREAT, bedeutet es nicht O_EXCL, nur O_CREAT | O_WRONLY | O_TRUNC.

Sie sollten stattdessen open verwenden.

+0

Also jedes Mal, wenn ich eine Datei erstellen möchte, muss ich versuchen, es zuerst zu öffnen? Es gibt keine Möglichkeit während der Erstellung zu überprüfen, ob die Datei vorhanden ist, um sie zu überschreiben. –

+2

@DvirNaim Sie möchten eine Datei richtig öffnen und sie erstellen, wenn sie nicht existiert, und fehlschlagen, wenn sie existiert? Ist das korrekt? Wenn dies der Fall ist, müssen Sie nicht versuchen, es "zuerst" zu öffnen. Sie müssen es nur so öffnen, dass das Öffnen fehlschlägt, wenn die Datei bereits existiert. –

+0

gefunden it..Ich habe gelehrt, dass creat wird die Arbeit für mich .. ich war worng ... http: //stackoverflow.com/questions/230062/whats-the-best-way-to-check-if-a -file-exists-in-c-plattformübergreifend –

3

Die creat() Funktion ist die gleiche wie:

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

Sie müssen die O_APPEND Flaggen am Ende der Datei

So sollten Sie open()read()write()

verwenden schreiben

BEARBEITEN

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

Also jedes Mal, wenn ich eine Datei erstellen möchte, muss ich versuchen, es zuerst zu öffnen? Es gibt keine Möglichkeit während der Erstellung zu überprüfen, ob die Datei vorhanden ist, um sie zu überschreiben. –

+0

Genau, aber Sie können Ihre eigene Funktion erstellen, um die Aufgabe leicht zu machen die 'open()' Funktion gibt Ihnen eine 'file deskriptor', es ist zum Lesen oder Schreiben in eine Datei benötigt –

+0

Wie ..? Welche Werkzeuge brauche ich ..? –