2009-05-15 4 views
1

Это, кажется, очень странная проблема, которую я не могу понять для жизни меня. У меня есть путь (строка), который выглядит следующим образом:Проблема с проверкой конца строки

D: \ развитие \ PHP \ bchat \ чат \ index.php

мне нужно проверить, если файл в вопросе является PHP файл. Я считаю, что наиболее логичным способом является подстрока, начиная с. до конца строки и посмотреть, если это == .php

Так я пробовал:

bool isphp = (path.Substring(path.LastIndexOf('.')) == ".php") ? true : false; 

Это всегда возвращает ложь. Я подумал, что, может быть, в конце было конечное пространство, которое меня заворачивало, поэтому я поставил перед ним TrimEnd(). Но это ничего не изменило. Поэтому я пробовал это:

bool isphp = (path.EndsWith(".php") == true) ? true : false; 

Это также всегда возвращает false.

EDIT Теперь я также попытался это:

bool isphp = (Path.GetExtension(path) == ".php"); 

Но это также возвращает ложь.

+2

Пожалуйста, не проверяйте bool для значения bool, а затем выберите еще один bool. Просто сделайте bool isphp = php.EndsWith (". Php"); (если вы хотите использовать сравнение строк для этого, в противном случае см. ответы ниже) –

+1

Тривиальная точка, но (путь.EndsWith (". php") == true)? true: false; может быть сконденсирован в path.EndsWith (". Php"), который возвращает true или false. – spender

+0

Nitpickers выше, вы можете ясно видеть, что он тестировал, и поэтому изменил свой первый код, чтобы получить второй, поэтому была избыточность. –

ответ

3

Следующего код работает отлично на моей машине:

public static void Main() 
    { 
     string path = @"D:\development\php\bchat\chat\index.php"; 
     bool isPhp = path.EndsWith(".php"); 
     Console.WriteLine(isPhp); 
    } 

Так что я бы догадаться, есть что-то еще о вашей строке, заставляет его не работать. Возможно, это случайная вещь, и в этом случае добавьте StringComparison.InvariantCultureIgnoreCase к вашему EndsWith вызовите это.

public static void Main() 
    { 
     string path = @"D:\development\php\bchat\chat\index.pHp"; 
     bool isPhp = path.EndsWith(".php", StringComparison.OrdinalIgnoreCase); 
     Console.WriteLine(isPhp); 
    } 

Если это не работает, поставить точку останова на линии сравнения, а затем введите это в открывшееся окно:

path[path.Length-1] 

Вы должны получить это в результате:

112 'p' 

Если вы этого не сделаете, вы можете сказать, что ваш путь не заканчивается стандартным символом p.

+0

Лучше использовать StringComparison.OrdinalIgnoreCase, поскольку культура (даже инвариантная) не подходит для имен файлов. – Richard

+0

@ Рихард: Хорошо, я обновил код, чтобы включить это изменение. –

+0

Спасибо. По какой-то причине Trim() не удалял конечное пространство. так что я должен был взломать это –

8

Используйте класс Path. Он имеет метод GetExtension():

var path = @"D:\development\php\bchat\chat\index.php"; 
if(Path.GetExtension(path.ToUpperInvariant()) == ".PHP") 
{} 

EDIT: Добавлена ​​проверка для верхних/нижних кожухов

+0

Это также возвращает false –

+0

Код, который я отправил, всегда возвращает true - проверьте, действительно ли ваша строка содержит то, что вы отправили. Не забудьте проверить точку («.php»). Отлаживайте или распечатывайте расширение, которое оценивается методом GetExtension(), и проверяйте его. – tanascius

+1

Как указал Мартин - проверьте верхний и нижний регистр! – tanascius

2

Если существующий файл, который вы можете получить объект FileInfo для него и проверить удлиняющие таким образом:

FileInfo fi = new FileInfo(@"D:\development\php\bchat\chat\index.php"); 
if (fi.Exists && fi.Extension == ".php") 
{ 
    //Do something 
} 

Или я полагаю, вы могли бы быть овцой, следовать за толпой и использовать гораздо лучший метод Path.GetExtension, что все остальные предложили. Но сначала задайте себе этот вопрос: хотите ли вы сделать это самым чистым, быстрым и лучшим способом, или вы хотите утверждать свою индивидуальность и присоединиться ко мне по пути наибольшего сопротивления?

1

Используйте Path.GetExtension и сравнивайте его с типом файла, который вы ищете.

1

UPDATE:

Проверьте, что на самом деле возвращает path.Substring(path.LastIndexOf('.') - что может направить вас в правильном направлении.

+0

Действительно, решения, показанные в Q, должны работать (хотя и не лучшим образом). Поэтому переменная пути не ссылается на ожидаемое значение. – Richard

1

Убедитесь, что в верхнем и нижнем регистре нет разницы. Вы проверяете только строчные «php».

string ext = Path.GetExtension(path); 
bool isPhp = (ext.Equals(".php", StringComparison.InvariantCultureIgnoreCase)); 
2

Просто образец для публикуемого решения:

bool isphp = Path.GetExtension(path) 
       .Equals(".php", StringComparison.InvariantCultureIgnoreCase); 
+0

Все еще возвращает false. –

+0

Было бы еще лучше с StringComparison.OrdinalIgnoreCase. – Richard

1
private static bool IsPhp(string fileName) 
{ 
    return string.Compare(Path.GetExtension(fileName), ".php", 
     StringComparison.OrdinalIgnoreCase) == 0; 
} 
1

Я подозреваю, что в вашей строке есть что-то «странное». Я предлагаю вам дамп строки в деталях, как это:

foreach (char c in path) 
{ 
    Console.WriteLine("'{0}' U+{1:x4}", c, (int) c); 
} 

Таким образом, вы увидите, какие неожиданные символы, например unicode char 0s между «реальными» символами.

Смежные вопросы