Дополнительные косые черты в переменной пути методов File.Copy () или Directory.CreateDirectory () - PullRequest
1 голос
/ 11 ноября 2010

Когда я использую некоторые 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 ]

1 голос
/ 11 ноября 2010

Я почти уверен, что Windows "нормализует" структуру пути перед его использованием.Однако для безопасности лучше объединять пути, используя:

Path.Combine(string1, string2);

вместо объединения двух строк.

1 голос
/ 11 ноября 2010

Windows достаточно устойчива к этому, еще не заметила проблем.

Взгляните на фрагмент в этой теме.Обратите внимание на значение переменной среды _ACP_INCLUDE.Вы должны прокрутить вправо, чтобы увидеть:

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

Afaik, многие машины с VS2008 имеют этот неверный путь, моя, конечно, делает.Тем не менее, он, безусловно, может сбить с толку ваш собственный код при разборе строк пути.

1 голос
/ 11 ноября 2010

Windows, похоже, не возражает, но почему бы не сделать элегантный код?

0 голосов
/ 12 ноября 2010

Случай, который вы должны знать,

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.Я думаю, Ганс Пассант мог бы хорошо знать об этом.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...