2009-11-07 1 views
3

Учитывая строку, которая относится к каталогу, как я могу убедиться, что есть символ закрытия \? Например, C:\foo - это каталог, а также C:\foo\. Есть ли способ System.IO.Path, который гарантирует, что есть окончание \?. NET: System.IO.Path

+0

Помните, что «/» также является допустимым разделителем в Windows (ну, кроме 'cmd.exe' и' command.com'). – Richard

ответ

0

Hay, что об использовании этого условия

if (s.IndexOf('\\') == s.Length - 1)

где s это ваш путь строка "амр \" даст истинный "АСКУЭ" даст ложные

+0

Это будет работать для всех случаев, кроме строки нулевой длины. –

+0

IndexOf дает первый пример искомой строки, скорее всего, после диска. – Wilhelm

+1

Вы должны использовать s.EndsWith или s.LastIndexOf. Но EndsWith будет работать с нулевыми строками. – Majkel

5
if (!filename.EndsWith(Path.DirectorySeparatorChar)) 
    filename += Path.DirectorySeparatorChar; 
+2

Возможно, вы также захотите проверить на Path.AltDirectorySeparatorChar – Joe

3

Предположительно вы хотите для добавления разделителя, чтобы впоследствии можно было добавлять имена файлов, используя конкатенацию строк.

В этом случае первоначальный совет Кайла Розендо звучит: подумайте, действительно ли вам нужно это делать. Если вы всегда добавляете имена файлов, используя Path.Combine, вам не нужно заботиться о том, имеет ли ваш путь трейлинг-разделитель.

Если вы все еще хотите это сделать, у вас есть краевой кейс для рассмотрения. Путь «D:» - это допустимый относительный путь, который ссылается на текущий рабочий каталог на диске D :. Добавление разделителя изменит это значение на ссылку на корневой каталог на диске D :. Вы действительно этого хотите? Я предполагаю, что нет. Так что я бы особый случай это так:

public static string AppendSeparator(string path) 
{ 
    if (path == null) throw new ArgumentNullException("path"); 
    if (path.Length == 0) return path; 
    if (path[path.Length - 1] == Path.VolumeSeparatorChar) return path; 
    if (path[path.Length - 1] == Path.DirectorySeparatorChar) return path; 
    if (path[path.Length - 1] == Path.AltDirectorySeparatorChar) return path; 
    return path + Path.DirectorySeparatorChar; 
} 

Вы можете использовать это следующим образом - последний пример преобразует входной путь к абсолютному пути перед добавлением сепаратора:

path = AppendSeparator(@"C:\SomePath\"); 
path = AppendSeparator(@"C:\SomePath"); 
path = AppendSeparator(@"D:"); 
path = AppendSeparator(Path.GetFullPath("D:")); 
Смежные вопросы