C# 组合绝对路径和相对路径,Path.GetFullPath() 不一致

本文关键字:路径 GetFullPath Path 不一致 相对 组合 | 更新日期: 2023-09-27 18:33:36

我注意到当我使用 Path.GetFullPath(Path.Combine(@"c:''folder''","''subfolder''file.txt"((时,它返回一个路径 c:''subfolder''file.txt,而不是预期的组合路径 c:''folder''subfolder''file.txt。这些方法似乎无法处理第二个组合输入上的"''"。有没有人遇到过这个问题并找到了更好的合并路径解决方案?

var test1 = Path.GetFullPath(Path.Combine(@"C:'users'dev'desktop'testfiles'", @".'test1.txt"));
var test2 = Path.GetFullPath(Path.Combine(@"C:'users'dev'desktop'testfiles'", @"'test2.txt"));//
var test3 = Path.GetFullPath(Path.Combine(@"C: 'users'dev'desktop'testfiles'", @"test3.txt"));
var test4 = Path.GetFullPath(Path.Combine(@"C:'users'dev'desktop'testfiles'",@".'XXX'test4.txt"));
var test5 = Path.GetFullPath(Path.Combine(@"C:'users'dev'desktop'testfiles'", @"'XXX'test5.txt"));//
var test6 = Path.GetFullPath(Path.Combine(@"C:'users'dev'desktop'testfiles'", @"XXX'test6.txt"));
var test7 = Path.GetFullPath(Path.Combine(@"C:'users'dev'desktop'testfiles'", @"'somefile'that'doesnt'exist.txt"));//

结果在

test1 is "C:'users'dev'desktop'testfiles'test1.txt"
test2 is wrong "'test2.txt"
test3 is "C: 'users'dev'desktop'testfiles'test3.txt"
test4 is "C:'users'dev'desktop'testfiles'XXX'test4.txt"
test5 is wrong "c:'XXX'test5.txt"
test6 is "C:'users'dev'desktop'testfiles'XXX'test6.txt"
test7 is wrong "c:'somefile'that'doesnt'exist.txt"

基本上,我正在做的是将源路径与文本文件中的单个文件路径相结合,以便我可以将这些文件复制到目标,并且我想维护子文件夹层次结构。

例如,文件列表相同但想要引用特定源文件夹版本的常见情况。

source path + individual file path
''myserver'project'1.x + 'dll'important.dll

应以相同的方式复制到目标

c:'myproject' + 'dll'important.dll

所以会有变量;源,目标,文件[数组或列表]

我目前的前进方向是使用 String.TRIM(( 方法删除特殊字符。 ''/在将路径与 Path.Combine、Path.GetFullPath 组合之前。但我想也许有人已经意识到了类似情况的更好方法。

在目标中创建子文件夹也很痛苦,基本上是使用 String.LastIndexOf(@''''( 将文件名与文件夹名称分开。这似乎也有点粗略,但更好的方法超出了我的经验。

类似的问题:路径。将绝对路径字符串与相对路径字符串组合在一起


感谢反馈,我现在知道 ''file.txt 被认为是完全限定的(绝对(路径,这就是组合方法以这种方式工作的原因。

如果文件名不以下列项之一开头,则相对于当前目录

A UNC name of any format, which always start with two backslash characters ("''"). For more information, see the next section.
A disk designator with a backslash, for example "C:'" or "d:'".
A single backslash, for example, "'directory" or "'file.txt". This is also referred to as an absolute path.

https://msdn.microsoft.com/en-nz/library/windows/desktop/aa365247(v=vs.85(.aspx#fully_qualified_vs._relative_path

C# 组合绝对路径和相对路径,Path.GetFullPath() 不一致

根据 MSDN 文档,这是预期行为。

如果 path2

不包含根(例如,如果 path2 未启动 带有分隔符或驱动器规格(,结果是 两条路径的串联,中间有一个分隔符 字符。如果路径 2 包含根,则返回路径 2。

分隔符字符将在此 MSDN 文章中讨论。

因此,让我们看一下您的测试用例:

var test1 = Path.GetFullPath(Path.Combine(@"C:'users'dev'desktop'testfiles'", @".'test1.txt"));
var test2 = Path.GetFullPath(Path.Combine(@"C:'users'dev'desktop'testfiles'", @"'test2.txt"));

Test1 的行为正确,因为它将.作为有效文件路径的一部分,并将其与第一个参数结合使用以生成组合路径。

Test2 的行为符合预期,因为'是分隔符,因此如前所述,返回时没有第一个参数。

没有

您喜欢在 .Net 框架中使用的函数 - 修剪路径或确保相对路径以".''"开头,您的真正选项(可能存在于某处的库(。


为什么代码的行为方式不符合你喜欢的方式(不是"错误",只是没有达到你意想不到的期望(。

Combine需要决定左路径的哪一部分将保留,哪些将被替换。它使用常规文件系统约定来确定("."、".."、"''"对文件路径具有特殊含义(

路径开头的含义:

  • @"'" or"/" - 从当前设备的根目录开始 - 这涵盖了您不喜欢的大多数情况
  • @".'" - 表示来自当前目录(因此在组合和规范化后,它将完全按照您想要的方式运行(
  • '@"..''"(可能有多个"向上"( - 向上一个文件夹 - 这是您可能不同意的另一种情况。
  • 任何未'/'或未@'''的字符 - 当前文件夹中的文件名或路径

另请注意,除"/"@"'"以外的任何路径都由Path.Combine视为文件路径,当与其他路径组合时,它将丢失最后一个段。