使用服务器文件的路径时,何时需要使用后退或正斜杠(单或双)?

关于以下代码示例:

string baseLocation = HttpContext.Current.Server.MapPath("/"); const string templateName = @"//temp//ExportTemplate.xlsx"; const string generatedLocation = @"{0}//temp//{1}"; var fileName = string.Format("Export-{0}.xlsx", DateTime.Now.Date.ToString("yyyy-MM-dd")); var newFile = String.Format(generatedLocation, baseLocation, fileName); File.Copy(baseLocation + templateName, newFile, true); 

我们在生产服务器和本地开发环境(通过IIS中的站点)上使用它。 两者都运行IIS 7.5。 代码在生产中正常工作,但在本地开发中抛出错误:

 Access to the path 'C:\Path\To\Site\//temp//Export-2013-01-29.xlsx' is denied. 

该文件是在本地dev上正确创建/复制的,但由于路径中的斜杠不正确,我猜这是错误的。 应用程序池标识具有对“temp”文件夹的完全访问权限。

这提出了几个问题:

  • 在这种情况下,’//’对路径做了什么? 我理解’\’是逃避反斜杠的方法,但’//’没有意义。
  • 两个环境的配置是否存在差异,这使得生成的路径在生产服务器上正常工作但在本地开发中失败?

代码应该使用\,而不是/用于文件路径。 或

 const string templateName = @"\temp\ExportTemplate.xlsx"; 

要么

 const string templateName = "\\temp\\ExportTemplate.xlsx"; 

会工作得很好。 令人惊讶的是当前版本的代码在生产中工作,这可能是因为构建的窗口允许在文件路径中使用正斜杠或反斜杠。 (这可以追溯到DOS时代,当时许多用户也是UNIX用户)

另外,我建议使用Path.Combine而不是仅仅连接文件路径的字符串(这将有助于避免在“C:\ Path \ To \ Site \\ temp \ Export”等路径中获取额外的斜杠或正斜杠-2013-01-29.xlsx“)。 例如:

 File.Copy(Path.Combine(baseLocation, templateName), newFile, true); 

//将始终为您提供// …在字符串处使用@,它是一个逐字字符串文字,您不需要转义字符。 因此你可以用\来获取。 如果删除@,则需要使用\来获取。 使用文件路径时,它始终是反斜杠()。 使用URL路径时,它始终是正斜杠(/)