如何解决验证在C ++中创建多个文件夹和文件的正确方法
我正在处理一个个人项目,程序执行的第一步之一就是当用户通过控制台应用命令时创建一些文件夹和文件。
例如。用户通过控制台执行命令 #if defined(UNICODE) && !defined(_UNICODE)
#define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
#define UNICODE
#endif
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lpCmdLine,int iCmdShow){
int s = MessageBoxW(NULL,L"Hi This is my First c++ GUI",L"Win32 API Say:",MB_CANCELTRYCONTINUE);
if(s == IDTRYAGAIN){
MessageBoxW(NULL,MB_CANCELTRYCONTINUE);
}else if(s == IDCONTINUE){
MessageBoxW(NULL,L"Yes GO On",MB_ICONINFORMATION);
}else{
MessageBoxW(NULL,L"GoodBey !!",MB_OK);
}
return 0;
}
,这将触发以下文件和文件夹的创建:
- emi_base
- emi_database
- emi_main_db_file.csv
- emi_catch_db_file.csv
- emi_temp_db_file.csv
- emi_version
- emi_main_version_folder
- emi_catch_version_folder
- emi_temp_version_folder
- emi_config
- emi_config_file.txt
- emi_ignore_file.txt
- emi_repo_file.txt
- emi_database
为此,我使用类似于以下代码:
sum(replace(salary,"0",""))
好吧,目前一切正常,但是,我不知道这是否是验证文件夹和相应文件是否正确创建的最佳方法,在我看来,将所有这些布尔值放入有条件是不正确的事。
有更好的方法吗?有没有更好的方法可以一次或按顺序验证多个文件夹和文件的创建?
希望有人可以给这个新手一些反馈:)
解决方法
如果fs::create_directory
是std::filesystem::create_directory
,那么如果无法创建目录,则fs::create_directory(<path>)
会引发异常,您无需检查其返回值:
不带参数
std::error_code&
的重载会在基础OS API错误上抛出filesystem_error
,该错误由p
作为第一个路径参数,而OS错误代码作为错误代码参数构造
但是您确实需要通过ofstream::is_open
调用来检查文件是否已成功打开。您可能想创建一个帮助函数,该函数打开一个ofstream
并检查是否成功,然后返回ofstream
,在C ++ 11中ofstream
是可移动的,因此可以按值返回。例如:
std::ofstream open_ofstream(char const* filename) {
std::ofstream f(filename,std::ios::out | std::ios::binary);
if(!f.is_open())
throw std::system_error{errno,std::system_category(),filename}; // Hoping that std::ofstream didn't mangle errno.
// or throw std::filesystem::filesystem_error{"failed to open",filename,std::error_code{errno,std::system_category()}};
return f;
}
如果所有目录和文件都位于一个顶级目录中,则可能要先使用不同的名称创建它,在其中创建目录/文件结构并初始化文件,然后重命名顶级目录保留其最终名称。这样,当存在顶级目录时,这意味着它已正确初始化并可以使用。
,我认为更好的方法是,如果文件夹创建失败,则在create_directory函数中引发异常。因此,您无需检查每个create_directory调用。一次尝试捕获就足够了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。