2017-04-17 8 views
0

recursionまたはlinqのいずれかを使用してディレクトリツリーを歩いて "C:\ Program Files(x86)\ Folder1 \"という形式のファイル名を取得する方法を考えてみましょう。 Folder2 \ TargetParentFolder \ TargetFolder \ TargetFolderName.ext "基本的にファイル名はフォルダ名と同じで、既知のファイル拡張子を持ち、TargetFolderディレクトリにあります。私は "TargetFolderName.ext"ファイルを開くには、そのファイル内の特定の文字列を見つける(文字列は常にファイル内にある)文字列を変更し、ファイルを保存して閉じてTargetParentFolderにディレクトリツリーを移動する移動次のサブフォルダを取得次のTargetFolderのファイルに対する変更を繰り返します。これまでのところ私が持っているものである。この: FileInfoとLinqを使用したファイル自動化

FolderBrowserDialog folderPicker = new FolderBrowserDialog(); 
     if (folderPicker.ShowDialog() == DialogResult.OK) 
     { 
      lsvAddons.Items.Clear(); 
      List<string> folders = new List<string>(Directory.EnumerateDirectories(folderPicker.SelectedPath)); 
      foreach (var folder in folders) 
      { 
       var folderName = Path.GetDirectoryName(Path.GetDirectoryName(folder)); 

       var file = Directory.GetFiles(folderName, "*.toc", SearchOption.AllDirectories) 
       .FirstOrDefault(); 
       ListViewItem item = new ListViewItem(folderName); 
       item.Tag = folder; 

       lsvAddons.Items.Add(item); 

      } 



     } 

は、理想的には、ListViewコントロールが、コレクションが移入された後、繰り返し変更するフォルダと一致する各ファイル名を保持するコレクションは存在しません。アイデア?

答えて

0

私は、次のようなものを再帰を使用することをお勧め:

void WalkDirectoryTree(System.IO.DirectoryInfo root) 
     { 
      System.IO.FileInfo[] files = null; 
      System.IO.DirectoryInfo[] subDirs = null; 

      try 
      { 
       files = root.GetFiles("*.*"); 
      }    
      catch (UnauthorizedAccessException e) 
      {     
      }  
      catch (System.IO.DirectoryNotFoundException e) 
      { 

      } 

      if (files != null) 
      { 
       foreach (System.IO.FileInfo file in files) 
       {       
        if(file.Extension == ".ext"){ 
         //open the file here, and make your modification 
        } 
       } 

       subDirs = root.GetDirectories(); 

       foreach (System.IO.DirectoryInfo dirInfo in subDirs) 
       { 
        // Recursive call for each sub directory. 
        WalkDirectoryTree(dirInfo); 
       } 
      }    
     } 

これは、各レベルにアクセスし、ファイルをチェックし、MSDNから完全な例については、このリンクをチェックします: https://msdn.microsoft.com/en-us/library/bb513869.aspx

+0

私は例外ハンドルを追加しますGetDirectoriesの周りにあるので、フォルダにアクセスできない場合、コードは引き続き実行されます。 – jdweng

+0

それは驚くほどうまくいった!ありがとう!親foreachループとIOException FileNotFoundExceptionなどのような再帰foreachループで特定の例外処理を追加するように修正し、メッセージを確認するためにメッセージを確認するためにロガーを追加してから、WalkDirectoryTreeをボタンを押して検索パターンを入力し、置換値を入力して、ファイル内の必要な文字列を新しい値に変更します。 (基本版変更実施) – ScottJ

関連する問題