在linux上CreateFile CREATE_NEW等效

时间:2014-04-15 13:17:22

标签: c++ linux createfile

我写了一个尝试创建文件的方法。但是我设置了标志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一样的标志。有没有人知道这方面的解决方案?

3 个答案:

答案 0 :(得分:7)

请查看open() manpageO_CREATO_EXCL的组合正是您所寻找的。

示例:

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。

请检查:http://linux.die.net/man/2/open

答案 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完全相同。

它会在你寻找时创建一个新文件。