如何使用ofstream自动创建目录

31

我现在正在为一个基本的虚拟文件系统存档编写提取器(不带压缩)。

当我的提取器将文件写入一个不存在的目录时,就会遇到问题。

提取函数:

void extract(ifstream * ifs, unsigned int offset, unsigned int length, std::string path)
{
    char * file = new char[length];

    ifs->seekg(offset);
    ifs->read(file, length);

    ofstream ofs(path.c_str(), ios::out|ios::binary);

    ofs.write(file, length);
    ofs.close();

    cout << patch << ", " << length << endl;

    system("pause");

    delete [] file;
}

ifs 是vfs根文件,offset 是文件开始时的值,length 是文件长度,path 是保存偏移量、长度等文件中的值。

例如,路径为 data/char/actormotion.txt。

谢谢。


使用std::ofstream是不可能的,它只用于写文件。在boost中可能有一个很好的封装来创建任意平台上的目录。 - stefan
@WhozCraig 这会很困难,因为这个存档有20,000个不同目录中的文件。 - Kacper Fałat
3个回答

40

ofstream不会创建目录。实际上,C ++没有提供标准的方法来创建一个目录。

在Posix系统上,您可以使用 dirnamemkdir,或Windows等价物,或Boost.Filesystem。基本上,在调用 ofstream 之前应该添加一些代码,以确保目录存在并在必要时创建它。


15
提到C++没有一种标准的方法来创建文件系统目录,这通常会让人感到意外。很好地提到了这一点。+1 - WhozCraig
谢谢。我完全不知道……我花了好几个小时与我的代码作斗争,试图理解到底发生了什么。我原本可以持续写文件,但突然间就停下来了。没想到还有另一段代码专门负责文件夹的创建。 - Alexandru Lucian Susma
10
C++17引入了std::filesystem库,其中包含创建目录的标准方法。然而,目前尚未有编译器全面且正式地支持该库。 - ebk

19

ofstream无法检查目录是否存在。

可以使用boost::filesystem::exists代替。

    #include <boost/filesystem.hpp>

    boost::filesystem::path dir("path");

    if(!(boost::filesystem::exists(dir))){
        std::cout<<"Doesn't Exists"<<std::endl;

        if (boost::filesystem::create_directory(dir))
            std::cout << "....Successfully Created !" << std::endl;
    }

5
这些方法现已成为标准,目前可在 std::experimental::filesystem 下使用。 - Paul
1
不需要提升。 - Craig B
4
std::experimental::filesystem 是 C++17 的特性。对于 C++11 或更早的版本,仍需要使用 Boost 库。 - PlinioSilveira

7

使用ofstream创建目录是不可能的,它主要用于文件。以下有两个解决方案:

解决方案1:

#include <windows.h>
int _tmain() {
    //Make the directory
    system("mkdir sample");
}

解决方案2:
#include <windows.h>
int _tmain() {
    CreateDirectory("MyDir", NULL);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接