GVKun编程网logo

为什么 Path.Combine 不能正确连接以 Path.DirectorySeparatorChar 开头的文件名?

15

对于为什么Path.Combine不能正确连接以Path.DirectorySeparatorChar开头的文件名?感兴趣的读者,本文将会是一篇不错的选择,并为您提供关于delphi–PathDeli

对于为什么 Path.Combine 不能正确连接以 Path.DirectorySeparatorChar 开头的文件名?感兴趣的读者,本文将会是一篇不错的选择,并为您提供关于delphi – PathDelim VS DirectorySeparatorChar、DIRECTORY_SEPARATOR、DIRECTORY_SEPARATOR 和 PATH_SEPARATOR、DIRECTORY_SEPARATOR 目录分隔符常量的有用信息。

本文目录一览:

为什么 Path.Combine 不能正确连接以 Path.DirectorySeparatorChar 开头的文件名?

为什么 Path.Combine 不能正确连接以 Path.DirectorySeparatorChar 开头的文件名?

在 Visual Studio的 即时窗口中:

> Path.Combine(@"C:\x", "y")"C:\\x\\y"> Path.Combine(@"C:\x", @"\y")"\\y"

看来他们应该是一样的。

旧的 FileSystemObject.BuildPath() 不能这样工作......

答案1

小编典典

这是一个哲学问题(也许只有微软才能真正回答),因为它完全按照文档所说的那样做。

System.IO.Path.Combine

“如果 path2 包含绝对路径,则此方法返回 path2。”

这是来自
.NET
源代码的实际组合方法。您可以看到它调用了CombineNoChecks,然后它在
path2
上调用IsPathRooted并返回该路径(如果是):

public static String Combine(String path1, String path2) {    if (path1==null || path2==null)        throw new ArgumentNullException((path1==null) ? "path1" : "path2");    Contract.EndContractBlock();    CheckInvalidPathChars(path1);    CheckInvalidPathChars(path2);    return CombineNoChecks(path1, path2);}internal static string CombineNoChecks(string path1, string path2){    if (path2.Length == 0)        return path1;    if (path1.Length == 0)        return path2;    if (IsPathRooted(path2))        return path2;    char ch = path1[path1.Length - 1];    if (ch != DirectorySeparatorChar && ch != AltDirectorySeparatorChar &&            ch != VolumeSeparatorChar)         return path1 + DirectorySeparatorCharAsString + path2;    return path1 + path2;}

我不知道理由是什么。我想解决方案是从第二条路径的开头剥离(或修剪)DirectorySeparatorChar;也许编写您自己的组合方法,然后调用
Path.Combine()。

delphi – PathDelim VS DirectorySeparatorChar

delphi – PathDelim VS DirectorySeparatorChar

一个人可以使用

> System.IoUtils.TPath.DirectorySeparatorChar

http://docwiki.embarcadero.com/Libraries/Seattle/en/System.IOUtils.TPath.DirectorySeparatorChar

要么

> System.SysUtils.PathDelim

是否有任何特殊的差异,使用System.IoUtils.Tath中的另一个部分的好处是更面向对象的接口?

http://docwiki.embarcadero.com/Libraries/Seattle/en/System.SysUtils

解决方法

System.SysUtils.PathDelim是在Delphi 6 / Kylix 1中引入的,作为一种能够编写与平台无关的代码的方法.最初的Delphi Linux编译器Kylix的引入意味着Delphi代码首次在* nix平台上执行,以及Windows的原始目标.

System.IoUtils.TPath.DirectorySeparatorChar是最近推出的IoUtils单元的一部分,用于支持当前的跨平台工具浪潮,它支持MacOS,iOS,Android,并将很快再次包含Linux.

如果您可以在System.SysUtils和System.IoUtils之间进行选择,通常需要使用后者. System.IoUtils是用于文件系统支持的跨平台单元.也就是说,您通常不会直接使用DirectorySeparatorChar,而是使用System.IoUtils.TPath.Combine等方法.

DIRECTORY_SEPARATOR

DIRECTORY_SEPARATOR

DIRECTORY_SEPARATOR

  • 系统目录分隔符。

  • 在 Windows 中,斜线 “/” 和反斜线 “\” 都可以用作目录分隔符,在 linux 上路径的分隔符是斜线 “/”。

  • 若在 windows 上习惯性的使用反斜线 “\” 作为文件分隔符,则在 linux 服务器上运行时就会报错。

  • 例如:

// 错误的写法
define(''UPLOAD_PATH'', dirname(__FILE__).''\upload'');
// 正确的写法
define(''UPLOAD_PATH'', dirname(__FILE__).DIRECTORY_SEPARATOR.''upload'');

DIRECTORY_SEPARATOR 和 PATH_SEPARATOR

DIRECTORY_SEPARATOR 和 PATH_SEPARATOR

DIRECTORY_SEParaTOR:目录分隔符,linux上就是’/’    windows上是’\’

PATH_SEParaTOR:路径分隔符,include多个路径使用,在win下,当你要include多个路径的话,你要用”;”隔开,但在linux下就使用”:”隔开的。

=================================================

PHP

 

araTOR . './application/models/'

araTOR . './application/lib/'

araTOR . get_include_path());

 

一个常量,在Linux系统中是一个" : "号,Windows上是一个" ; "号。所以编写程序时最好用常量 PATH_SEParaTOR 代替,否则如果系统从linux移植到win系统或反过来移植会出错!

get_include_path取得当前已有的环境变量,加上前面的设置就是新的系统include

=================================================

<h3>请教PHP中的set_include_path()函数
<div>
<font color="#e50000">悬赏分:0 - 解决时间: 2009年10月18日 20时13分

DIRECTORY_SEPARATOR 目录分隔符常量

DIRECTORY_SEPARATOR 目录分隔符常量

DIRECTORY_SEPARATOR 是 PHP 内部常量,表示目录路径分隔符

在 windows 环境下目录分隔符为 ''\''  ,在 linux  环境下目录分隔符为 ''/'' ,

例如:我们要获取网站根目录

define(''ROOT'', dirname(__FILE__).DIRECTORY_SEPARATOR);

这样 ROOT 常量在 Windows 环境下和 Linux 环境下都可以使用。

 

我们今天的关于为什么 Path.Combine 不能正确连接以 Path.DirectorySeparatorChar 开头的文件名?的分享已经告一段落,感谢您的关注,如果您想了解更多关于delphi – PathDelim VS DirectorySeparatorChar、DIRECTORY_SEPARATOR、DIRECTORY_SEPARATOR 和 PATH_SEPARATOR、DIRECTORY_SEPARATOR 目录分隔符常量的相关信息,请在本站查询。

本文标签: