我写了一个尝试创建文件的方法。但是我设置了标志CREATE_NEW,因此它只能在它不存在时创建它。它看起来像这样:
for (;;)
{
handle_ = CreateFileA(filePath.c_str(), 0, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_HIDDEN | FILE_FLAG_DELETE_ON_CLOSE, NULL);
if (handle_ != INVALID_HANDLE_VALUE)
break;
boost::this_thread::sleep(boost::posix_time::millisec(10));
}
这样可行。现在我想把它移植到linux,当然CreateFile函数只适用于windows。所以我在寻找与此相当的东西,但在Linux上。我已经看过open()但是我似乎找不到像CREATE_NEW一样的标志。有没有人知道这方面的解决方案?
答案 0 :(得分:7)
请查看open()
manpage,O_CREAT
和O_EXCL
的组合正是您所寻找的。 p>
示例:
mode_t perms = S_IRWXU; // Pick appropriate permissions for the new file.
int fd = open("file", O_CREAT|O_EXCL, perms);
if (fd >= 0) {
// File successfully created.
} else {
// Error occurred. Examine errno to find the reason.
}
答案 1 :(得分:2)
fd = open("path/to/file", O_CREAT | O_EXCL | O_RDWR | O_CLOEXEC);
O_CREAT: Creates file if it does not exist. If the file exists, this flag has no effect.
O_EXCL: If O_CREAT and O_EXCL are set, open() will fail if the file exists.
O_RDWR: Open for reading and writing.
此外,creat()等同于open(),其标志等于O_CREAT | O_WRONLY | O_TRUNC。
答案 2 :(得分:1)
这是正确且有效的答案:
#include <fcntl2.h> // open
#include <unistd.h> // pwrite
//O_CREAT: Creates file if it does not exist.If the file exists, this flag has no effect.
//O_EXCL : If O_CREAT and O_EXCL are set, open() will fail if the file exists.
//O_RDWR : Open for reading and writing.
int file = open("myfile.txt", O_CREAT | O_EXCL | O_RDWR | O_CLOEXEC);
if (file >= 0) {
// File successfully created.
ssize_t rc = pwrite(file, "your data", sizeof("myfile.txt"), 0);
} else {
// Error occurred. Examine errno to find the reason.
}
我在评论中发布了这段代码,因为他的问题已经关闭了......但是我在Ubuntu上测试了这段代码,它的工作方式与CreateFileA和WriteFile完全相同。
它会在你寻找时创建一个新文件。