Windows 路径中的多个反斜杠会产生什么后果(如果有的话)?
What are the consequences, if any, of multiple backslashes in Windows paths?
在我的程序中,我经常在 app.config 文件中配置文件名 and/or 路径。这通常是这样的:
<add key="LogFileDirectory" value="C:\Logs" />
<add key="SaveLogFileTo" value="MyLogFile.txt" />
在我的实际应用程序代码中,我会经常将这些与类似的代码连接在一起:
var logFile = ConfigurationManager.AppSettings["LogFileDirectory"]
+ @"\" +
ConfigurationManager.AppSettings["SaveLogFileTo"];
现在,上述代码的结果将给出 C:\Logs\MyLogFile.txt
的日志文件路径,但是,如果最终用户在配置文件中将日志文件目录指定为 C:\Logs\
尾随反斜杠,我的代码导致 C:\Logs\MyLogFile.txt
的实际路径,在目录和文件之间有一个双反斜杠。
根据我的经验,这在实践中效果很好。事实上,即使进入命令提示符并执行 cd c:\\\windows\\
在实践中也能奏效。
我的问题是,如果有这样的路径,后果是什么?我不想在生产代码中使用这个 "feature" 如果它是未记录的并且在将来某个时候可能会随着 Windows.[=17= 的新版本被破坏]
据我所知没有任何后果,而且在未来的版本中也不太可能被破坏,因为很多人会和你做同样的事情。
但是,在 C# 中合并路径的正确方法是使用 Path.Combine
,这将为您删除任何额外的反斜杠:
var logFile = Path.Combine(
ConfigurationManager.AppSettings["LogFileDirectory"],
ConfigurationManager.AppSettings["SaveLogFileTo"]);
至少这个:
C:\>del c:\foo.txt
The filename, directory name, or volume label syntax is incorrect.
C:\>del c:\bar\foo.txt
The network path was not found.
在我的程序中,我经常在 app.config 文件中配置文件名 and/or 路径。这通常是这样的:
<add key="LogFileDirectory" value="C:\Logs" />
<add key="SaveLogFileTo" value="MyLogFile.txt" />
在我的实际应用程序代码中,我会经常将这些与类似的代码连接在一起:
var logFile = ConfigurationManager.AppSettings["LogFileDirectory"]
+ @"\" +
ConfigurationManager.AppSettings["SaveLogFileTo"];
现在,上述代码的结果将给出 C:\Logs\MyLogFile.txt
的日志文件路径,但是,如果最终用户在配置文件中将日志文件目录指定为 C:\Logs\
尾随反斜杠,我的代码导致 C:\Logs\MyLogFile.txt
的实际路径,在目录和文件之间有一个双反斜杠。
根据我的经验,这在实践中效果很好。事实上,即使进入命令提示符并执行 cd c:\\\windows\\
在实践中也能奏效。
我的问题是,如果有这样的路径,后果是什么?我不想在生产代码中使用这个 "feature" 如果它是未记录的并且在将来某个时候可能会随着 Windows.[=17= 的新版本被破坏]
据我所知没有任何后果,而且在未来的版本中也不太可能被破坏,因为很多人会和你做同样的事情。
但是,在 C# 中合并路径的正确方法是使用 Path.Combine
,这将为您删除任何额外的反斜杠:
var logFile = Path.Combine(
ConfigurationManager.AppSettings["LogFileDirectory"],
ConfigurationManager.AppSettings["SaveLogFileTo"]);
至少这个:
C:\>del c:\foo.txt
The filename, directory name, or volume label syntax is incorrect.
C:\>del c:\bar\foo.txt
The network path was not found.