qt 或c/c++中 如何 把绝对路径 转换成 相对路径 ,求实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qt 或c/c++中 如何 把绝对路径 转换成 相对路径 ,求实现相关的知识,希望对你有一定的参考价值。

如题

方法如下:

代码:

#include <direct.h>
#include <stdlib.h>
#include <stdio.h>

int main( void )

char* buffer;
if( (buffer = _getcwd( NULL, 0 )) == NULL )
perror( "_getcwd error" );
else
printf( "Current Dir: %s /n", buffer);
free(buffer);



调用 _getcwd 来获得当前的工作目录。
可以在终端或cmd中切换到其他目录,通过绝对路径来调用这个程序,来观察输出。
如果在linux下,可以创建启动器,然后启动器中可以设置工作目录。
如果在windows下,可以为其创建快捷方式,快捷方式属性中可以设置/修改工作目录。
参考技术A #include <string>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])

string relPath;//相对路径
string path("D:\\\\Program Files\\\\Tencent\\\\1.txt");//绝对路径
string curPath("D:\\\\Program Files");//当前目录

//cin >> path >> curPath;

int iRes = path.find(curPath);
if (iRes == path.npos)
//查找失败
cout << "路径有误!\\n";
return 1;

else relPath = path.substr(iRes + curPath.length(), path.length() - curPath.length() - iRes);
cout << relPath << endl;

return 0;

参考技术B 搜下:PathRelativePathTo 参考技术C http://www.oschina.net/question/234345_52670

如何在 .NET 中获得绝对或规范化的文件路径?

【中文标题】如何在 .NET 中获得绝对或规范化的文件路径?【英文标题】:How can one get an absolute or normalized file path in .NET? 【发布时间】:2010-11-18 23:54:05 【问题描述】:

如何以最小的努力(如果可能,使用一些现有的设施)将c:\aaa\bbb\..\ccc 之类的路径转换为c:\aaa\ccc

【问题讨论】:

【参考方案1】:

Path.GetFullPath 或许?

【讨论】:

我不相信这可以保证返回一个规范的名称。它只保证返回的名称可以用于绝对引用文件和相对引用文件 Path.GetFullPath(@"c:\aaa\bbb\..\ccc") = c:\aaa\ccc - 对我来说已经足够了。 @Henk:Path utils 实际上不应该检查有效文件,甚至不应该触及文件系统(但在少数情况下会这样做)。 @My-Name-Is:这完全取决于你如何使用它。 @My-Name-Is:这就是 GetFullPath 应该做的。注意 Path.GetFullPath(@"\..\aaa") 返回废话 "C:\..\aaa" 而 Path.GetFullPath(@"..\aaa") 返回相对于您的绝对路径 Path.CurrentDirectory( )【参考方案2】:

规范化是 .NET 中 Uri 类的主要职责之一。

var path = @"c:\aaa\bbb\..\ccc";
var canonicalPath = new Uri(path).LocalPath; // c:\aaa\ccc

【讨论】:

所以我假设这会检查路径是否确实存在? 不,Uri 类只负责生成路径。不考虑与这些路径相关的系统。通过我的答案中的方法获得路径后,您仍然需要通过 File 类(或其他)检查它是否存在。 请注意,驱动器字母大小写仍然无法正常化(例如,“C:\”和“c:\”都没有改变)。因此,无论如何,从独特的意义上说,这并不是真正的“规范”。 @AlastairMaw 由于 Windows FS 是 CI,假设路径是“规范的”,那么任何其他路径不同,仅大小写是规范和等效的即使有大小写差异.消费者还应该使用 CI 字符串比较,因为所有大小写不同的形式相同。【参考方案3】:

我会这样写:

public static string NormalizePath(string path)

    return Path.GetFullPath(new Uri(path).LocalPath)
               .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
               .ToUpperInvariant();

这应该可以处理一些场景,例如

    uri 和其中潜在的转义字符,例如

    file:///C:/Test%20Project.exe -> C:\TEST PROJECT.EXE

    由点指定的路径段表示当前或父目录

    c:\aaa\bbb\..\ccc -> C:\AAA\CCC

    波浪号缩短(长)路径

    C:\Progra~1\ -> C:\程序文件

    目录分隔符不一致

    C:/Documents\abc.txt -> C:\DOCUMENTS\ABC.TXT

除此之外,它可以忽略大小写,尾随\目录分隔符等。

【讨论】:

良好而简洁的路径规范化解决方案,正是我想要的。 +1 不要将 ToUpper() 和朋友用于您想要可移植的任何代码。世界上有区分大小写的文件系统。此外,如果您向用户显示这些值也不是很好,在这种情况下,您希望保留大小写并使用不区分大小写的排序和比较。否则,看起来不错。 这完全取决于您所说的“规范”是什么意思,但是,由于 Windows 将文件路径视为不区分大小写,我认为您 确实 需要大小写转换,否则它是同一个文件可能有多个“规范”路径。不过我更喜欢小写。 它不适用于相对路径。这样做: private string NormalizePath(string path) return path.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar) .ToUpperInvariant(); @Andy:另一方面,如果有人使用NormalizePath 的这种变体将文件复制或移动到某个地方,她/他很可能希望大小写不会改变。作为用户,我会禁止任何更改我精心维护的家庭命名系统的此类程序。【参考方案4】:

FileInfo 对象也可以在这里提供帮助。 (https://docs.microsoft.com/en-us/dotnet/api/system.io.fileinfo?view=net-5.0)

var x = Path.Combine(@"C:\temp", "..\\def/abc");
var y = new FileInfo(x).FullName; // "C:\\def\\abc"

如果您想控制文件与目录的区别,FileInfo 与 DirectoryInfo 也有帮助。

但如果只需要字符串,Path.GetFullPath 会更好。

【讨论】:

以上是关于qt 或c/c++中 如何 把绝对路径 转换成 相对路径 ,求实现的主要内容,如果未能解决你的问题,请参考以下文章

vc中已知文件的绝对路径怎么获得文件名和所在文件夹啊

Vue Router 相对路径转绝对路径

PHP绝对路径的问题

QT如何修改编译后产生的可执行文件的路径》

在VC中头文件的问题

如何编译C/Fortran动态/静态链接库