2016-12-01 19 views
-1

.CIDファイル名の一部がディレクトリ名の一部と一致する場合、ディレクトリに移動する.CIDファイルがあります。C#ファイル名の一部がフォルダ名と一致する場合にファイルを移動する場合

ここ

は、いくつかのサンプルディレクトリです:ここでは

S002016-P063 // projectnumber-panelnumber 
S002016-P066 
S002016-P067 

は、いくつかのサンプルファイル名です:

P063-1.LEFT.CID // move to S002016-P063 directory 
P063-10.RIGHT.CID // move to S002016-P063 directory 
P066-2_P066-5.LEFT.CID // move to S002016-P066 because P066 == P066 
P067-12.LEFT.CID // move to S002016-P067 
P067-5_P063-2.RIGHT.CID // leave file where it’s at because P067 != P063 

今私は物理的に適切なディレクトリにこれらのファイルを移動するが、私はそれを使用して行うことができると仮定しますコンソールアプリケーション。正規表現クラスと多分マッチメソッドを使ってif文を設定する必要があるのでしょうか?私はC#の初心者です。ここまで私がこれまで持っていたことがあります。基本的に、コンソールアプリケーションは指定されたディレクトリ内のディレクトリとファイルを一覧表示します。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Hello and Welcome to the File Sorting Program"); // Displays Text in Quotes 

     Console.WriteLine(); // Adds a Space 

     string[] fileEntries = Directory.GetDirectories(@"\\Users\none\Documents\File Sorter"); // Regex for panel number = -([A-Z0-9a-z\-]+) 

     System.Console.WriteLine("Directories in the Folder: "); 

     Console.WriteLine(); // Adds a Space 

     foreach (string fileName in fileEntries) 
     { 
      Console.WriteLine(Path.GetFileName(fileName)); // Lists the directories found in the "File Sorter" directory 
     } 

     Console.WriteLine(); // Adds a Space 
     Console.WriteLine(); // Adds a Space 

     string[] files = Directory.GetFiles(@"\\Users\none\Documents\File Sorter", "*.CID"); // Regex for panel number = ([A-Z0-9a-z\-]+)- 

     System.Console.WriteLine("Files in this Folder: "); // Displays Text in Quotes 

     Console.WriteLine(); // Adds a Space 

     foreach (string file in files) 
     { 
      Console.WriteLine(System.IO.Path.GetFileNameWithoutExtension(file)); // Lists each file minus .CID found in the "File Sorter" directory 
     } 

     Console.WriteLine("Press any key to exit."); // Displays Text in Quotes 

     System.Console.ReadKey();  
    } 
} 
+0

これは問題ではありませんが、問題が発生しますか?もしそうなら、それは何ですか?具体的に言えば、人々は単にコードを完成させるだけではありません。私は 'regex'を使うことが正しいとしか言​​えません。 – Mat

+0

私のコードに問題はありません。 'regex'に関する私の質問にお答えいただき、ありがとうございます。 –

答えて

0

フォルダ名やファイル名のパターンが一致していると仮定すると、これは約あなたが探しているものをあなたを与える必要があります。

string root = @"\\Users\none\Documents\File Sorter"; 

string[] directories = Directory.GetDirectories(root); 
var dirRef = directories.ToDictionary(k => k.Split('-')[1], v => v); 

string[] files = Directory.GetFiles(root); 
foreach (var file in files) 
{ 
    string fileName = Path.GetFileName(file); 
    string projectName = null; 
    foreach (Match m in Regex.Matches(fileName, "[A-Za-z0-9]+(?=-)")) 
    { 
     if (projectName == null) 
     { 
      projectName = m.Value; 
     } 
     else if (projectName != m.Value) 
     { 
      projectName = null; 
      break; 
     } 
    } 

    if (projectName == null) 
    { 
     Console.WriteLine("Project names in file {0} do not match.", fileName); 
    } 
    else if (dirRef.ContainsKey(projectName)) 
    { 
     File.Move(file, dirRef[projectName] + "\\" + fileName); 
     Console.WriteLine("File {0} moved to directory {1}.", fileName, dirRef[projectName]); 
    } 
    else 
    { 
     Console.WriteLine("Directory with project name {0} doesn't exist", projectName); 
    } 
} 
+0

これは最後のテストケースをどのように処理しますか、私はおそらくその部分をチェックせずにディレクトリの1つに移動しようとしていると感じています – TheLethalCoder

+0

@TheLethalCoder申し訳ありませんが、質問の特殊なケースを逃しました。私の編集を参照してください。 – Abion47

+0

これは素晴らしいことです。助けてくれてありがとう! –

0

は、私はいくつかのテストを行いましたし、このスニペットは、すべてを処理します上記の場合は、Regexを使用します。明らかにそれは改善することができますが、あなたが作業する出発点です。

var projectFolders = Directory.GetDirectories(@"Projects/"); 
var fileEligibleToBeMoved = new List<string>(); 

var files = Directory.GetFiles(Directory.GetCurrentDirectory()); 

foreach (var file in files) 
{ 
    if (!file.Contains(".CID")) 
     continue; 
    var fileName = Path.GetFileName(file); 
    var matches = Regex.Matches(fileName, @"(P[a-zA-Z0-9]+)"); 

    if (matches.Count == 0) 
     continue; 

    var isEligible = true; 
    var previous = string.Empty; 
    foreach (Match match in matches) 
    { 
     if(previous == string.Empty) 
     { 
      previous = match.Value; 
      continue; 
     } 
     if (previous != match.Value) 
      isEligible = false; 
    } 
    if (isEligible) 
     fileEligibleToBeMoved.Add(file);     
} 

foreach (var dir in projectFolders) 
{ 
    var panelTag = Regex.Match(dir, @"-\w+").Value.Replace("-", "");     
    var filesToMove = fileEligibleToBeMoved 
     .Where(file => file.Contains(panelTag)) 
     .ToArray(); 
    foreach (var file in filesToMove) 
    { 

     File.Move(file, string.Format("{0}/{1}", dir, Path.GetFileName(file))); 
    } 
} 
+0

ありがとうSid!これは本当に私のような、ただ学習している人を助けます。 –

+0

@ KyleO'Rileyあなたは歓迎です – Sid

関連する問題