绝对文件路径作为std :: ifstream构造函数参数无效

时间:2015-01-28 17:54:02

标签: c++ windows file winapi path

我正在开发一个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);
}

0 个答案:

没有答案