我不知道这里发生了什么。下面是代码示例:
#include<stdio.h>
#include<iostream>
#include<string>
#include <Windows.h>
using namespace std;
int main()
{
char my_current_path[1024];
string current_path(R"(C:)");
if (!SetCurrentDirectory(current_path.c_str()))
cout << "cant change to that directory.";
GetCurrentDirectory(1024, my_current_path);
std::cout << my_current_path << endl;
system("pause");
return 1;
}
我在这里做的是尝试将目录更改为一些目录。
我的代码有两个奇怪的地方。
(1奇怪的事情)
当我试着像这样把“c:“改成:
#include<stdio.h>
#include<iostream>
#include<string>
#include <Windows.h>
using namespace std;
int main()
{
char my_current_path[1024];
string current_path(R"(C:)");
if (!SetCurrentDirectory(current_path.c_str()))
cout << "cant change to that directory.";
GetCurrentDirectory(1024, my_current_path);
std::cout << my_current_path << endl;
system("pause");
return 1;
}
它不工作,不改变路径(这是好事。),但它不显示我的消息时,显示的目录没有改变:
cout << "cant change to that directory.";
为什么会这样?(当我试图改变像“efef:”或“exist?“它向我展示了这是信息。但为什么这里它不显示我,也doest改变当前的工作目录?
第二件怪事(Second Strange Thing)
当我将目录更改为“G:”时,由于某种原因,它可以正常工作。
#include<stdio.h>
#include<iostream>
#include<string>
#include <Windows.h>
using namespace std;
int main()
{
char my_current_path[1024];
string current_path(R"(G:)");
if (!SetCurrentDirectory(current_path.c_str()))
cout << "cant change to that directory.";
GetCurrentDirectory(1024, my_current_path);
std::cout << my_current_path << endl;
system("pause");
return 1;
}
代码编译后,显示我成功地将目录更改为“G:”。在更改到该路径后,我试图更改为“C:”(之前,没有做任何事情),现在它的工作!但奇怪的是,它不是移动到“C:\”,而是:
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE
奇怪的是,以前它不工作,现在当我在“G:”路径,并试图移动到“c:”再次,然后它移动到路径,我甚至不想!
3条答案
按热度按时间bmvo0sr51#
如果要指定驱动器上的根目录,则必须包含反斜杠,即
C:\
。您使用的语法
C:
具有不同的含义。命令shell将当前驱动器和每个驱动器上的当前目录的概念分开,以便您可以在驱动器之间快速切换,而不必每次都重新键入完整路径。这个特性是(很久以前)为了向后兼容性的原因而引入的(见下文),但实际上非常有用;高级用户有时会将多个驱动器号Map到同一驱动器或网络共享,以便特别利用该功能。虽然只有命令shell跟踪每个驱动器的当前目录,但Win32 API知道如何查找它们,并且每当您指定驱动器但没有路径时都会这样做。作为一种特殊情况,如果指定的驱动器是当前驱动器,它将扩展到实际的当前目录,而不是保存的当前目录。
因此,在您的示例中,不完整的路径
C:
被扩展到C驱动器的当前目录;由于当前目录已经在C盘上,因此SetCurrentDirectory(R"(C:)")
是一个空操作。如果你想切换到根目录,你应该使用SetCurrentDirectory(R"(C:\)")
。在您的测试中,没有保存
G:
驱动器的当前目录,并且它不是当前驱动器,因此效果是将当前目录设置为G:\
,即您获得了预期的行为,但不是预期的原因。如果您从命令shell启动了程序,并且为G驱动器保存了当前目录,那么您将在那里结束。同样的事情也适用于打开文件;
C:file.txt
将从C驱动器的当前目录打开file.txt
,而C:\file.txt
将从根目录打开file.txt
。请参阅Raymond Chen的博客文章Why does each drive have its own current directory?,以了解此功能的历史。
qlzsbp2j2#
您可以使用两个API来检索和设置当前目录:
GetCurrentDirectory()
和SetCurrentDirectory()
仅为后者提供有效路径:dsf9zpds3#
首先将驱动器更换为单F或G驱动器-示例:
然后给予完整路径-示例:
对我很有效。