c++ CPP中的“SetCurrentDirectory”(“windows.h”)中存在一些不好的理解

xriantvc  于 2023-05-24  发布在  Windows
关注(0)|答案(3)|浏览(177)

我不知道这里发生了什么。下面是代码示例:

#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:”再次,然后它移动到路径,我甚至不想!

bmvo0sr5

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?,以了解此功能的历史。

qlzsbp2j

qlzsbp2j2#

您可以使用两个API来检索和设置当前目录:GetCurrentDirectory()SetCurrentDirectory()仅为后者提供有效路径:

#include <iostream>
#include <windows.h>
using namespace std;

int main()
{
    char czCurDir[MAX_PATH] = "";
    char czNewDir[MAX_PATH] = "";

    // retrieve the current directory
    GetCurrentDirectory(MAX_PATH, czCurDir);
    cout << "Current directory: " << czCurDir << endl;// C:\Users\Raindrop7\Desktop\New folder

    // set the value for the new directory NB: C:\\ not C:\ because the first backslah is an escape character
    strcpy(czNewDir, "C:\\");

    // set the current directory to "C:\"  
    SetCurrentDirectory(czNewDir);

    // retrieve the current directory
    GetCurrentDirectory(MAX_PATH, czCurDir);

    cout << "current directory: " << czCurDir << endl;// C:\ 

    return 0;
}
dsf9zpds

dsf9zpds3#

首先将驱动器更换为单F或G驱动器-示例:

if( !SetCurrentDirectory("F:") )
{
    cout <<"can't open the directory"<< endl;
}

然后给予完整路径-示例:

if(!SetCurrentDirectory("F://Python_Django_Webdevelopment//StudentManagement"))
{
    cout <<"can't open the directory"<< endl;
}

对我很有效。

相关问题