2017-12-20 10 views
0

C#で、ディレクトリ名のリストを取得するには?

ディレクトリ名のリストが必要です。 タイプはListで、私は完全なpahリスト(List fullPathList)を持っています。 fullpathListが...このようなものです。この場合

[0] C:\temp\image\a.jpg; 
[1] C:\temp\image\b.bmp; 
[2] c:\temp\bin\my.exe; 
[3] c:\temp\document\resume.doc; 
[4] c:\temp\document\timetable.xlsx; 

、 私はそれをしたいです。

List<string> dirs; 
[0] iamge 
[1] bin 
[2] document 

私はRegxを使用していると思います。 しかし、私は詳しい方法を知らない。

どうすればいいですか? (使用ループ文いけない)

+0

ループ文を使用しないでください:宿題の一般的な制限はありますか?私の推測では、あなたは "本当の"ファイルシステムを持っていないだろうが、上記のような文字列の "検定"リストを持っているだろうか?その前提の上で文字列を処理するための私の答えに合わせました。 Linqのカウントを "ループステートメント"としてチェックインすることはできません。そうであれば、foreach、for、while、do-while、またはあなたの使用が許可されているものでそれを書き換えることができます –

答えて

3

私は、これはあなたが望むものを出力します信じて...

using System.Data; 
using System.Diagnostics; 
using System.IO; 
using System.Linq; 

namespace Test { 
    class Program { 
     static void Main(string[] args) { 
      var files = new string[] { 
       @"C:\temp\image\a.jpg", 
       @"C:\temp\image\b.bmp", 
       @"c:\temp\bin\my.exe", 
       @"c:\temp\document\resume.doc", 
       @"c:\temp\document\timetable.xlsx", 
      }; 
      var dirNames = files.Select(x => new DirectoryInfo(Path.GetDirectoryName(x)).Name); 
      Debug.WriteLine($"dirNames={string.Join(",", dirNames)}"); 
     } 
    } 
} 

Path.GetDirectoryName()の完全なパスと新しいDirectoryInfoを(返す)。名前はの名前だけを返します。パスの最後の部分。

リストに結果をしたい場合は、使用して...

var dirNames = files.Select(x => new DirectoryInfo(Path.GetDirectoryName(x)).Name).ToList(); 
+1

var dirNames = files.Select(x => new DirectoryInfo(Path.GetDirectoryName(x)).Distinct( ).ToList(); // Distinct()を追加してください。 – asthman

+0

ありがとうございます。 –

+0

このコードは、使用されている子ディレクトリの数に関係なく機能するはずです。パスが "c:\ temp \ a \ b \ c \ d \ e \ image \ x.jpg"の場合、コードは "image"を返し、パスが "c:\ image \ x"の場合は "image" .jpg " –

0

チェックこのソリューションが動作するかどうか。 指定されたドライブ内のすべてのディレクトリを取得します。 は、実際のファイルシステムDirectoryInfoについてref link

 List<string> dir = new List<string>(); 
     System.IO.DriveInfo di = new System.IO.DriveInfo(@"D:\"); 
     System.IO.DirectoryInfo dirInfo = di.RootDirectory; 

     System.IO.DirectoryInfo[] dirInfos = dirInfo.GetDirectories("*.*"); 

     foreach (System.IO.DirectoryInfo d in dirInfos) 
     { 
      dir.Add(d.Name); 
     } 
0

参照リンクを経由してください移動するための方法です。

using System; 
using System.Linq; 
using System.IO; 

public class Program 
{ 
    public static void Main() 
    { 
     // some strings that are like paths 
     var dirs = new[] 
     { 
      @"C:\temp\image\a.jpg", @"C:\temp\image\b.bmp", @"c:\temp\bin\my.exe", 
      @"c:\temp\document\resume.doc", @"c:\temp\document\timetable.xlsx" 
     }; 

     // this will use a static method to extract only the path-part 
     var fullDirs = dirs.Select(d => Path.GetDirectoryName(d)).ToList(); 

     // this will use the same method but split the result at the default systems 
     // path-seperator char and use only the last part, only uses distinct values 
     var lastDirsDistinct = dirs.Select(d => Path.GetDirectoryName(d) 
        .Split(Path.DirectorySeparatorChar).Last() 
       ).Distinct().ToList(); 

     // joins the list with linebreaks and outputs it 
     Console.WriteLine(string.Join("\n", fullDirs)); 

     // joins the list with linebreaks and outputs it    
     Console.WriteLine(string.Join("\n", lastDirsDistinct)); 
    } 
} 

出力:

あなたが ないを照会するための実際のファイルシステムを持っていますが、 のようなパスは、あなたがこのようにそれらを分割する System.IO.Path - Static methodsを使用することができます文字列のリストを持っている場合は

C:\temp\image 
C:\temp\image 
c:\temp\bin 
c:\temp\document 
c:\temp\document 
image 
bin 
document 
関連する問題