好的,经过两天搜索网络和MSDN后,我没有找到任何真正解决这个问题的方法,所以我会在这里问我希望我忽略了什么。
我有一个打开的对话窗口,在我从所选文件中获取位置后,它以下列方式C:\file.exe
给出了字符串。对于我的下一部分程序,我需要C:\\file.exe
。是否有任何Microsoft功能可以解决此问题,或一些解决方法?
ofn.lpstrFile = fileName;
char fileNameStr[sizeof(fileName)+1] = "";
if (GetOpenFileName(&ofn))
strcpy(fileNameStr, fileName);
DeleteFile(fileName); // doesn't works, invalid path
我只发布了这部分代码,因为其他一切正常并且与此问题无关。非常感谢任何帮助,因为我在最近两天都疯了。
答案 0 :(得分:5)
您在C和C ++中的要求令人困惑,以使用Windows所需的字符串文字来转义反斜杠字符。
Windows仅在两种情况下允许路径中出现双反斜杠:
因此,"C:\\file.exe"
永远不会成为有效路径。
这里的问题是,微软几十年前做出(灾难性的)决定使用反斜杠作为路径分隔符,而不是像UNIX那样使用正斜杠。自20世纪80年代早期以来,这一决定一直困扰着Windows程序员,因为C和C ++在字符串文字中使用反斜杠作为转义字符(而仅在文字中)。
所以在C或C ++中,如果你输入类似DeleteFile("c:\file.exe")
的内容,那么DeleteFile
会看到"c:ile.exe"
,并且冒号和0xf
之间插入了一个不可打印的"ile.exe"
。这是因为编译器看到反斜杠并将其解释为意味着下一个字符不是它看起来的样子。在这种情况下,下一个字符是f
,这是一个有效的十六进制数字。因此,编译器会转换" \ f"进入字符0xf,它在文件名中无效。
那么如何创建路径" c:\ file.exe"在C / C ++程序中?你有两个选择:
第一种选择有效,因为Win32 API中的 (只有API,而不是命令行),路径中的正斜杠被接受为路径分隔符。第二种选择有效,因为第一个反斜杠告诉编译器特别处理下一个字符。如果下一个字符是十六进制数字,那将是你得到的。如果下一个字符是另一个反斜杠,它将被解释为完全相同,并且您的字符串将是正确的。
答案 1 :(得分:0)
库Boost.Filesystem"提供便携式设施来查询和操作路径,文件和目录"。
简而言之,您不应将字符串用作文件或路径名。请改用boost :: filesystem :: path。你仍然可以从字符串或char *初始化它,你可以将它转换回std :: string,但是所有的操作和装饰都将由类完成。
答案 2 :(得分:-4)
我猜您的意思是将“C:\ file.exe”转换为“C:\\ file.exe”
std::string output_string;
for (auto character : input_string)
{
if (character == '\\')
{
output_string.push_back(character);
}
output_string.push_back(character);
}
请注意它实际上是在寻找替换的单个反斜杠,代码中使用的双反斜杠是为了逃避第一个反斜杠。