对于为什么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 开头的文件名?
- delphi – PathDelim VS DirectorySeparatorChar
- DIRECTORY_SEPARATOR
- DIRECTORY_SEPARATOR 和 PATH_SEPARATOR
- DIRECTORY_SEPARATOR 目录分隔符常量
为什么 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
> 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.IoUtils.TPath.DirectorySeparatorChar是最近推出的IoUtils单元的一部分,用于支持当前的跨平台工具浪潮,它支持MacOS,iOS,Android,并将很快再次包含Linux.
如果您可以在System.SysUtils和System.IoUtils之间进行选择,通常需要使用后者. System.IoUtils是用于文件系统支持的跨平台单元.也就是说,您通常不会直接使用DirectorySeparatorChar,而是使用System.IoUtils.TPath.Combine等方法.
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:目录分隔符,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 是 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 目录分隔符常量的相关信息,请在本站查询。
本文标签: