Windows 路径中的多个反斜杠会产生什么后果(如果有)?

问题描述 投票:0回答:2

在我的程序中,我经常在 app.config 文件中配置文件名和/或路径。这通常是这样的:

<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\\\
在实践中也是有效的。

我的问题是,这样的路径会产生什么后果(如果有的话)?我不想在生产代码中使用这个“功能”,如果它是未记录的东西并且可能会在未来某个时候随着 Windows 新版本的发布而被破坏。

c# windows command-prompt
2个回答
3
投票

据我所知,没有任何后果,并且在未来的版本中不太可能被破坏,因为很多人都会做和你一样的事情。

但是,在 C# 中组合路径的正确方法是使用

Path.Combine
,这将为您删除任何多余的反斜杠:

var logFile = Path.Combine(
    ConfigurationManager.AppSettings["LogFileDirectory"],
    ConfigurationManager.AppSettings["SaveLogFileTo"]);

0
投票

至少有这些后果:

如果在驱动器号和冒号后提供两个反斜杠,del 命令无法删除文件:

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.

我的意思是,根据我的实验,“del”命令中内置的 cmd.exe 有一个错误,它会尝试访问网络共享。

这个bug实际上很危险。 del 命令认为

c:\\bar\foo\zap.txt
意味着
\\bar\foo\zap.txt
并且如果确实存在一个服务器“bar”,其共享“foo”包含文件“zap.txt”,则如果您指的是本地文件,则会删除不正确的文件
 c:\bar\foo\zap.txt
代替。

我不知道其他命令也会有这样的行为。例如,内置类型和复制命令会忽略重复的反斜杠并引用本地文件。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.