将路径转换为\\

-5 c++ winapi

好的,经过两天搜索网络和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 
Run Code Online (Sandbox Code Playgroud)

我只发布了这部分代码,因为其他一切正常并且与此问题无关.非常感谢任何帮助,因为我在最近两天发疯了.

Car*_*ory 5

您正在混淆C和C++中的要求,以使用Windows所需的字符串文字来转义反斜杠字符.

Windows仅在两种情况下允许路径中出现双反斜杠:

  • 以"\\?\"开头的路径
  • 引用共享名称的路径,例如"\\ myserver\foo"

因此,"C:\\file.exe"从来没有一个有效的路径.

这里的问题是,微软几十年前做出(灾难性的)决定使用反斜杠作为路径分隔符,而不是像UNIX那样使用正斜杠.自20世纪80年代早期以来,这一决定一直困扰着Windows程序员,因为C和C++使用反斜杠作为字符串文字中的转义字符(并且在文字中).

所以在C或如果你输入像C++ DeleteFile("c:\file.exe")什么DeleteFile将看到的是"c:ile.exe"与非打印0xf冒号之间插入"ile.exe".那是因为编译器看到反斜杠并将其解释为意味着下一个字符不是它看起来的样子.在这种情况下,下一个字符是a f,它是有效的十六进制数字.因此,编译器将"\ f"转换为字符0xf,这在文件名中无效.

那么如何在C/C++程序中创建路径"c:\ file.exe"呢?你有两个选择:

  • "C:/file.exe"
  • "C:\\的file.exe"

第一种选择是有效的,因为在Win32 API中(并且只有API,而不是命令行),路径中的正斜杠被接受为路径分隔符.第二种选择有效,因为第一个反斜杠告诉编译器特别处理下一个字符.如果下一个字符是十六进制数字,那就是你将得到的.如果下一个字符是另一个反斜杠,它将被解释为完全相同,并且您的字符串将是正确的.

  • 我建议避免使用正斜杠,因为虽然它适用于大多数Win32 API函数,但内核不支持它.这意味着,例如,您不能将它用于长文件路径. (2认同)