Проблема с проверкой конца строки - PullRequest
1 голос
/ 15 мая 2009

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

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");

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

Ответы [ 10 ]

8 голосов
/ 15 мая 2009

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

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

РЕДАКТИРОВАТЬ: добавлена ​​проверка прописных / строчных букв

3 голосов
/ 15 мая 2009

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

    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.

2 голосов
/ 15 мая 2009

Просто пример для размещенного решения:

bool isphp = Path.GetExtension(path)
                 .Equals(".php", StringComparison.InvariantCultureIgnoreCase);
2 голосов
/ 15 мая 2009

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

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

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

1 голос
/ 15 мая 2009

Я подозреваю, что в вашей строке есть что-то "странное". Я предлагаю вам выкинуть вашу строку подробно, например так:

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

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

1 голос
/ 15 мая 2009
private static bool IsPhp(string fileName)
{
    return string.Compare(Path.GetExtension(fileName), ".php",
        StringComparison.OrdinalIgnoreCase) == 0;
}
1 голос
/ 15 мая 2009

Убедитесь, что нет разницы в верхнем / нижнем регистре. Вы тестируете только строчные буквы "php".

string ext = Path.GetExtension(path);
bool isPhp = (ext.Equals(".php", StringComparison.InvariantCultureIgnoreCase));
1 голос
/ 15 мая 2009

UPDATE:

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

1 голос
/ 15 мая 2009

А как насчет Path.GetExtension метод?

1 голос
/ 15 мая 2009

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

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