gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:14:37 27 4
gpt4 key购买 nike

我注意到,当我使用 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(@'\') 将文件名与文件夹名分开。这似乎也有点粗略,但更好的方法超出了我的经验。

类似问题: Path.Combine absolute with relative path strings


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

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

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_paths

最佳答案

基于MSDN Documentation ,这是预期的行为。

If path2 does not include a root (for example, if path2 does not start with a separator character or a drive specification), the result is a concatenation of the two paths, with an intervening separator character. If path2 includes a root, path2 is returned.

分隔符在此 MSDN article 中讨论.

那么让我们看一下您的测试用例:

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 的行为符合预期,因为 \ 是一个分隔符,因此如前所述,它在没有第一个参数的情况下返回。

关于C#结合绝对路径和相对路径,Path.GetFullPath()不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35250295/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com