C++ 获取文件c+的目录+;

C++ 获取文件c+的目录+;,c++,C++,我正在编写一个文件管理器类,该类有一个名为“dir”的属性,它保存打开的文件的目录 因此,以下面的代码为例 File f("test.txt"); 然后f.dir=“C:\…\current\u directory\test.txt”,我只需将工作目录附加到给定字符串的开头即可。然而,使用这种方法可以举这个例子 File f("C:\...\Desktop\cool.txt"); 这里f.dir=“C:\…\current\u directory\C:\…\Desktop\test.txt”

我正在编写一个文件管理器类,该类有一个名为“dir”的属性,它保存打开的文件的目录

因此,以下面的代码为例

File f("test.txt");
然后
f.dir=“C:\…\current\u directory\test.txt”,我只需将工作目录附加到给定字符串的开头即可。然而,使用这种方法可以举这个例子

File f("C:\...\Desktop\cool.txt");
这里
f.dir=“C:\…\current\u directory\C:\…\Desktop\test.txt”

因此,如果他们给出了一个直接地址,而我准备了工作目录,这将是错误的


所以问题是,我如何确定他们发送的是绝对地址还是间接地址?

目录在标准C++11中不存在(并且符合C++11的实现可以不存在任何目录)。未来的C++标准可能会有一些与文件系统相关的东西,例如页眉。 POSIX具有和

也许您的Windows操作系统有一些特定于操作系统的API

你可以使用或。所有这些都提供了一些API包装目录和文件系统


AFAIK当前目录的概念是特定于操作系统的,在Windows和POSIX中是不同的(POSIX具有进程的当前工作目录,带有)。IIRC MS-DOS(也可能是Windows)在每个驱动器上都有一个当前目录。

不直接回答您的问题,但这可能会对您有所帮助。我不知道你工作的目的是什么(玩弄一些代码、学术、企业等),也不知道你可能有什么限制。但要考虑到这一点,这使得这项任务非常容易。

正如其他答案所述,最好找到一个外部库来完成这项任务;不过,尽管如此,看起来您正在Windows上工作。有一个Windows API调用,它将相对路径解析为完整路径并保留完整路径:
GetFullPathName
(请参阅)

#包括
#包括
int main(){
德沃德·雷特;
char-buf[1024];
ret=GetFullPathName(“test.cpp”,1024,buf,NULL);
if(ret)printf(“%s\n”,buf);
ret=GetFullPathName(“C:\\path\\to\\test.cpp”,1024,buf,NULL);
if(ret)printf(“%s\n”,buf);
}

除了驱动器号之后,在路径中的任何位置都找不到冒号“:”。如果是绝对值,请查看字符2

您还必须查找前缀为“\\”的路径才能获得UNC路径


注意你是如何得到工作目录的。明显的argv[0]并不总是有效

这是对OP问题的回答吗?他只是说有更好的替代方案,OP不需要重新发明轮子…
realpath
用于追踪符号链接和规范化
foo//bar
之类的东西。POSIX
dirname(3)
执行OP想要的操作(语义恶劣:可能修改输入字符串,或者可能返回指向静态缓冲区的指针)。测试文件名是否包含\您将知道他们提供了一个文件名,您可以添加您的路径,如果它包含\则它是一个直接地址“\c”与“c”相同。请确保使用“c:\\…\\Desktop\\cool.txt”,否则这会在Windows上对您造成伤害。
#include <stdio.h>
#include <windows.h>

int main() {
    DWORD ret;
    char buf[1024];
    ret = GetFullPathName("test.cpp", 1024, buf, NULL);
    if (ret) printf("%s\n", buf);
    ret = GetFullPathName("C:\\path\\to\\test.cpp", 1024, buf, NULL);
    if (ret) printf("%s\n", buf);
}