File.Copy()或Directory.CreateDirectory()方法的路径变量中的额外斜杠

时间:2010-11-11 19:45:42

标签: c# .net file-io

当我使用一些System.IO方法,并且“意外地”在路径变量中添加额外的斜杠(\)时,似乎没有什么特别的事情发生。没有错误或警告,代码就好像只有适量的斜杠一样。

示例:

Directory.CreateDirectory(@"C:\Users\Public\Documents\\test");
File.Copy(@"C:\Users\Public\\Documents\test.txt", @"C:\Users\\Public\Documents\test\test.txt", true);

所以我想知道,如果上面的代码有时会有额外的斜杠,或者在任何情况下都不重要吗?

4 个答案:

答案 0 :(得分:1)

Windows似乎并不介意,但为什么不制作优雅的代码呢?

答案 1 :(得分:1)

我非常确定Windows在使用它之前“规范化”了路径结构。但是,为了安全起见,最好使用以下方法组合路径:

Path.Combine(string1, string2);

而不是连接两个字符串。

答案 2 :(得分:1)

Windows对此非常有弹性,还没有发现问题。

在这个帖子中查看the snippet。请注意_ACP_INCLUDE环境变量的值。你必须向右滚动才能看到:

  

C:\Program Files\Microsoft SDKs\Windows\v6.0A\\include;

Afaik,很多拥有VS2008的机器都有这条糟糕的道路,我的确如此。然而,当你解析路径字符串时,它当然可以绊倒你自己的代码。

答案 3 :(得分:0)

你应该知道的情况,

CreateFileW(L"D:\\1\\test.txt", GENERIC_READ, 0, 0, CREATE_NEW, 0, 0);
// A file has been created.

CreateFileW(L"D:\\1\\test.txt", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
// Of course, the file will be opened well.

CreateFileW(L"D:\\1\\\\test.txt", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
// It works well too. Windows subsystem does canonicalize that.

CreateFileW(L"\\\\?\\D:\\1\\\\test.txt", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
// '\\?\' prefix tell Windows "Don't touch my path, just send it to filesystem"
// So it will be failed.

http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#maxpath
我不知道.NET如何包装这个api。我猜Hans Passant可能对此很了解。 :)