我正在开发一个Win32应用程序,它有一个配置对话框,用户可以在其中指定数据库根目录/工作目录等文件路径。到目前为止,在测试中,我一直在使用相对文件路径的这个功能,因为我的文件结构没有太多分散。此外,我的config.txt文件与.exe文件位于同一目录中,在启动时加载,使用相对的硬编码路径调用std :: ifstream构造函数。
由于我刚刚使用命令行(允许在程序的.exe文件上拖动文件,因此传递它们的路径),the path to the config.txt file somehow is not recognized as valid
和我的程序(相应地)会引发错误。用绝对路径替换相对的硬编码路径不会解决这个问题,因为这样就会出现白色空格,反斜杠(我的用户名中也可能是德语变音符号)的问题。
除了config.txt路径的问题,我现在尝试paste absolute paths from the address bar of Windows Explorer
进入程序配置对话框的编辑控件。然而,通过这些路径,我遇到了几乎相同的问题。
为了解决这个问题(可能进一步暗示我的问题的来源),当我drag files on the .exe
传递他们的路径时会发生同样的行为。幸运的是,路径(包含空格)在命令行中引用,因此分离很容易,但在读入之后,它们的行为就像config.txt路径和输入到配置对话框中的路径一样。
长话短说 - 我正在寻找一种方法将路径从Windows资源管理器的命令行或地址栏转换为std :: ifstream构造函数的有效参数。这里讨论的问题实际上很常见 - 标准的空格,反斜杠和Umlaute(Unicode)。
这是从对话框中读取绝对路径并尝试打开std :: ifstream的最小示例:
char path[256];
HWND hEditCtrl = GetDlgItem(hwndConfigurationDlg, IDC_CONFIG_EDITTEXT_DATABASE);
GetWindowText(hEditCtrl, path, sizeof(path));
// path contains something like
// "C:\Users\Firstname Lastname\Documents\2__Programming\Desktop\Gerät.txt"
// notice the whitespace, backslashes, German Umlaut.
std::ifstream ifstr(path, ios::in);
if (!ifstr.good()){
MessageBox(NULL, "The file was not found at the specified path.",
"File Open Error", MB_OK);
}