2016-12-22 10 views
0

現在、夜間指定された時刻にサーバーに到着したファイルをポーリングして、到着したことを確認し、不足しているファイルを文書化する簡単なツールをコーディングしています。彼らは約このフォルダに座っています。 40分後、スクリプトを介して自動的に移動されます(私はこれを制御できません)。ファイル名とテーブルまたはリストの部分一致を比較する方法

私の質問は:

私はテーブルに対して部分一致のファイル名は、(私は事前に定義されたテーブルの上のもので、ファイル名に一意の識別子(NUMBER以下NUMBER2)を一致させたい比較することができますどのように、そのユーザーWindowsフォーム経由で更新できます)。おそらく私はこれらの文字列を分割したいので、私は分割してNUMBERNUMBER2を持っているので、これらを比較してファイル名に含まれているかどうか確認します。数字は一致するようにファイル名に含めなければなりません。重要です)。

ファイル名形式:

NCR_XR_D_NUMBER_NUMBER2 

順序が重要であるように、NCR_XR_D_8003_9611NCR_XR_D_9611_8003に等しくありません。

これは私が今持っているものです。

public static void CheckIfFilesExist() 
    { 
     // Put all file names in XR File directory into array. 

     string[] array1 = Directory.GetFiles(@Properties.Settings.Default.XRFolderSavedLocation); 
     //this location is stored as a app setting, type: string, scope: User. This is tested working OK. 

     // Print filenames into Console. (making sure the array is populating). 
     Console.WriteLine("--- Files:---"); 

     foreach(string name in array1) 
     { 
      Console.WriteLine(name); 
     } 

    } 
+1

私はここで問題を見ることはできません。 'array1'のすべてのファイルを' _'で分割し、3番目と4番目の配列要素を取得して両方の数値を取得するだけです... – Pikoh

+0

'string [] fileNameItems = name.Split( '_');'最後の2つのアイテム、すなわち 'fileNameItems [fileNameItems.Length -1']を使って数字を取得し、それらを見てください –

答えて

1

ファイルパスとファイル名の番号部分を格納するクラスを作成する方法について説明します。ここでは、比較を簡単にするので、数字を一緒に結合しました。

public class FileInfo 
{ 
    public string FilePath { get; private set; } 
    public string Numbers { get; private set; } 

    public FileInfo(string filepath) 
    { 
     var fileName = Path.GetFileName(filepath); 
     if (!fileName.StartsWith("NCR")) 
     { 
      throw new ArgumentException("Wrong type of file."); 
     } 

     FilePath = filepath; 

     var nameParts = fileName.Split('_'); 
     Numbers = nameParts[3] + nameParts[4]; 
    } 
} 

次に、あなたの関数は次のようになります。GetFilterValues()はあなたが(例えば"80039611")を探している値の文字列の配列を返します

public static void CheckIfFilesExist() 
    { 
     var filesToFilter = Directory.GetFiles(@Properties.Settings.Default.XRFolderSavedLocation).Select(f => new FileInfo(f)); 
     var filterValues = GetFilterValues(); 

     var filteredFiles = filesToFilter.Where(f => filterValues.Contains(f.Numbers)); 
    } 

+0

これは素晴らしいです。フィルタは非常にエレガントなソリューションです。私はこれを学ぶ必要があります、私はそれが私にとって再び役に立つと確信しています。 –

+0

ありがとう:-)私はあなたのために働いてうれしいです。 – sclarke81

0

あなただけの各ファイル名にSplitを使用して簡単にこの問題を解決することができます。何かのように:

public static void CheckIfFilesExist() 
{ 
    string[] array1 = Directory.GetFiles(@Properties.Settings.Default.XRFolderSavedLocation); 

    foreach(string name in array1) 
    { 
     Console.WriteLine(name); 
     if (Path.GetFileName(name).StartsWith("NCR")) 
     { 
      string[] splitted = name.Split('_'); 
      int number1 = int.Parse(splitted[3]); 
      int number2 = int.Parse(splitted[4].Split('.')[0]); 
     } 
     Console.WriteLine(number1); 
     Console.WriteLine(number2); 
    } 

} 
+0

あなたの助けてくれてありがとう!私はこの特定のソリューションを使用しませんが、私が学ぶのを助けてくれてすばらしいです。 –

関連する問題