2016-06-21 107 views
0

我使用open()函数打开文件。如何使open()截断现有文件

我想open()函数丢弃文件内容,如果它已经存在,然后该文件被视为一个新的空文件。

我试着用下面的代码:

int open_file(char *filename) 
{ 
    int fd = -1; 
    fd = open(filename, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); 
    if (fd < 0) { 
     printf("Couldn't create new file %s: %s\n", 
      filename, strerror(errno)); 
     return -1; 
    } 
    close(fd); 
    return 0; 
} 

,但我得到了以下错误:

Couldn't create new file kallel333: File exists 

我缺少什么?

+0

要删除或截断文件 – sas

+4

您是否尝试添加O_TRUNC标志。 – sas

+0

@sas watever,目标是有一个新的空的打开的文件。我不想得到这个错误 – MOHAMED

回答

5

请添加O_TRUNC标志和删除O_EXCL。

open(filename, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); 

从开手册页 -

O_EXCL确保这个调用创建文件:如果该标志与O_CREAT一起指定 ,和路径已经 存在,则open()将失败。

O_TRUNC 如果该文件已经存在,并且是一个普通文件和 访问模式允许写入(即,是或O_RDWR O_WRONLY)它 将被截断为长度

2

open()的手册页说,这对O_TRUNC标志:

O_TRUNC If the file already exists and is a regular file and the open mode allows writing (i.e., is O_RDWR or O_WRONLY) it will be truncated to length 0. If the file is a FIFO or terminal device file, the O_TRUNC flag is ignored. Otherwise the effect of O_TRUNC is unspecified.

+0

这就是它的一部分 - 但只是其中的一部分。您也必须删除'O_EXCL',因为如果它存在,那么在截断有机会发生之前,如果文件已经存在,系统调用将无法打开该文件。请注意,如果可能,最好提供一个指向您咨询的手册页的在线版本的链接。对于Linux,您通常可以使用http://linux.die.net/作为手册页的源代码 - 尽管有很多选择。 –

3

的问题是O_EXCL标志。从手册页open(2)

O_EXCL Ensure that this call creates the file: if this flag is specified in conjunction with O_CREAT, and pathname already exists, then open() will fail.

我建议删除O_EXCL,增加O_TRUNC,并再次尝试。

0

我会告诉你这个错误是什么! Open函数将具有返回类型,即执行此系统调用后会返回一些值(在您的情况下,它将存储在fd中)。 该值将指示系统调用的执行是否成功。当open系统调用失败时,会自动返回-1(至fd),您已在函数int fd = -1;的第一个语句中初始化它。因此,if (fd < 0)语句被验证为正确,因此您正在收到该错误。 请注意,您不应设置系统调用的返回值,它们将在程序执行时自动返回。你需要做的只是确保你捕获这个值并验证它。因此,请将您的第一条语句int fd = -1更改为int fd

底线:您设置open系统调用的返回值,从而-1 ,告诉它的创作应该不惜任何代价失败的编译器!就权限而言,请参阅其他评论!:)