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++中 如何 把绝对路径 转换成 相对路径 ,求实现的主要内容,如果未能解决你的问题,请参考以下文章