2017-04-17 21 views
1

すべてのファイル名をウィンドウエクスプローラに存在する順に抽出したいとします。私はグーグルで、多くの答えを見つけましたが、これはうまくいきませんでした。私は次の順序でファイル名を持っています:ディレクトリからファイル名を取得する方法はC#にありますか?

video_1 
video_2 
video_3 
video_10 
video_15 
video_20 
video_21 

結果は次の形式になります。

video_1 
video_10 
video_10 
video_2 
video_20 
video_21 

私は以下のコードを試してみました:

var fileNames= Directory.GetFiles(basePath, "*" + fileExtension) //Not worked 
DirectoryInfo info = new DirectoryInfo(basePath); 
var filenames = info.GetFiles().OrderBy(p => p.CreationTIme).ToArray(); //Not worked 

誰かが私はこれを行うことができる方法を教えてもらえますか?

+0

よく '.OrderBy(p => p.CreationTIme)'は作成時にそれらのファイルを並べ替えると動作しません。 –

+0

ファイル名も機能しません – Umer

+0

@Steve - これは重複した質問かもしれませんがあなたが閉鎖した人のそれはVB.Netのためのものであり、したがって正確なdupではありません。 C#で見つかる検索 –

答えて

3

注文が「間違っている」理由は、名前が文字列であり、したがって文字列として順序付けられているためです。何が欲しいのは、それの数字の一部で注文することです:

DirectoryInfo info = new DirectoryInfo(""); 
var files = info.GetFiles() 
       .OrderBy(p => p.FullName.Split('_')[0]) 
       .ThenBy(p => int.Parse(p.FullName.Split('_')[1])); 

あなたは(そして_と有効な番号付き)形式は、まさにそのようなものであるかわからない場合は、次のことができます。

Func<string, int, int> parseIntOrDefault = (input, defaultValue) => 
{ 
    int value = defaultValue; 
    int.TryParse(input, out value); 
    return value; 
}; 

var result = from file in info.GetFiles() 
      let sections = file.FullName.Split('_') 
      orderby sections[0], sections.Length == 2 ? 
       parseIntOrDefault(sections[1], int.MaxValue) : int.MaxValue 
      select file; 
+0

@Umerがファイルシステムのようにソートしたいのであれば、これは彼の質問に対するより適切な答えと思われます。http://stackoverflow.com/questions/1601834/c-implementation-of-or-alternative-to-strcmplogicalw -in-shlwapi-dll。実際の質問には、彼が使うはずのコードが含まれています。あなたの答えは間違っていませんが、フォーマットを変更しても機能し続けることはできません。 –

+0

@MaxYoungそれは私のために働く。最後に。私はそれをマークすることができ、他の人がそれから助けを得ることができるように、このコメントを答えとして書いてください。 – Umer

+0

@Umer重複が受け入れられたので私はカンタンです。私はちょうどその質問をアップアップします。うれしいことはあなたのために働いた。 –

関連する問題