2017-09-10 14 views
1

私はこのコードをtrue/falseに戻します。与えられたディレクトリに ".exe"が含まれている場合、TrueまたはFalseを返そうとしています

public static bool HasExecutable(string path) 
    { 
     var exts = "*.exe"; 
     if (path.AsDirectory().Exists) return true; 
     if(path.AsDirectory().GetFiles(exts).Any(i => path.Contains(exts))) return true; 
     return false; 
    } 
} 

}

私のアウトプットは、私のプログラムを停止し、エラーである私はここにいくつかのロジック足りませんか?

+2

エラーメッセージは何ですか? –

+0

未処理の例外:System.IO.DirectoryNotFoundException: 'c:\ program files(x86)\ notepad ++'のパスの一部を見つけることができませんでした。 。 –

+0

@Aominèi要素を使用するとエラーが発生します.fileInfoから変換できません。文字列 –

答えて

1

if (path.AsDirectory().Exists) return true; 

戻りtrueディレクトリ自体が存在する場合、この行。

if (!path.AsDirectory().Exists) return false; 

LINQ部分があまりにも、問題があります:パスは、ワイルドカード文字を持つことが許されていないため、パス上のContainsコールは"*.exe"文字列のtrueを返すことはありませんディレクトリが存在しない場合は代わりに、falseを返す必要があります。 GetFilesがあなたのためのフィルタリングを行っているので、しかし、あなたは、まったくの条件を必要としない:

return path.AsDirectory().GetFiles(exts).Any(); 

あなたは、単一の文の中に両方の条件を折ることができます。

return path.AsDirectory().Exists 
    && path.AsDirectory().GetFiles(exts).Any(); 
+0

@ dasblinkenlightこんにちは@ dasblinkenlightは、コードをありがとう、私のテストケースの変更に従って、@ "c:\ program files(x86)\ notepad ++" /// expected trueが返されたtrueの呼び出しメソッドの代わりにfalse値を返していますfalse –

+0

@ d.Freezeこれは奇妙なことですが、本質的にシステムメソッドの1行の呼び出しである実装について特別なことは何もありません。テストケースをチェックして、期待される結果が正しいことを確認してください(exeファイルは、このコードが機能するためには、サブディレクトリの1つではなく、ディレクトリ自体に存在する必要があります)。 – dasblinkenlight

+0

ここにはテストケース// if(true.ToString()!= Practice.HasExecutable(@ "c:\ program files(x86)\ notepad ++")ToString()) { TestFailures.Add(Tuple.Create ToString()、true.ToString()、Practice.HasExecutable(@ "c:\ program files(x86)\ notepad ++")。ToString())); } ///戻りパスを追加しました.AsDirectory()。GetFiles(exts、SearchOption.AllDirectories).Any();すべてのディレクトリを検索するのにまだ間違った値を返します –

3

あなただけ列挙することができますディレクトリにパターンマッチングを行い、Any拡張メソッドを使用します。

public static bool HasExecutable(string path) 
    { 
     var exts = "*.exe"; 
     return Directory.EnumerateFiles(path, exts).Any(); 
    } 
関連する問題