2009-05-15 16 views
1

これは私の人生を理解することができない非常に奇妙な問題であるようです。問題文字列の終わりを確認する

D:私は、問題のファイルはPHPがあるかどうかを確認する必要があります\チャット\

はindex.php bchat \開発\ PHPの\私はこのようになりますパス(文字列)を持っていますファイル。私は最も論理的な方法は、部分文字列を始めることです。文字列の末尾に、それが.phpの==どうかを確認

は、だから私は試してみました:

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

これは常にfalseを返されました。私はおそらく私の後ろに隙間があったので、前に道にTrimEnd()を置くと思った。しかしそれは何も変わらなかった。だから私はこれを試した:

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

これは常にfalseを返します。

EDIT 私は今も、これを試してみました:

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

しかし、これもfalseを返します。

+2

ブール値をブール値にチェックしてから、さらにブール値を選択しないでください。ちょうどboolを行うisphp = php.EndsWith( "。php"); (これは文字列比較を使用する場合は、以下の回答を参照してください) –

+1

軽い点ですが、(path.EndsWith( "。php")== true)?正誤; は、trueまたはfalseを返すpath.EndsWith( "。php")に凝縮できます。 – spender

+0

上記のNitpickersでは、彼がテストしていたことをはっきりと確認することができ、最初のコードを修正して2番目のコードを取得するので、冗長性があるのです。 –

答えて

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

CultureComparison.OrdinalIgnoreCaseを使用するほうが、文化(不変であっても)がファイル名に適していないので、 – Richard

+0

@リチャード:良い点、この変更を反映するようにコードを更新しました。 –

+0

ありがとうございます。なんらかの理由で、Trim()は後続のスペースを削除していませんでした。だから私はそれをハックする必要があった –

8

パスクラスを使用します。

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

EDIT:上部/下部ケースのための追加されたチェック

+0

これはまた偽を返すようです –

+0

私が投稿したコードは常に真実を返します - あなたの文字列にあなたが投稿したものが本当に含まれているかどうか確認してください。ドット( ".php")を確認することを忘れないでください。 GetExtension()メソッドで評価された拡張をデバッグまたは印刷してチェックします。 – tanascius

+1

Martinによって指摘されているように - 大文字と小文字をチェック! – tanascius

2

それが既存のファイルである場合、あなたはそれのためFileInfoオブジェクトを取得し、拡張子をそのように確認することができます。

それはGetExtension()メソッドを持っています
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に示されている解決策は(ただし最良の方法ではありませんが)機能するはずです。したがって、path変数は期待値を参照しません。 – 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。

関連する問題