【问题标题】:Creating a folder with today's date using c++使用 C++ 创建一个包含今天日期的文件夹
【发布时间】:2017-07-07 07:16:34
【问题描述】:

我是 C++ 编程和使用 Visual Studio 2015 的新手。我想在特定路径中创建一个名称为当前日期的文件夹。我在互联网上搜索,但找不到满意的解决方案。此外,我自己尝试过,但不幸的是结果并不成功。 我使用了 _mkdir() 和 CreateFolder()。

例如,如果我今天(07.07.2017)编译程序,那么它应该创建一个名称为:“07072017”的文件夹,如果我再次编译它,那么它应该显示消息:“文件夹已存在”。

提前致谢。

【问题讨论】:

  • 那么“今天的日期”是指编译日期吗? Visual Studio 提供了一个 __DATE__ 宏,其中包含该宏。见here
  • @FedericoklezCulloca 它应该在我运行程序时创建一个文件夹。
  • 好吧,将日期分配给 std::string,将其修改为您想要的格式,如果目录尚不存在,将其传递给 mkdir()?
  • __DATE__ 是标准 C++(不仅仅是 VS),用于获取(当前编译单元的)编译时间。它是mmm dd yyyy 形式的字符串文字(例如"Jan 30 2017")。使用它以您需要的形式作为起点进行处理。那么您所需要的只是一种创建具有指定名称的目录的方法 - 在 C++17 中,可以使用 create_directory() in <filesystem> 来完成。

标签: c++ csv datetime visual-studio-2015 directory


【解决方案1】:

正如@user8210143 所述,您可以使用 c++ 标准库实验位。

如果日期格式对您的目的并不重要,您可以使用__DATE__ 编译器定义:

Live On Coliru

#include <experimental/filesystem>
#include <iostream>

namespace fs = std::experimental::filesystem;

int main() {
    auto dirname = fs::current_path() / __DATE__;

    std::cout << "creating directory " << dirname << "\n";
    if (create_directories(dirname)) {
        std::cout << "directory didn't exist yet\n";
    }
}

打印类似的东西

creating directory "/home/sehe/Projects/stackoverflow/Jul  7 2017"
directory didn't exist yet

在我的系统上

【讨论】:

  • 我也可以更改创建目录的路径吗?例如,我想在“E:/ProjectWork/Project/MyWork”中创建一个文件夹。因为当我使用 current_path() 时,它正在创建一个保存程序的文件夹。
  • 使用current_path() 显然使用...当前路径(即working directory。当然可以。为什么这是个问题?随便填吧:fs::path("E:/ProjectWork/Project/MyWork") / __DATE__;
【解决方案2】:

如果我们在谈论 Windows,您可以尝试使用 WINDOWS API CreateDirectory 函数。 更多信息:https://msdn.microsoft.com/en-us/library/windows/desktop/aa363855(v=vs.85).aspx

使用 argv[0] 从main(int argc, char argv[]) 获取您的 .exe 当前目录,并记得使用#include &lt;windows.h&gt;。您也可以尝试使用参数 mkdir folderName 执行 shell 或 cmd.exe 来完成它。

关于检索当前日期,我建议阅读 How to get current time and date in C++?

【讨论】:

    【解决方案3】:

    这是一个使用 &lt;experimental/filesystem&gt; 和 Visual Studio 的示例。

    #include "stdafx.h"
    #include <iostream>
    #include <experimental\filesystem>
    
    using namespace std;
    
    int main() {
    int sizeofdate = strlen(__DATE__);
    char* dirname = new char[4 + sizeofdate];
    memcpy(dirname, "C:/", 3);
    memcpy(dirname + 4, __DATE__, sizeofdate);
    
    cout << "creating directory" << endl;
    if (!experimental::filesystem::exists(dirname)) {
        experimental::filesystem::create_directory(dirname);
    }
    else {
        cout << "directory already exists!" << endl;
    }
    
    delete[] dirname;
    
    int thing;
    cin >> thing;
    
    return 0;
    }
    

    【讨论】:

    • @user821043 在运行您的代码时出现此错误:ConsoleApplication1.exe 中 0x77B0A9F2 处的未处理异常:Microsoft C++ 异常:内存位置 0x00AFF504 处的 std::experimental::filesystem::v1::filesystem_error .
    • 这可以使用便携式 C++ 来回答,而不是“Visual Studio”。此外,memcpy 和 new 在现代 C++ 中没有位置。这是不好的建议。
    • delete 的情况相同,缺乏异常安全性(泄漏),using namespace(参见stackoverflow.com/questions/1452721/…)。感谢您的贡献,我知道您才刚刚开始。请记住,回答 SO 是学习现代 C++ 的捷径(再次),所以反馈对我们来说真的只是额外的胜利!
    • 感谢您的反馈,它可以帮助我学习。我不喜欢使用 40 字节字符串之类的东西,我坚持使用 char*。我认为在简单的示例程序中不需要进行错误检查。并不是真的想学习你会在办公室使用的现代 c++。至于错误,我没有收到错误。所以我不知道问题是什么。
    • 40 字节字符串?
    猜你喜欢
    • 1970-01-01
    • 2019-12-01
    • 2022-12-24
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 2012-12-06
    • 2016-10-06
    • 1970-01-01
    相关资源
    最近更新 更多