2016-05-02 17 views
0

誰かがこれを行うためのよりクリーンな方法を知っているのだろうかと思っていました。私は、ファイルを含むすべての入力ディレクトリを一覧表示する私のプログラムのセクションを持っています。ディレクトリ内のすべてのサブディレクトリとファイルを一覧表示する

しかし、これを行うには、手動で各入力ディレクトリを変数として保存し、これらを検索のターゲットとして使用します。

これを行うにはよりクリーンな方法があるのでしょうか?その後、ディレクトリDateIf FolderName == "Input"でスタート

  • 無い場合、InputSubs内の各フォルダの配列InputSubs
  • 内のすべてのサブフォルダを格納します。

    例えば、私は現時点では私の頭の中で持っている擬似コードがありますサブフォルダがInputSubに含まれ、ファイルが含まれていない場合は、InputSubs次へ進む

  • InputSubsにサブディレクトリが含まれている場合は、すべてのサブディレクトリを配列InputSubs2およびm
  • 次へのオベInputSubsが配列InputFiles
  • 繰り返しInputSubsプロセスに文字列としてファイル、店舗DirPathFileNameが含まれている場合InputSubs2

のための入力フォルダが行く最も深い2つのディレクトリです。

入力フォルダ構造の例は、添付イメージにあります。

enter image description here

次のように私は現在使用のコードの例です。

ListBox1.Items.Clear(); 

if (Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "AustraliaFolder")).Length != 0) 
{ 
    ListBox1.Items.Add(Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "AustraliaFolder"))[0]); 
} 

if (Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "DE1Folder")).Length != 0) 
{ 
    ListBox1.Items.Add(Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "DE1Folder"))[0]); 
} 

if (Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "PL1Folder")).Length != 0) 
{ 
    ListBox1.Items.Add(Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "PL1Folder"))[0]); 
} 

if (Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "EuropeFolder")).Length != 0) 
{ 
    ListBox1.Items.Add(Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "EuropeFolder"))[0]); 
} 

if (Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "fr1Folder")).Length != 0) 
{ 
    ListBox1.Items.Add(Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "fr1Folder"))[0]); 
} 

if (Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "FranceFolder")).Length != 0) 
{ 
    ListBox1.Items.Add(Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "FranceFolder"))[0]); 
} 

if (Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "HKFolder")).Length != 0) 
{ 
    ListBox1.Items.Add(Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "HKFolder"))[0]); 
} 

if (Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "UKFolder")).Length != 0) 
{ 
    ListBox1.Items.Add(Directory.GetFiles(SalesInputFilePath + ResourceDetails.InputFolders(FormDMM, EH, ObjApp, Modules, "UKFolder"))[0]); 
} 

私は以上の物事を複雑にし、私の頭からの擬似コードよりも、それを行うには簡単に、または少なくともより効率的な方法があったかと思いまし避けられない傾向があります。

ありがとうございます。

+0

に興味があり、最終的な結果はどのようなものですが含まれているすべてのディレクトリ名を返すのだろうか?ツリービューで表示できるすべてのファイル/すべてのサブフォルダ/両方/階層構造のリスト?あなたのスクリーンショットに基づいていくつかのサンプル出力を提供してください。 –

+0

「再帰的」を試してください。 – MichaelMao

+0

本質的に私はフォルダ "入力"またはそのサブフォルダの1つの中に存在するファイルのフルパスとファイル名を入力するリストボックスを探しています。 – DDuffy

答えて

1

本質的に私は、フォルダ "入力"またはそのサブフォルダの1つに存在するファイルのフルパスとファイル名を入力するリストボックスを探しています。 - ディレクトリのDDuffy

すべてのファイルとそれはサブディレクトリです:これは私の元のコードを改善ん

string[] files = Directory.GetFiles("Your Input Direcotry","*.*", SearchOption.AllDirectories); 

。ありがとうございました。しかし、私はすべての入力ディレクトリのためにこれを複製する必要があります。ベースディレクトリの各フォルダに入力フォルダと出力フォルダの両方が含まれているので、これをベースディレクトリから使用することはできません。ベースディレクトリ内にある各Inputフォルダを反復処理する方法がありますか? - DDuffy

public static List<string> GetAllFilesOfAllDirectoriesCalledInput(string root) 
{ 
    List<string> inputDirectories = FindSubDirectoriesCalledInput(root); 
    List<string> result = new List<string>(); 
    foreach(string inputDirectory in inputDirectories) 
     result.AddRange(Directory.GetFiles(inputDirectory,"*.*", SearchOption.AllDirectories)); 
    return result; 
} 

public static List<string> FindSubDirectoriesCalledInput(string currentRoot) 
{ 
    List<string> results = new List<string>(); 
    foreach(string subDirectory in Directory.GetDirectories(currentRoot)) 
    { 
     if(subDirectory.EndsWith("\\Input", StringComparison.InvariantCultureIgnoreCase)) 
      results.Add(subDirectory); 
     else 
      results.AddRange(FindSubDirectoriesCalledInput(subDirectory)); 
    } 
    return results; 
} 
+0

これは元のコードで改善します。ありがとうございました。しかし、私はすべての入力ディレクトリのためにこれを複製する必要があります。ベースディレクトリの各フォルダに入力フォルダと出力フォルダの両方が含まれているので、これをベースディレクトリから使用することはできません。ベースディレクトリ内にある各Inputフォルダを反復処理する方法がありますか? – DDuffy

+0

@ DDuffy検索を2つの部分に分割します。「入力」と呼ばれるディレクトリを検索し、それらのディレクトリにあるすべてのファイルを一覧表示します。 –

+0

ブーム!あなたはスター!これは素晴らしいことです。その短い、その甘い、そして今は私の頭の中にある混乱よりずっときれいです。どうもありがとうございました。 – DDuffy

1

私はあなたがキーフィールドが対応するディレクトリ内のファイルのリストを格納し、各ディレクトリと値フィールドの値を格納した結果を格納するためにDictionary<string, List<string>>を使用することをお勧めします。

Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>(); 
foreach (var item in Directory.GetDirectories(@"C:\Users\user\Desktop\search Directory", "*.*", SearchOption.AllDirectories)) 
{ 
    if (new DirectoryInfo(item).Name == "Input") 
     dict.Add(item, getMyfiles(item)); 
} 

これは、指定されたフォルダ内の各ディレクトリとサブディレクトリをループします。各反復でgetMyfiles()を呼び出し、指定されたディレクトリに含まれるファイルを返します。ディレクトリ名と各繰り返しでのファイルのリストを収集しています。この方法getMyfiles()は、次のように定義されている場合:

private List<string> getMyfiles(string DirectoryPath) 
{ 
    return Directory.GetFiles(DirectoryPath, "*.*").ToList(); 
} 
+0

ちょうど "辞書"をすぐに読み上げました。 C#noobのビット。辞書構造が構築されたら、辞書キーに "Input"という単語が含まれているかどうかを確認する方法はありますか? – DDuffy

+0

はい追加する前に入力を確認することができます:updaterを参照してください –

+0

これは、ファイルが入力よりも深いディレクトリにあったところではうまくいかないでしょうか?例Input/FileDir/File.csv – DDuffy

0
var dirList = Directory.GetDirectories("Path", "*", SearchOption.AllDirectories).Where(subdir => !Directory.GetDirectories(subdir).Any()); 

は、それはあなたのファイル