有没有更好的方法来通过 C/C++ 中的环境变量创建路径
is there better way for making path through Environment variables in c/c++?
在 C/C++ 中,有没有比这更好的方法来通过环境变量进行路径?
char *S1 = std::getenv("SystemDrive");
char *S2 = std::getenv("USERNAME");
strcat(S1,"\\Users\\");
strcat(S1,S2);
strcat(S1,"\\");
strcat(S1,"Documents");
我建议获取这样的用户配置文件目录。
BOOL GetCurrentUserDir(LPTSTR lpszBuf, LPDWORD lpdwBuflen)
{
HANDLE hProcessToken;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_READ, &hProcessToken))
return FALSE;
if (!GetUserProfileDirectory(hProcessToken, lpszBuf, lpdwBuflen)) {
CloseHandle(hProcessToken);
return FALSE;
}
CloseHandle(hProcessToken);
return TRUE;
}
我像这样使用这个函数:
WCHAR szLocalPath[MAX_PATH];
if (!GetCurrentUserDir(szLocalPath, &cchPath))
{
//Handle the error
}
然后,您可以追加路径的其余部分。
这封装了特定的环境变量,并使用了 Win32 API。随着时间的推移,这更有可能保持便携性。
为什么不使用 std::string?
std::string s1 = std::getenv("SystemDrive");
s1 += "\\Users\\" + std::getenv("USERNAME") + "\\Documents";
连接多个字符串的一个好方法是使用 snprintf
:
char buf[0x10000];
int n = std::snprintf(buf, sizeof buf, "%s\\Users\\%s\\Documents", S1, S2);
if(static_cast<size_t>(n) >= sizeof buf)
// Buffer is too small (if n > 0) or error
事实上,snprintf
不会溢出缓冲区并且总是零终止,这使得不安全的函数strcpy
、strncpy
strcat
不必要的。
不确定您确切需要什么。这是从环境变量创建路径吗?或者获取系统目录的正确路径?在后一种情况下,您最好使用 Win32 API,例如:SHGetFolderPath
或 SHGetKnownFolderPath
。
#include <Windows.h>
#include <ShellAPI.h>
#include <KnownFolders.h>
#include <ShlObj.h>
int main()
{
CoInitialize(NULL);
TCHAR* path = 0;
SHGetKnownFolderPath(FOLDERID_Documents, KF_FLAG_SIMPLE_IDLIST, NULL, &path);
// use collected 'path' here
CoTaskMemFree(path); // free the TCHAR object allocated by SHGetKnownFolderPath
return 0;
}
上面的代码检索当前用户的"我的文档"文件夹路径。
std::getenv
已被弃用。
我会使用类似的东西:
char* wSystemDrive = nullptr;
size_t wSize = 0;
bool wFree = true;
if(_dupenv_s(&wSystemDrive,&wSize,"SystemDrive") != 0 || wSystemDrive == nullptr)
{
wFree = false;
wSystemDrive = "C:\"; //or anything default you want to use
}
std::string wSysteDriveString(wSystemDrive);
if(wFree)
{
free(wSystemDrive);
}
char* wUSERNAME = nullptr;
wSize = 0;
wFree = true;
if(_dupenv_s(&wEnv,&wSize,"wUSERNAME") != 0 || wUSERNAME == nullptr)
{
wFree = false;
wUSERNAME = "User";
}
std::string wUSERNAMEString(wUSERNAME);
if(wFree)
{
free(wUSERNAME);
}
std::string wPath = wSystemDriveString + "\Users\" + wUSERNAMEString + "\Documents"
请注意,您不需要 4 (
\\
),只需要两个 (\
)。
相关文章:
- 枚举环境变量的惯用C++14/C++17方法
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 定义C++新的环境变量并在 bat 文件中使用它
- docker 构建失败:无法设置环境变量
- 如何在不传递命令行参数的情况下在 c++ 中设置环境变量
- C++环境变量
- 在编译时为运行时设置环境变量
- 如何使用可视化代码和平台IO将环境变量注入CPP文件?
- 访问 PlatformIO 中的外部环境变量
- WSL 看不到环境变量
- 如何在提升构建中设置环境变量以进行提升单元测试框架?
- 注册 TBB 的环境变量
- 如何设置Qt应用程序以使用类Unix系统的实际环境变量?
- CMake 看不到SDL2_PATH环境变量 (Windows)
- 跨语言共享环境变量
- 什么是运行英特尔线程构建模块的 XCode 8 环境变量
- 在运行时将更改的环境变量应用于 QApplication
- 在C++程序中找不到环境变量 UID
- Visual Studio 2017 C++,如何定义一个"环境变量"'Additional Library Directory'?
- 如何使用boost :: program_options提取环境变量