代码之家  ›  专栏  ›  技术社区  ›  The.Anti.9

检查字符串结尾时出现问题

  •  1
  • The.Anti.9  · 技术社区  · 16 年前

    这似乎是一个非常奇怪的问题,我一生都无法解决。我有一个如下所示的路径(字符串):

    D:\development\php\bchat\chat\index.php

    我需要检查这个文件是否是PHP文件。我认为最合乎逻辑的方法是从。到字符串的末尾,查看它是否==.php

    所以我试着:

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

    这总是返回false。我想可能是尾部有一个拖尾空间把我搞砸了,所以我在它前面的路径上放了一个TrimEnd()。但这并没有改变任何事情。所以我试了一下:

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

    这也总是返回false。

    我现在也试过:

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

    但这也返回了false。

    10 回复  |  直到 16 年前
        1
  •  8
  •   tanascius    16 年前

    使用Path类。它有一个GetExtension()方法:

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

    编辑:增加了对大写/小写的检查

        2
  •  3
  •   Martin Brown    16 年前

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

    所以我猜你的字符串还有其他原因导致它不能工作。也许这是一个case事件,在这种情况下,可以通过如下调用将StringComparison.InvariantCultureInogoreCase添加到您的Ends。

        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字符结束。

        3
  •  2
  •   VVS    16 年前

    仅提供已发布解决方案的示例:

    bool isphp = Path.GetExtension(path)
                     .Equals(".php", StringComparison.InvariantCultureIgnoreCase);
    
        4
  •  2
  •   Martin Brown    16 年前

    如果该文件是现有文件,则可以获取该文件的FileInfo对象,并通过这种方式检查扩展名:

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

    或者我想你可以是一只羊,跟随人群,使用其他人建议的更好的Path.GetExtension方法。但是先问问你自己这个问题——你是想用最干净、最快、最好的方式来做这件事,还是想展现你的个性,和我一起走上阻力最大的道路?

        5
  •  1
  •   Brian Rasmussen    16 年前

    使用Path.GetExtension并与要查找的文件类型进行比较。

        6
  •  1
  •   Kamarey    16 年前

    那么...怎么样 Path.GetExtension 方法

        7
  •  1
  •   M4N    16 年前

    确保大小写没有区别。您只测试小写的“php”。

    string ext = Path.GetExtension(path);
    bool isPhp = (ext.Equals(".php", StringComparison.InvariantCultureIgnoreCase));
    
        8
  •  1
  •   ChrisF    16 年前

    更新:

    检查什么 path.Substring(path.LastIndexOf('.') 实际返回-这可能会为您指明正确的方向。

        9
  •  1
  •   odalet    16 年前
    private static bool IsPhp(string fileName)
    {
        return string.Compare(Path.GetExtension(fileName), ".php",
            StringComparison.OrdinalIgnoreCase) == 0;
    }
    
        10
  •  1
  •   Jon Skeet    16 年前

    我怀疑你的琴弦有点“奇怪”。我建议你详细地把你的绳子放出来,像这样:

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