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
根据 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
视为文件路径,当与其他路径组合时,它将丢失最后一个段。