2016-12-22 1 views
0

В настоящее время я пытаюсь закодировать простой инструмент для опроса некоторых файлов, которые поступают на сервер в указанное время суток, чтобы подтвердить, что они прибыли, и документировать все отсутствующие файлы , Они будут сидеть в этой папке прибл. 40 минут, а затем автоматически перемещаться по сценарию (я не могу контролировать это).Как сравнить имена файлов с частичным совпадением из таблицы или списка

Мой вопрос:

Как я могу сравнить имена файлов для частичного совпадения с столом (я хочу, чтобы соответствовать уникальные идентификаторы (NUMBER и NUMBER2 ниже) в имени файла с данными по заранее определенной таблице, пользователь может обновляться через форму Windows). Предположительно, я хочу разделить строки так, что я разделил NUMBER и NUMBER2, поэтому я могу сравнить их и посмотреть, включены ли они в имя файла (номера должны быть указаны в имени файла, чтобы он соответствовал, а также порядок является значительным).

Формат файла:

NCR_XR_D_NUMBER_NUMBER2 

Как заказ значителен, NCR_XR_D_8003_9611 не равна NCR_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 ('_');' тогда вы можете получить последние два элемента, то есть числа, используя '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]; 
    } 
} 

Тогда ваша функция становится:

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)); 
    } 

Где GetFilterValues() возвращает массив строк значений, которые вы ищете (например, "80039611").

+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

Спасибо за вашу помощь! Хотя я не буду использовать это конкретное решение, оно отлично помогает мне учиться. –