我当前正在使用以下行获取文件描述符:
int fd = open(file_name, O_RDWR | O_APPEND | O_CREAT);
但当文件已经存在时,它失败了(**fd=-1,错误:权限被拒绝**)。我正在使用access()函数来查看文件是否已经存在:
if (access(file_name, F_OK) != -1)
{
printf("file %s already exists! n", file_name);
remove(file_name); /* delete the existing file */
fd = open(file_name, O_RDWR | O_APPEND | O_CREAT);
}
有没有更好的方法可以使用open()函数为以下两种情况获取文件描述符:
- 如果文件不存在,请创建它并返回文件描述符
- 如果文件存在,请删除该文件并创建一个新文件,然后返回一个文件描述符
如果文件存在,请删除它并创建一个新文件,然后返回一个文件描述符。
open()
不支持此功能。最接近的是O_TRUNC
,会截断文件(如果存在),但没有O_
标志,会删除文件(如果文件存在),并且您需要文件的写入权限才能截断它。
正如其他人所指出的,您可能想要解决的真正问题是您缺乏文件的写入权限。如果您拥有该文件,如果您想写入该文件,则应更改权限;如果不拥有该文件,则可能所有者不希望您写入该文件,因此您不应该写入该文件。
开放系统调用在这两种场景中都有效,在这两个场景中您都有文档http://codewiki.wikidot.com/c:system-调用:打开。此外,出现拒绝权限错误是因为您没有权限打开文件或在运行程序的目录中创建文件,请尝试将其作为sudo运行。如果你不想使用系统调用,还有其他C库(它是更高级的,你不需要使用文件描述符),这里有一个关于它的文档:http://www.cplusplus.com/reference/cstdio/FILE/
注意:您还可以更改用户的权限,以便能够访问该文件或在目录上创建该文件。请参阅linux上的chmod命令。
感谢您的回复。这一行代码解决了我的问题:
int fd = open(file_name, O_RDWR | O_APPEND | O_CREAT, 0777); /* change the file permission to 0777 */