Как получить список файлов в каталоге с помощью C или C ++?

Как я могу определить список файлов в каталоге из моего кода C или C ++?

Мне не разрешено выполнять ls и проанализируйте результаты в моей программе.


ОБНОВЛЕНИЕ 2017 :

В C ++ 17 теперь существует официальный способ перечисления файлов вашей файловой системы: std :: filesystem . Ниже приведен отличный ответ от Shreevardhan с этим исходным кодом:

  #include  #include  #include  пространство имен fs = std :: filesystem; int main () {std :: string path = "/путь/к/каталогу";  for (const auto & entry: fs :: directory_iterator (path)) std :: cout  

Старый ответ:

В небольших и простых задачах я не использую boost, я использую dirent.h , который также доступен для Windows:

  DIR * dir; struct dirent * ent; if ((dir = opendir ("c: \ src \")! = NULL) {/* распечатать все  файлы и каталоги в каталоге */while ((ent = readdir (dir))! = NULL) {printf ("% s  n", ent-> d_name);  } closedir (dir);} else {/* не удалось открыть каталог */perror ("");  return EXIT_FAILURE;}  

Это всего лишь небольшой файл заголовка, который выполняет большую часть простых вещей, которые вам нужны, без использования большого подхода на основе шаблонов, такого как boost (без обид, мне нравится boost !).

Автор слоя совместимости с Windows — Тони Ронкко. В Unix это стандартный заголовок.


В C ++ 17 теперь есть std :: filesystem :: directory_iterator , который можно использовать как

  #include  #include  #include  namespace fs = std  :: файловая система; int main () {std :: string path = "/путь/к/каталогу";  for (const auto & entry: fs :: directory_iterator (path)) std :: cout  

Кроме того, std :: filesystem :: recursive_directory_iterator также может перебирать подкаталоги.

11


К сожалению, стандарт C ++ не определяет стандартный способ работы с файлами и папками таким образом.

Поскольку кросс-платформенный способ отсутствует, лучший кросс-платформенный способ — использовать библиотеку, такую ​​как модуль файловой системы boost.

Кросс-платформенный метод ускорения:

Следующая функция, учитывая путь к каталогу и имя файла, рекурсивно ищет в каталоге и его подкаталогах имя файла, возвращая bool, и в случае успеха путь к найденному файлу.

  bool find_file (const path & dir_path,//в этом каталоге, const std :: string & file_name,//ищем это имя, path & path_found)//размещение  путь здесь, если найден {if (! существует (dir_path)) return false;  directory_iterator end_itr; //конструкция по умолчанию возвращает конец для (directory_iterator itr (dir_path); itr! = end_itr; ++ itr) {if (is_directory (itr-> status ())) {if (find_file (itr-> path (  ), имя_файла, найденный путь)) return true;  } else if (itr-> leaf () == file_name)//см. ниже {path_found = itr-> path ();  вернуть истину;  }} return false;}  

Источник со страницы повышения, упомянутой выше.

Для Unix/Linux. системы:

Вы можете использовать opendir/readdir/closedir.

Пример кода, который ищет в каталоге запись « name »:

  len = strlen (name);  dirp = opendir ("."); while ((dp = readdir (dirp))! = NULL) if (dp-> d_namlen == len &&! strcmp (dp-> d_name, name)) {(void) closedir (  дирп);  return FOUND;  } (void) closedir (dirp); return NOT_FOUND;  

Исходный код из приведенных выше страниц руководства.

Для систем на базе Windows:

Вы можете использовать функции Win32 API FindFirstFile/FindNextFile/FindClose.

Следующий C ++ пример показывает минимальное использование FindFirstFile.

  #include  #include  #include  void _tmain (int argc,  TCHAR * argv []) {WIN32_FIND_DATA FindFileData;  HANDLE hFind;  if (argc! = 2) {_tprintf (TEXT ("Использование:% s [целевой_файл]  n"), argv [0]);  возвращаться;  } _tprintf (ТЕКСТ ("Целевой файл% s  n"), argv [1]);  hFind = FindFirstFile (argv [1], & FindFileData);  if (hFind == INVALID_HANDLE_VALUE) {printf ("Ошибка поиска первого файла (% d)  n", GetLastError ());  возвращаться;  } else {_tprintf (ТЕКСТ ("Первый найденный файл -% s  n"), FindFileData.cFileName);  FindClose (hFind);  }}  

Исходный код с указанных выше страниц msdn.

3


Одной функции достаточно, вам не нужно использовать сторонние библиотека (для Windows).

  #include  vector  get_all_files_names_within_folder (string folder) {vector  names  ;  строка search_path = folder + "/*.*";  WIN32_FIND_DATA fd;  ОБРАБОТКА hFind = :: FindFirstFile (search_path.c_str (), & fd);  if (hFind! = INVALID_HANDLE_VALUE) {do {//читать все (реальные) файлы в текущей папке//, удалить '!'  прочтите 2 другие папки по умолчанию.  и .. if (! (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {names.push_back (fd. cFileName);  }} while (:: FindNextFile (hFind, & fd));  :: FindClose (hFind);  } return names;}  

PS: как упомянул @Sebastian, вы можете изменить *. * на *. ext , чтобы получить в этом каталоге только EXT-файлы (т.е. определенного типа).

16


Для решения только на C проверьте это. Для этого нужен только дополнительный заголовок:

https://github.com/cxong/tinydir

  tinydir_dir dir; tinydir_open (& dir, "/ путь/к/каталогу "); while (dir.has_next) {файл tinydir_file;  tinydir_readfile (& каталог, & файл);  printf ("% s", имя_файла);  если (file.is_dir) {printf ("/");  } printf (" п");  tinydir_next (& dir);} tinydir_close (& dir);  

Некоторые преимущества перед другими вариантами:

  • Это переносимо — обертывает директиву POSIX и Windows FindFirstFile.
  • Он использует readdir_r там, где это возможно, что означает, что он (обычно) потокобезопасен.
  • Поддерживает Windows UTF-16 через те же макросы UNICODE
  • Это C90, поэтому его могут использовать даже очень древние компиляторы

2


Я рекомендую использовать glob с этой многоразовой оболочкой . Он генерирует vector , соответствующий путям файлов, которые соответствуют шаблону глобуса:

  #include  #include  с использованием std :: vector; vector  globVector (const string & pattern) {glob_t glob_result;  glob (pattern.c_str (), GLOB_TILDE, NULL, & glob_result);  векторные файлы ;  for (беззнаковое int я = 0; я  

Который затем может быть вызван с обычным системным шаблоном подстановки, например:

  векторные  файлы  = globVector ("./*");  

5


Вот очень простой код на C ++ 11 , использующий библиотеку boost :: filesystem для получения имен файлов. в каталоге (исключая имена папок):

  #include  #include  #include  using namespace std; using namespace boost:  : файловая система; int main () {путь p ("D:/AnyFolder");  for (auto i = directory_iterator (p); i! = directory_iterator (); i ++) {if (! is_directory (i-> path ()))//мы удаляем каталоги {cout  path (). filename  () .string ()  

Вывод выглядит примерно так:

  file1.txtfile2. dat  

2


Я думаю, нижеприведенный фрагмент может быть используется для вывода списка всех файлов.

  #include  #include  #include  int main (int argc,  char ** argv) {list_dir ("myFolderName");  return EXIT_SUCCESS;} static void list_dir (const char * path) {struct dirent * entry;  DIR * dir = opendir (путь);  если (dir == NULL) {возврат;  } while ((entry = readdir (dir))! = NULL) {printf ("% s  n", запись-> d_name);  } closedir (dir);}  

Это используемая структура (присутствует в dirent.h ):

  struct dirent {ino_t d_ino; /* номер inode */off_t d_off; /* смещение до следующего направления */unsigned short d_reclen; /* длина этой записи */unsigned char d_type; /* тип файла */char d_name [256]; /* имя файла */};  

2


Почему бы не использовать glob () ?

  #include  glob_t glob_result; glob (  "/your_directory/*", GLOB_TILDE, NULL, & glob_result); for (unsigned int i = 0; i  

3


Попробуйте форсировать для метода x-платформы

http://www.boost.org/doc/libs/1_38_0/libs/filesystem/doc/index.htm

или просто используйте файлы, специфичные для вашей ОС.

2


Обратите внимание на этот класс, который использует win32 api. Просто создайте экземпляр, указав имя папки , из которого вы хотите получить листинг, затем вызовите метод getNextFile , чтобы получить следующее имя файла из каталога. Я думаю, ему нужны windows.h и stdio.h .

  class FileGetter {WIN32_FIND_DATAA found;  HANDLE hfind;  char folderstar [255];  int chk; общедоступные: FileGetter (char * folder) {sprintf (folderstar, "% s \ *. *", папка);  hfind = FindFirstFileA (папка, & найдено); //пропускать .  FindNextFileA (hfind, & найдено);  } int getNextFile (char * fname) {//пропускает .. при первом вызове chk = FindNextFileA (hfind, & found);  если (chk) strcpy (fname, found.cFileName);  return chk;  }};  

1


Руководство GNU FTW

http://www.gnu.org/software/libc/manual/html_node/Simple-Directory-Lister.html#Simple-Directory-Lister

Кроме того, иногда полезно сразу перейти к источнику (каламбур). Вы можете многому научиться, взглянув на внутренности некоторых из наиболее распространенных команд в Linux. Я установил простое зеркало GNU coreutils на github (для чтения).

https://github.com/homer6/gnu_coreutils/blob/master/src/ls.c

Возможно, это не относится к Windows, но в ряде случаев можно использовать варианты Unix, используя эти методы.

Надеюсь, что это поможет …


Ответ Шривардхана отлично работает. Но если вы хотите использовать его в C ++ 14, просто измените пространство имен fs = experimental :: filesystem;

, т.е.

  #include  #include  #include  using namespace std; namespace fs = experimental :: filesystem; int main () {string path = "C: \ splits    ";  for (auto & p: fs :: directory_iterator (path)) cout > n;}  


  char ** getKeys (char * data_dir, char * tablename, int * num_keys) {char ** arr = malloc (MAX_RECORDS_PER_TABLE * sizeof (char *)); int i = 0; for (; i  d_name);} * (num_keys) = i; return arr;}  


Надеюсь, этот код вам поможет.

  #include  #include  #  включить  #include  using namespace std; string wchar_t2string (const wchar_t * wchar) {string str = "";  int index = 0;  в то время как (wchar [индекс]! = 0) {str + = (char) wchar [индекс];  ++ index;  } return str;} wchar_t * string2wchar_t (const string & str) {wchar_t wchar [260];  int index = 0;  в то время как (индекс  listFilesInDirectory (строка directoryName) {WIN32_FIND_DATA FindFileData;  wchar_t * FileName = string2wchar_t (directoryName);  ОБРАБОТКА hFind = FindFirstFile (Имя файла, & FindFileData);  vector  listFileNames;  listFileNames.push_back (wchar_t2string (FindFileData.cFileName));  while (FindNextFile (hFind, & FindFileData)) listFileNames.push_back (wchar_t2string (FindFileData.cFileName));  return listFileNames;} void main () {vector  listFiles;  listFiles = listFilesInDirectory ("C: \ *. txt "); для каждого (строка str в listFiles) cout  

1


Эта реализация реализует вашу цель, динамически заполняя массив строк содержимым указанного каталога.

  int exploreDirectory (  const char * dirpath, char *** list, int * numItems) {struct dirent ** direntList; int i; errno = 0; if ((* numItems = scandir (dirpath, & direntList, NULL, alphasort)) == -1  ) return errno; if (! ((* list) = malloc (sizeof (char *) * (* numItems)))) {fprintf (stderr, "Ошибка при выделении списка для списка файлов: dirpath =% s.  n"  , dirpath); exit (EXIT_FAILURE);} for (i = 0; i  d_name);} for (i = 0;  i  

1


Системный вызов!

  system ("dir/b/s/ad *> file_names.txt");  

Затем просто прочтите файл.

EDIT: Это ответ следует рассматривать как взлом, но он действительно работает (хотя и для конкретной платформы), если у вас нет доступа к более элегантным решениям.

2


У меня это работает. Извините, если я не могу вспомнить источник. Вероятно, это страница руководства.

  #include  int AnalizeDirectoryElement (const char * fpath, const struct stat * sb, int tflag, struct FTW * ftwbuf  ) {если (tflag == FTW_F) {std :: string strFileName (fpath);  DoSomethingWith (strFileName);  } return 0;  } void WalkDirectoryTree (const char * pchFileName) {int nFlags = 0;  если (nftw (pchFileName, AnalizeDirectoryElement, 20, nFlags) == -1) {ошибка ("nftw");  }} int main () {WalkDirectoryTree ("some_dir/");}  


вы можете напрямую получить все файлы в корневом каталоге, используя std :: experimental :: filesystem :: directory_iterator (). Затем прочтите имена этих файлов пути.

  #include  #include  #include  #include  using namespace std; namespace  fs = std :: experimental :: filesystem; void ShowListFile (string path) {for (auto & p: fs :: directory_iterator (path))/* получить каталог */cout  


Этот ответ должен работать для пользователей Windows, у которых возникли проблемы с тем, чтобы заставить это работать с Visual Studio с любым другим ответы.

  1. Загрузите файл dirent.h со страницы github. Но лучше просто использовать файл Raw dirent.h и следовать моим инструкциям ниже (именно так я заставил его работать).

    Страница Github для dirent.h для Windows: Страница Github для dirent .h

    Файл Raw Dirent: Файл Raw dirent.h

  2. Перейдите в свой проект и добавьте новый элемент ( Ctrl + Shift + A ). Добавьте файл заголовка (.h) и назовите его dirent.h.

  3. Вставьте код файла Raw dirent.h в свой заголовок.

  4. Включите «dirent.h» в свой код.

  5. Поместите ниже void filefinder () в коде и вызовите его из своей функции main или отредактируйте функцию, как вы хотите ее использовать.

      #include  #include  #include "dirent.h" string path = "C:/folder"; //Укажите здесь допустимый путь для foldervoid filefinder () {DIR * directory = opendir (path.c_str ());  struct dirent * direntStruct;  if (каталог! = NULL) {while (direntStruct = readdir (каталог)) {printf ("Имя файла:% s  n", direntStruct-> d_name); //Если вы используете //std :: cout  d_name }} closedir (directory);}  


  #include  #include  #include  пространство имен fs = std:  : файловая система; int main () {std :: string path = "/путь/к/каталогу";  for (const auto & entry: fs :: directory_iterator (path)) std :: cout  


Поскольку файлы и подкаталоги каталога обычно хранятся в древовидной структуре, интуитивно понятным способом является использование алгоритма DFS для рекурсивно пройти по каждому из них. Вот пример в операционной системе Windows с использованием основных файловых функций в io.h. Вы можете заменить эти функции на другой платформе. Я хочу сказать, что основная идея DFS полностью решает эту проблему.

  #include  #include  #include  using namespace std; void TraverseFilesUsingDFS (const string & folder_path) {_finddata_t file_info;  строка any_file_pattern = folder_path + "\ *";  intptr_t handle = _findfirst (any_file_pattern. c_str (), & file_info); //Если folder_path существует, использование any_file_pattern найдет как минимум два файла "."  и "..",//из которых "."  означает текущий каталог, а ".." означает родительский каталог if (handle == -1) {cerr  


Я попытался следовать примеру, приведенному в обоих ответах, и, возможно, стоит отметить, что похоже, что std :: filesystem :: directory_entry был изменен на not есть перегрузка оператора . Вместо std :: cout мне пришлось использовать следующее, чтобы скомпилировать и заставить его работать:

   #include  #include  #include  пространство имен fs = std :: filesystem; int main () {std :: string path = "/путь/к/каталогу";  for (const auto & p: fs :: directory_iterator (path)) std :: cout  

пытается передать p на std :: cout привело к отсутствующей ошибке перегрузки.


Основываясь на том, что опубликовал herohuyongtao, и несколько других сообщений:

http://www.cplusplus.com/forum/general/39766/

Каков ожидаемый тип ввода FindFirstFile?

Как преобразовать wstring в строку ?

Это решение для Windows.

Поскольку я хотел передать std :: string и вернуть вектор строк, мне пришлось сделать пару преобразований.

  #include  #include  #include  #include  #include  std :: vector   listFilesInDir (std :: string path) {std :: vector  имена; //Преобразование строки в wstring std :: wstring search_path = std :: wstring_convert > (). From_bytes (path);  WIN32_FIND_DATA fd;  HANDLE hFind = FindFirstFile (search_path. c_str (), & fd);  if (hFind! = INVALID_HANDLE_VALUE) {do {//читать все (реальные) файлы в текущей папке//, удалить '!'  прочтите 2 другие папки по умолчанию.  и .. if (! (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {//преобразование из широкого массива символов в узкий массив символов char ch [260];  char DefChar = '';  WideCharToMultiByte (CP_ACP, 0, fd.cFileName, -1, ch, 260, & DefChar, NULL);  names.push_back (ch);  }} while (:: FindNextFile (hFind, & fd));  :: FindClose (hFind);  } возвращать имена;}  

2


Просто то, что Хочу поделиться и поблагодарить за материал для чтения. Поиграйте с функцией, чтобы понять ее. Вам это может понравиться. e означает расширение, p — путь, а s — разделитель пути.

Если путь передается без конечного разделителя, разделитель будет добавлен к пути. Для расширения, если введена пустая строка, функция вернет любой файл, в имени которого нет расширения. Если была введена одна звездочка, будут возвращены все файлы в каталоге. Если длина e больше 0, но не является одиночным знаком *, то перед e будет добавлена ​​точка, если e не содержал точки в нулевой позиции.

Для возвращаемого значения. Если возвращается карта нулевой длины, значит, ничего не найдено, но каталог был открыт нормально. Если индекс 999 доступен из возвращаемого значения, но размер карты равен только 1, это означает, что возникла проблема с открытием пути к каталогу.

Обратите внимание, что для повышения эффективности эту функцию можно разделить на 3 меньшие функции. Вдобавок к этому вы можете создать функцию вызывающего абонента, которая будет определять, какую функцию он будет вызывать, на основе ввода. Почему это эффективнее? Сказано, что если вы собираетесь захватить все, что является файлом, выполняя этот метод, подфункция, созданная для захвата всех файлов, просто захватит все, что является файлами, и не должна оценивать какие-либо другие ненужные условия каждый раз, когда она находит файл.

Это также относится к случаям, когда вы захватываете файлы без расширения. Специальная встроенная функция для этой цели будет оценивать погоду только в том случае, если найденный объект является файлом, а затем, если в имени файла есть точка.

Сохранение может не быть много, если вы читаете только каталоги с небольшим количеством файлов. Но если вы читаете большое количество каталогов или если в каталоге есть несколько сотен тысяч файлов, это может быть огромной экономией.

  #include  #  include  #include  #include  #include  std :: map  getFile (std :: string p, std :: string e  = "", unsigned char s = '/') {if (p.size ()> 0) {if (p.back ()! = s) p + = s;  } if (e.size ()> 0) {if (e.at (0)! = '.' &&! (e.size () == 1 && e.at (0) == '*'))  e = ". "+ e;} DIR * dir; struct dirent * ent; struct stat sb; std :: map  r = {{999," FAILED "}}; std :: string temp; int f  = 0; bool fd; if ((dir = opendir (p.c_str ()))! = NULL) {r.erase (999); while ((ent = readdir (dir))! = NULL) {temp = ent  -> d_name; fd = temp.find (".")! = std :: string :: npos? true: false; temp = p + temp; if (stat (temp.c_str (), & sb) == 0 &&  S_ISREG (sb.st_mode)) {if (e.size () == 1 && e.at (0) == '*') {r [f] = temp; f ++;} else {if (e.size (  ) == 0) {if (fd == false) {r [f] = temp; f ++;} continue;} if (e.size ()> temp.size ()) continue; if (temp.substr (temp  .size () - e.size ()) == e) {r [f] = temp; f ++;}}}} closedir (dir); return r;} else {return r;}} void printMap (auto & m  ) {for (const auto & p: m) {std :: cout  k = getFile ("./", ""); printMap (k); return 0;}  


  #include  #include  используя пространство имен std; char ROOT [] = {'.'}; void listfiles (char * path) {DIR * dirp = opendir (path);  Dirent * dp;  while ((dp = readdir (dirp))! = NULL) {cout  d_name  d_reclen  1) путь = argv [1];  иначе путь = ROOT;  cout  


Попробуйте scandir () из dirent.h

man scandir ()


На основе ответов выше

  #  include  #include  #include  #ifdef _WIN32 # include  std :: vector  files_in_directory (std :: string path) {std :: vector  файлы; //проверка наличия каталога char fullpath [MAX_PATH];  GetFullPathName (путь.c_str (), MAX_PATH, полный путь, 0);  std :: string fp (полный путь);  if (GetFileAttributes (fp.c_str ())! = FILE_ATTRIBUTE_DIRECTORY) возвращают файлы; //получаем имена файлов WIN32_FIND_DATA findfiledata;  HANDLE hFind = FindFirstFile ((LPCSTR) (fp + "\ *"). C_str (), & findfiledata);  if (hFind! = INVALID_HANDLE_VALUE) {do {files.push_back (findfiledata.cFileName);  } while (FindNextFile (hFind, & findfiledata));  FindClose (hFind);  }//удаляем текущий и родительский каталоги files.erase (std :: find (files.begin (), files.end (), "."));  files.erase (std :: find (файлы. begin (), files.end (), "..")); //сортируем в алфавитном порядке std :: sort (files.begin (), files.end ());  return files;} # else # include  std :: vector  files_in_directory (каталог std :: string) {std :: vector  files; //открыть каталог DIR * dir;  dir = opendir (directory.c_str ());  if (dir == NULL) вернуть файлы; //получить имена файлов struct dirent * ent;  while ((ent = readdir (dir))! = NULL) files.push_back (ent-> d_name);  закрытый (реж); //удаляем текущий и родительский каталоги files.erase (std :: find (files.begin (), files.end (), "."));  files.erase (std :: find (files.begin (), files.end (), "..")); //сортируем в алфавитном порядке std :: sort (files.begin (), files.end ());  return files;} # endif//_WIN32  


Это сработало для меня. Он записывает файл только с именами (без пути) всех файлов. Затем он читает этот текстовый файл и печатает его для вас.

  void DisplayFolderContent () {system ("dir/n/b *> file_names.txt");  char ch;  std :: fstream myStream ("file_names.txt", std :: fstream :: in);  в то время как (myStream.get (ch)) {std :: cout  



Содержание
  1. File :: Apache Camel
  2. Формат URI
  3. Параметры URI
  4. Параметры пути (1 параметр):
  5. Параметры запроса (93 параметра):
  6. Операции перемещения и удаления
  7. Детальный контроль над опциями перемещения и предварительного перемещения
  8. О moveFailed
  9. Заголовки сообщений
  10. Только производитель файлов
  11. Только потребитель файла
  12. Batch Consumer
  13. Свойства Exchange, только потребитель файла
  14. Использование кодировки
  15. Общие проблемы с папками и именами файлов
  16. Выражение имени файла
  17. Использование файлов из папок, куда другие перетаскивают файлы напрямую
  18. Использование готовых файлов
  19. Запись готовых файлов
  20. Образцы
  21. Прочитать из каталога и записать в другой каталог с помощью отменяющее динамическое имя
  22. Рекурсивное чтение из каталога и запись в другой
  23. Использование flatten
  24. Чтение из каталога и операция перемещения по умолчанию
  25. Чтение из каталога и обработка сообщения в java
  26. Запись в файлы
  27. Запись в подкаталог с использованием Exchange.FILE_NAME
  28. Запись файла через временный каталог относительно конечного пункта назначения
  29. Использование выражения для имен файлов
  30. Избегание чтения одного и того же файла более одного раза (идемпотентный потребитель)
  31. Использование файлового репозитория идемпотентов
  32. Использование идемпотентного репозитория на основе JPA
  33. Фильтр с использованием org.apache.camel.component.file.GenericFileFilter
  34. Фильтрация с использованием средства сопоставления пути ANT
  35. Сортировка с использованием компаратора
  36. Сортировка с использованием sortBy
  37. Использование GenericFileProcessStrategy
  38. Использование фильтра
  39. Использование bridgeErrorHandler
  40. Ведение журнала отладки
  41. Автоконфигурация загрузки Spring

File :: Apache Camel

Начиная с Camel 1.0

И производитель, и потребитель поддерживаются.

Компонент File предоставляет доступ к файловым системам, позволяя обрабатывать файлы любыми другими компонентами Camel или сообщения от других компонентов для быть сохраненным на диск.

Формат URI

file:directoryName[?options ] 

или

file://directoryName[?options ] 

Где directoryName представляет собой базовый файловый каталог.

Вы можете добавить параметры запроса к URI в следующем формате: ? option = value & option = value &…

v>

Только каталоги

Camel поддерживает только конечные точки, настроенные с начальным каталогом . Таким образом, directoryName должен быть каталогом. Если вы хотите использовать только один файл, вы можете использовать параметр fileName , например задав fileName = thefilename . Кроме того, начальный каталог не должен содержать динамических выражений с заполнителями $ {} . Снова используйте параметр fileName , чтобы указать динамическую часть имени файла..

Избегайте чтения файлов, которые в настоящее время записываются другим приложением

Остерегайтесь JDK File IO API немного ограничен в определении того, записывает/копирует файл в данный момент другое приложение. И реализация может быть разной в зависимости от платформы ОС. Это может привести к тому, что Camel решит, что файл не заблокирован другим процессом, и начнет его использовать. Следовательно, вы должны сами исследовать, что подходит вашей среде. Чтобы помочь с этим, Camel предоставляет различные параметры readLock и параметр doneFileName , которые вы можете использовать. См. Также раздел Использование файлов из папок, куда другие перетаскивают файлы напрямую.

Параметры URI

Компонент File поддерживает 3 параметра, которые перечислены ниже.

Имя Описание По умолчанию Тип

bridgeErrorHandler (потребитель)

Разрешает для соединения потребителя с обработчиком ошибок маршрутизации Camel, что означает, что любые исключения, возникшие, когда потребитель пытается получить входящие сообщения или тому подобное, теперь будут обрабатываться как сообщение и обрабатываться обработчиком ошибок маршрутизации. По умолчанию потребитель будет использовать org.apache.camel.spi.ExceptionHandler для обработки исключений, которые будут регистрироваться на уровне WARN или ERROR и игнорироваться.

ложно

boolean

lazyStartProducer (производитель)

Должен ли производитель запускаться лениво (по первому сообщению). Запустив ленивый запуск, вы можете использовать это, чтобы разрешить CamelContext и маршруты для запуска в ситуациях, когда в противном случае производитель может выйти из строя во время запуска и вызвать сбой запуска маршрута. Если отложить этот запуск на «ленивый», тогда сбой запуска можно будет обработать во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Помните, что при обработке первого сообщения создание и запуск производителя может занять некоторое время и увеличить общее время обработки.

false

boolean

autowiredEnabled (расширенный)

Включено ли автоматическое подключение. Это используется для параметров автоматического подключения (параметр должен быть помечен как автоматически подключенный) путем поиска в реестре, чтобы найти единственный экземпляр соответствующего типа, который затем настраивается на компоненте. Это можно использовать для автоматической настройки источников данных JDBC, фабрик соединений JMS, клиентов AWS и т. Д..

true

boolean

Конечная точка файла настроена с использованием синтаксиса URI:

 file: directoryName 

со следующим путем и параметрами запроса:

Параметры пути (1 параметр):

Имя Описание По умолчанию Напечатайте

Обязательно Начальный каталог

Файл

Параметры запроса (93 параметра):

Имя Описание По умолчанию Тип

charset (common)

Этот параметр используется для указания кодировки файла. Вы можете использовать это на потребителе, чтобы указать кодировки файлов, которые позволяют Camel знать кодировку, в которой он должен загружать содержимое файла в случае доступа к содержимому файла. Точно так же при записи файла вы можете использовать эту опцию, чтобы указать кодировку для записи файла. Помните, что при записи файла Camel, возможно, придется прочитать содержимое сообщения в памяти, чтобы иметь возможность преобразовать данные в настроенную кодировку, поэтому не используйте это, если у вас большие сообщения.

String

doneFileName (common)

Producer: Если указано, то Camel запишет второй готовый файл, когда будет записан исходный файл. Готовый файл будет пустым. Эта опция настраивает, какое имя файла использовать. Либо вы можете указать фиксированное имя. Или вы можете использовать динамические заполнители. Готовый файл всегда будет записан в той же папке, что и исходный файл. Consumer: если указано, Camel будет потреблять файлы только в том случае, если существует готовый файл. Эта опция настраивает, какое имя файла использовать. Либо вы можете указать фиксированное имя. Или вы можете использовать динамические заполнители. Готовый файл всегда находится в той же папке, что и исходный файл. Только $ {file.name} и $ {file.name.next} поддерживаются в качестве динамических заполнителей.

String

fileName (общее)

Используйте выражение, например File Language, для динамической установки имени файла. Для потребителей он используется как фильтр имени файла. Для производителей он используется для оценки имени файла для записи. Если выражение установлено, оно имеет приоритет над заголовком CamelFileName. (Примечание: сам заголовок также может быть выражением). Параметры выражения поддерживают типы String и Expression. Если выражение является строковым, оно всегда вычисляется с использованием языка файлов.. Если выражение является типом выражения, используется указанный тип выражения — это позволяет, например, использовать выражения OGNL. Что касается потребителя, вы можете использовать его для фильтрации имен файлов, так что вы можете, например, использовать сегодняшний файл, используя синтаксис языка файлов: mydata — $ {date: now: yyyyMMdd} .txt. Производители поддерживают заголовок CamelOverruleFileName, который имеет приоритет над любым существующим заголовком CamelFileName; CamelOverruleFileName — это заголовок, который используется только один раз и упрощает задачу, поскольку позволяет избежать временного хранения CamelFileName и его последующего восстановления.

String

bridgeErrorHandler (потребитель)

Позволяет связать потребителя с обработчиком ошибок маршрутизации Camel, что означает, что любые исключения, возникшие, когда потребитель пытается забрать входящие сообщения или тому подобное, теперь будут обрабатываться как сообщение и обрабатывается обработчиком ошибок маршрутизации. По умолчанию потребитель будет использовать org.apache.camel.spi.ExceptionHandler для обработки исключений, которые будут регистрироваться на уровне WARN или ERROR и игнорироваться.

ложно

boolean

delete (потребитель)

Если true, файл будет удален после успешной обработки.

false

boolean

moveFailed (потребитель)

Устанавливает выражение ошибки перемещения на основе простого языка. Например, чтобы переместить файлы в подкаталог .error, используйте: .error. Примечание. При перемещении файлов в место сбоя Camel обработает ошибку и больше не заберет файл.

Строка

noop (потребитель)

Если true, файл никоим образом не перемещается и не удаляется. Этот вариант подходит для данных только для чтения или для требований типа ETL. Если noop = true, Camel также установит idempotent = true, чтобы не использовать одни и те же файлы снова и снова.

false

boolean

preMove (потребитель)

Выражение (например, File Language), используемое для динамической установки имени файла при его перемещении перед обработкой. Например, чтобы переместить незавершенные файлы в каталог заказов, установите для этого значения порядок.

String

preSort (потребитель)

Когда предварительная сортировка включена, потребитель будет сортировать имена файлов и каталогов во время опроса, которые были получены из файловой системы. Вы можете сделать это, если вам нужно работать с файлами в отсортированном порядке. Предварительная сортировка выполняется до того, как потребитель начнет фильтровать и принимать файлы для обработки Camel. Эта опция по умолчанию = false, что означает отключение.

false

boolean

рекурсивный (потребитель)

Если каталог, также будет искать файлы во всех подкаталогах.

false

логическое

sendEmptyMessageWhenIdle (потребитель)

Если потребитель опроса не опрашивал какие-либо файлы, вы можете включить эту опцию, чтобы вместо этого отправлять пустое сообщение (без тела).

false

boolean

directoryMustExist (потребитель)

Аналогично опции startDirectoryMustExist, но применяется во время опроса (после запуска потребителя).

false

boolean

exceptionHandler (потребитель)

Чтобы позволить потребителю использовать пользовательский ExceptionHandler. Обратите внимание: если опция bridgeErrorHandler включена, то эта опция не используется. По умолчанию потребитель обрабатывает исключения, которые регистрируются на уровне WARN или ERROR и игнорируются.

ExceptionHandler

exchangePattern (потребитель)

Устанавливает шаблон обмена, когда потребитель создает обмен. Существует 3 перечисления, и значение может быть одним из: InOnly, InOut, InOptionalOut

ExchangePattern

extendedAttributes (потребитель)

Чтобы определить, какие атрибуты файла представляют интерес. Как и posix: permissions, posix: owner, basic: lastAccessTime, он поддерживает базовые подстановочные знаки, такие как posix :, basic: lastAccessTime

Строка

inProgressRepository (потребитель)

Подключаемый репозиторий в процессе разработки org.apache.camel.spi.IdempotentRepository. Текущий репозиторий используется для учета текущих используемых файлов в процессе. По умолчанию используется репозиторий на основе памяти.

IdempotentRepository

localWorkDirectory (потребитель)

При потреблении локальный Рабочий каталог можно использовать для хранения содержимого удаленного файла непосредственно в локальных файлах, чтобы избежать загрузки содержимого в память. Это полезно, если вы используете очень большой удаленный файл и, таким образом, можете сэкономить память.

String

onCompletionExceptionHandler (потребитель)

Чтобы использовать настраиваемый org.apache.camel.spi.ExceptionHandler для обработки любых исключений, возникающих во время процесса завершения файла, когда потребитель выполняет либо фиксацию, либо откат. Реализация по умолчанию будет регистрировать любое исключение на уровне WARN и игнорировать.

ExceptionHandler

pollStrategy (потребитель)

Подключаемая стратегия org.apache.camel.PollingConsumerPollingStrategy, позволяющая предоставить вам пользовательская реализация для управления обработкой ошибок обычно возникала во время операции опроса до того, как Exchange был создан и перенаправлен в Camel.

PollingConsumerPollStrategy

probeContentType (потребитель)

Включить ли проверку типа содержимого. Если этот параметр включен, потребитель использует Files # probeContentType (java.nio.file.Path) для определения типа содержимого файла и сохраняет его как заголовок с ключом Exchange # FILE_CONTENT_TYPE в сообщении.

false

boolean

processStrategy (потребитель)

Подключаемый файл org.apache.camel.component.file .GenericFileProcessStrategy, позволяющий реализовать свой собственный параметр readLock или аналогичный. Может также использоваться, когда перед использованием файла должны быть выполнены особые условия, например, когда существует специальный готовый файл. Если этот параметр установлен, параметр readLock не применяется.

GenericFileProcessStrategy

startDirectoryMustExist (потребитель)

Будет ли начальный каталог должен существовать. Помните, что опция autoCreate включена по умолчанию, что означает, что начальный каталог обычно создается автоматически, если он не существует. Вы можете отключить autoCreate и включить его, чтобы обеспечить существование начального каталога. Выдает исключение, если каталог не существует.

false

boolean

startDirectoryMustHave Access (потребитель)

Имеет ли начальный каталог права доступа. Помните, что параметр startDirectoryMustExist должен иметь значение true, чтобы проверить, существует ли каталог. Выдает исключение, если у каталога нет разрешений на чтение и запись.

false

логическое

appendChars (производитель)

Используется для добавления символов (текста) после записи файлов. Это можно, например, использовать для добавления новых строк или других разделителей при записи и добавлении в существующие файлы. Чтобы указать символы новой строки (косая черта-n или косая черта-r) или табуляции (косая черта-t), используйте дополнительную косую черту, например косую черту-n.

String

fileExist (производитель)

Что делать, если файл с таким именем уже существует. Переопределение по умолчанию заменяет существующий файл. — Добавить — добавляет содержимое в существующий файл. — Ошибка — генерирует исключение GenericFileOperationException, указывающее на то, что файл уже существует. — Игнорировать — игнорирует проблему и не отменяет существующий файл, но предполагает, что все в порядке. — Move — опция требует использования опции moveExisting для настройки. Параметр eagerDeleteTargetFile можно использовать для управления действиями, если при перемещении файла уже существует существующий файл, что в противном случае приведет к сбою операции перемещения. Параметр «Переместить» переместит все существующие файлы перед записью целевого файла. — TryRename применимо, только если используется опция tempFileName. Это позволяет попробовать переименовать файл с временного имени на фактическое имя, не выполняя никаких проверок наличия. Эта проверка может быть быстрее в некоторых файловых системах и особенно на FTP-серверах. Имеется 6 перечислений, и значение может быть одним из: Override, Append, Fail, Ignore, Move, TryRename

Override

GenericFileExist

flatten (производитель )

Flatten используется для сглаживания пути к имени файла, чтобы удалить все ведущие пути, так что это просто имя файла. Это позволяет вам рекурсивно использовать подкаталоги, но когда вы, например, записываете файлы в другой каталог, они будут записаны в одном каталоге. Установка этого значения в true на производителе принудительно приводит к тому, что любое имя файла в заголовке CamelFileName будет удалено для любых начальных путей.

false

boolean

jailStartingDirectory (производитель )

Используется для блокировки (ограничения) записи файлов только в начальный каталог (и под). Это включено по умолчанию, чтобы Camel не мог записывать файлы во внешние каталоги (для большей безопасности из коробки). Вы можете отключить это, чтобы разрешить запись файлов в каталоги вне начального каталога, такие как родительские или корневые папки.

true

boolean

lazyStartProducer (производитель )

Должен ли производитель запускаться ленивым (по первому сообщению). Запустив ленивый запуск, вы можете использовать это, чтобы разрешить CamelContext и маршруты для запуска в ситуациях, когда в противном случае производитель может выйти из строя во время запуска и вызвать сбой запуска маршрута. Если отложить этот запуск на «ленивый», тогда сбой запуска можно будет обработать во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Помните, что при обработке первого сообщения создание и запуск производителя может занять некоторое время и увеличить общее время обработки.

false

boolean

moveExisting (производитель)

Выражение (например, File Language), используемое для вычисления имени файла, которое будет использоваться при настройке fileExist = Move. Чтобы переместить файлы в подкаталог резервной копии, просто введите резервную копию. Этот параметр поддерживает только следующие токены языка файлов: file: name, file: name.ext, file: name.noext, file: onlyname, file: onlyname.noext, file: ext и file: parent. Обратите внимание, что file: parent не поддерживается компонентом FTP, поскольку компонент FTP может перемещать любые существующие файлы только в относительный каталог на основе текущего каталога в качестве основы.

String

tempFileName ( производитель)

То же, что и параметр tempPrefix, но предлагает более детализированный контроль над именованием временного имени файла, поскольку он использует язык файлов. Местоположение для tempFilename определяется относительно конечного местоположения файла в параметре fileName, а не целевого каталога в базовом uri. Например, если параметр fileName включает префикс каталога: dir/finalFilename, тогда tempFileName относится к этому подкаталогу dir.

String

tempPrefix (производитель)

Эта опция используется для записи файла с использованием временного имени, а затем, после завершения записи, переименования его в настоящее имя. Может использоваться для идентификации записываемых файлов, а также для предотвращения чтения текущих файлов потребителями (без использования эксклюзивных блокировок чтения). Часто используется FTP при загрузке больших файлов.

String

allowNullBody (производитель)

Используется для указания, если при записи файла допускается пустое тело. Если задано значение true, будет создан пустой файл, если задано значение false, и при попытке отправить нулевое тело компоненту файла возникает исключение GenericFileWriteException «Невозможно записать пустое тело в файл». будет брошен. Если для параметра fileExist установлено значение «Переопределить», то файл будет усечен, а если задано добавление, файл останется без изменений.

false

boolean

chmod (производитель)

Укажите права доступа к файлу, который отправляет производитель, значение chmod должно быть от 000 до 777; Если есть первая цифра, как в 0755, мы ее проигнорируем.

String

chmodDirectory (производитель)

Укажите права доступа к каталогам, используемые, когда производитель создает отсутствующие каталоги, значение chmod должно быть от 000 до 777; Если есть первая цифра, как в 0755, мы ее проигнорируем.

String

eagerDeleteTargetFile (производитель)

Следует ли без промедления удалить любой существующий целевой файл. Этот параметр применяется только тогда, когда вы используете fileExists = Override и параметр tempFileName. Вы можете использовать это, чтобы отключить (установить в false) удаление целевого файла до записи временного файла.. Например, вы можете записывать большие файлы и хотите, чтобы целевой файл существовал во время записи временного файла. Это гарантирует, что целевой файл удаляется только до самого последнего момента, непосредственно перед тем, как временный файл будет переименован в целевое имя файла. Этот параметр также используется для управления тем, следует ли удалять какие-либо существующие файлы, когда включен fileExist = Move и существующий файл существует. Если этот параметр copyAndDeleteOnRenameFails false, то будет выброшено исключение, если существующий файл существовал, если он истинен, то существующий файл будет удален перед операцией перемещения.

истина

boolean

forceWrites (производитель)

Следует ли принудительно выполнять синхронизацию записи в файловую систему. Вы можете отключить это, если вам не нужен этот уровень гарантии, например, при записи в журналы/журналы аудита и т. Д .; это даст более высокую производительность.

true

boolean

keepLastModified (производитель)

Сохранит последнюю измененную метку времени из исходного файла (если есть). Будет использоваться заголовок Exchange.FILE_LAST_MODIFIED для определения отметки времени. Этот заголовок может содержать либо java.util.Date, либо длинный с меткой времени. Если метка времени существует и опция включена, она установит эту метку времени в записанном файле. Примечание: этот параметр применим только к производителю файла. Вы не можете использовать эту опцию ни с одним из производителей ftp.

false

boolean

moveExistingFileStrategy (производитель)

Стратегия (пользовательская стратегия), используемая для перемещения файла со специальным токеном именования для использования при настройке fileExist = Move. По умолчанию используется реализация, если не предоставлена ​​настраиваемая стратегия

FileMoveExistingStrategy

autoCreate (расширенный)

Автоматически создавать отсутствующие каталоги в пути к файлу. Для потребителя файлов это означает создание начального каталога. Для производителя файлов это означает каталог, в который должны быть записаны файлы.

true

логическое

bufferSize (расширенный)

Размер буфера в байтах, используемый для записи файлов (или в случае FTP для загрузки и выгрузки файлов).

131072

int

copyAndDeleteOnRenameFail (расширенный)

Следует ли откатиться и выполнить копирование и удаление файла, если файл не может быть переименован напрямую. Этот параметр недоступен для компонента FTP.

true

boolean

renameUsingCopy (расширенный)

Выполнение операций переименования с использованием стратегии копирования и удаления. Это в основном используется в средах, где обычная операция переименования ненадежна (например, в разных файловых системах или сетях). Этот параметр имеет приоритет над параметром copyAndDeleteOnRenameFail, который автоматически вернется к стратегии копирования и удаления, но только после дополнительных задержек.

false

boolean

синхронный (дополнительно)

Устанавливает, следует ли строго использовать синхронную обработку

false

boolean

antExclude (фильтр)

Исключение фильтра в стиле Ant. Если используются и antInclude, и antExclude, antExclude имеет приоритет над antInclude. Можно указать несколько исключений в формате с разделителями-запятыми.

String

antFilterCaseSensitive (фильтр)

Устанавливает чувствительность к регистру флаг на фильтре муравьев.

true

boolean

antInclude (фильтр)

Включение фильтра в стиле Ant. Множественные включения могут быть указаны в формате с разделителями-запятыми.

String

eagerMaxMessagesPerPoll (фильтр)

Позволяет управлять является ли ограничение от maxMessagesPerPoll активным или нет. Если есть желание, то ограничение будет на время сканирования файлов. Где false будет сканировать все файлы, а затем выполнять сортировку. Установка для этого параметра значения false позволяет сначала отсортировать все файлы, а затем ограничить опрос. Имейте в виду, что это требует более высокого использования памяти, так как все детали файла находятся в памяти для выполнения сортировки.

true

логическое

exclude (фильтр)

Используется для исключения файлов, если имя файла совпадает с шаблоном регулярного выражения (при сопоставлении регистр не учитывается). Обратите внимание, если вы используете такие символы, как знак плюса и другие, вам нужно будет настроить это с помощью синтаксиса RAW (), если вы настроите его как uri конечной точки. См. Дополнительные сведения при настройке uris конечной точки

String

excludeExt (filter)

Используется для исключения файлов, соответствующих файлу имя расширения (без учета регистра). Например, чтобы исключить файлы bak, используйте excludeExt = bak. Несколько расширений можно разделить запятыми, например, чтобы исключить файлы bak и dat, используйте excludeExt = bak, dat.

Строка

фильтр (фильтр)

Подключаемый фильтр как класс org.apache.camel.component.file.GenericFileFilter. Будет пропускать файлы, если фильтр возвращает false в методе accept ().

GenericFileFilter

filterDirectory (filter)

Фильтрует каталог на основе простого языка. Например, для фильтрации по текущей дате вы можете использовать простой шаблон даты, такой как $ {date: now: yyyMMdd}

Строка

filterFile (фильтр)

Фильтрует файл на основе простого языка. Например, для фильтрации по размеру файла вы можете использовать $ {file: size} 5000

String

идемпотент (фильтр)

Возможность использовать шаблон Idempotent Consumer EIP, чтобы позволить Camel пропускать уже обработанные файлы. По умолчанию будет использовать LRUCache на основе памяти, который содержит 1000 записей. Если noop = true, то идемпотент также будет включен, чтобы не использовать одни и те же файлы снова и снова.

false

Boolean

idempotentKey (фильтр)

Чтобы использовать настраиваемый идемпотентный ключ. По умолчанию используется абсолютный путь к файлу. Вы можете использовать File Language, например, чтобы использовать имя файла и размер файла, вы можете: idempotentKey = $ {file: name} — $ {file: size}

String

idempotentRepository (фильтр)

Подключаемый репозиторий org.apache.camel.spi.IdempotentRepository, который по умолчанию использует MemoryMessageIdRepository, если не указан и идемпотент равен true. /p>

IdempotentRepository

include (filter)

Используется для включения файлов, если имя файла соответствует шаблону регулярного выражения (соответствие без учета регистра). Обратите внимание, если вы используете такие символы, как знак плюса и другие, вам нужно будет настроить это с помощью синтаксиса RAW (), если вы настроите его как uri конечной точки. См. Дополнительные сведения о настройке uris конечной точки

String

includeExt (фильтр)

Используется для включения файлов, соответствующих файлу имя расширения (без учета регистра). Например, чтобы включить файлы txt, используйте includeExt = txt. Несколько расширений можно разделить запятыми, например, чтобы включить файлы txt и xml, используйте includeExt = txt, xml

Строка

maxDepth (фильтр)

Максимальная глубина прохождения при рекурсивной обработке каталога.

2147483647

int

maxMessagesPerPoll (фильтр)

Чтобы определить максимальное количество сообщений, собираемых за один опрос. По умолчанию максимум не установлен. Может использоваться для установки лимита, например, 1000, чтобы при запуске сервера не было тысяч файлов. Установите значение 0 или отрицательное, чтобы отключить его. Примечание. Если эта опция используется, то компоненты File и FTP будут ограничены перед любой сортировкой. Например, если у вас есть 100000 файлов и вы используете maxMessagesPerPoll = 500, то будут выбраны и отсортированы только первые 500 файлов. Вы можете использовать параметр eagerMaxMessagesPerPoll и установить для него значение false, чтобы разрешить сначала сканировать все файлы, а затем сортировать их.

int

minDepth (фильтр)

Минимальная глубина начала обработки при рекурсивной обработке каталога. Использование minDepth = 1 означает базовый каталог. Использование minDepth = 2 означает первый подкаталог.

int

перемещение (фильтр)

Выражение (например, Simple Language) используется для динамической установки имени файла при его перемещении после обработки. Чтобы переместить файлы в подкаталог .done, просто введите .done.

String

exclusiveReadLockStrategy (блокировка)

Подключаемый блокировка чтения как реализация org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy.

GenericFileExclusiveReadLockStrategy

readLock (блокировка)

Используется потребителем для опроса файлов только в том случае, если у него есть исключительная блокировка чтения для файла (т.е. файл не обрабатывается или не записывается). Camel будет ждать, пока не будет предоставлена ​​блокировка файла. Этот параметр обеспечивает стратегии сборки: — none — Блокировка чтения не используется — markerFile — Camel создает файл маркера (fileName.camelLock), а затем удерживает на нем блокировку. Этот параметр недоступен для компонента FTP — изменено — Изменено использует метку длины/изменения файла, чтобы определить, копируется ли файл в данный момент или нет. По крайней мере, для определения этого потребуется 1 секунда, поэтому этот параметр не может потреблять файлы так же быстро, как другие, но может быть более надежным, поскольку API ввода-вывода JDK не всегда может определить, используется ли файл в настоящее время другим процессом. Параметр readLockCheckInterval может использоваться для установки частоты проверки. — fileLock — для использования java.nio.channels.FileLock. Этот параметр недоступен для ОС Windows и компонента FTP. Этого подхода следует избегать при доступе к удаленной файловой системе через монтирование/общий ресурс, если эта файловая система не поддерживает распределенные блокировки файлов. — rename — rename используется для использования попытки переименовать файл в качестве теста, если мы можем получить эксклюзивную блокировку чтения. — idempotent — (только для файлового компонента) идемпотент предназначен для использования idempotentRepository в качестве блокировки чтения. Это позволяет использовать блокировки чтения, которые поддерживают кластеризацию, если реализация идемпотентного репозитория поддерживает это. — idempotent-changed — (только для файлового компонента) idempotent-changed предназначен для использования idempotentRepository и изменен как комбинированная блокировка чтения. Это позволяет использовать блокировки чтения, которые поддерживают кластеризацию, если реализация идемпотентного репозитория поддерживает это. — idempotent-rename — (только для файлового компонента) idempotent-rename используется для использования idempotentRepository и переименования в качестве комбинированной блокировки чтения. Это позволяет использовать блокировки чтения, которые поддерживают кластеризацию, если реализация идемпотентного репозитория поддерживает это. Примечание: различные блокировки чтения не все подходят для работы в кластерном режиме, когда одновременные потребители на разных узлах конкурируют за одни и те же файлы в общей файловой системе . В markerFile используется операция, близкая к атомарной, для создания пустого файла маркера, но его работа в кластере не гарантируется. FileLock может работать лучше, но тогда файловая система должна поддерживать распределенные блокировки файлов и так далее. Использование идемпотентной блокировки чтения может поддерживать кластеризацию, если идемпотентный репозиторий поддерживает кластеризацию, например Hazelcast Component или Infinispan. Всего имеется 8 перечислений, и значение может быть одним из: none, markerFile, fileLock, rename, changed, idempotent, idempotent-changed, idempotent-rename

none

String

readLockCheckInterval (блокировка)

Интервал в миллисекундах для блокировки чтения, если поддерживается блокировкой чтения. Этот интервал используется для сна между попытками получить блокировку чтения. Например, при использовании измененной блокировки чтения вы можете установить более высокий интервал, чтобы обеспечить медленную запись. По умолчанию 1 сек. может быть слишком быстрым, если производитель очень медленно записывает файл. Примечание. Для FTP значение readLockCheckInterval по умолчанию равно 5000. Значение readLockTimeout должно быть выше, чем readLockCheckInterval, но практическое правило должно иметь тайм-аут, который по крайней мере в 2 или более раз превышает readLockCheckInterval. Это необходимо для обеспечения того, чтобы процессу блокировки чтения было предоставлено время ожидания, чтобы попытаться захватить блокировку до того, как истечет время ожидания.

1000

long

readLockDeleteOrphanLockFiles (lock)

Должна ли блокировка чтения с файлами маркеров при запуске удалять любые потерянные файлы блокировки чтения, которые могли остаться в файловой системе , если Camel не был правильно завершен (например, сбой JVM). Если установить для этого параметра значение false, любой потерянный файл блокировки приведет к тому, что Camel не попытается получить этот файл, это также может быть связано с тем, что другой узел одновременно читает файлы из того же общего каталога.

true

boolean

readLockIdempotentReleaseAsync (lock)

Должна ли задача отложенного выпуска быть синхронной или асинхронной. Дополнительные сведения см. В параметре readLockIdempotentReleaseDelay..

false

boolean

readLockIdempotentReleaseAsync PoolSize (блокировка)

Число потоков в запланированном пуле потоков при использовании задач асинхронного выпуска. Использование по умолчанию 1 основных потоков должно быть достаточным почти во всех случаях использования, установите более высокое значение только в том случае, если обновление идемпотентного репозитория происходит медленно или есть много файлов для обработки. Этот параметр не используется, если вы используете общий пул потоков, настроив параметр readLockIdempotentReleaseExecutorService. Дополнительные сведения см. В параметре readLockIdempotentReleaseDelay.

int

readLockIdempotentReleaseDelay (lock)

Отложить ли задачу выпуска в течение миллисекунд. Это можно использовать, чтобы отложить задачи выпуска, чтобы расширить окно, когда файл рассматривается как заблокированный для чтения, в сценарии активного/активного кластера с общим идемпотентным репозиторием, чтобы другие узлы не могли потенциально сканировать и получать тот же файл из-за к условиям гонки. Расширение временного окна выпуска задач помогает предотвратить такие ситуации. Задержка примечания требуется только в том случае, если вы настроили для readLockRemoveOnCommit значение true.

int

readLockIdempotentRelease ExecutorService (блокировка)

Чтобы использовать настраиваемый и общий пул потоков для задач асинхронного выпуска. Дополнительные сведения см. В параметре readLockIdempotentReleaseDelay.

ScheduledExecutorService

readLockLoggingLevel (lock)

Уровень ведения журнала, используемый при чтении блокировка не может быть получена. По умолчанию DEBUG регистрируется. Вы можете изменить этот уровень, например, на ВЫКЛ, чтобы не вести журнал. Эта опция применима только для readLock типов: измененный, fileLock, идемпотент, идемпотент-измененный, идемпотент-переименование, переименование. Всего существует 6 перечислений, и значение может быть одним из: TRACE, DEBUG, INFO, WARN, ERROR, OFF

DEBUG

LoggingLevel

readLockMarkerFile (блокировка )

Следует ли использовать файл маркера с измененным, переименованным или эксклюзивным типом блокировки чтения. По умолчанию файл маркера также используется для защиты от других процессов, собирающих те же файлы. Это поведение можно отключить, установив для этого параметра значение false. Например, если вы не хотите записывать файлы маркеров в файловые системы приложением Camel.

true

логическое

readLockMinAge (блокировка)

Эта опция применяется только для readLock = changed. Он позволяет указать минимальный возраст файла, который должен быть перед попыткой получить блокировку чтения.. Например, используйте readLockMinAge = 300s, чтобы требовать, чтобы файл был старше 5 минут. Это может ускорить измененную блокировку чтения, поскольку она будет пытаться получить только файлы, возраст которых не меньше заданного.

0

long

readLockMinLength (блокировка )

Эта опция применяется только для readLock = changed. Это позволяет вам настроить минимальную длину файла. По умолчанию Camel ожидает, что файл будет содержать данные, и поэтому значение по умолчанию равно 1. Вы можете установить для этого параметра значение ноль, чтобы разрешить использование файлов нулевой длины.

1

long

readLockRemoveOnCommit (блокировка)

Этот параметр применяется только для readLock = idempotent. Он позволяет указать, следует ли удалять запись имени файла из репозитория идемпотентов, когда обработка файла завершена успешно и происходит фиксация. По умолчанию файл не удаляется, что гарантирует отсутствие каких-либо условий гонки, поэтому другой активный узел может попытаться захватить файл. Вместо этого идемпотентный репозиторий может поддерживать стратегии выселения, которые вы можете настроить для удаления записи имени файла через X минут — это гарантирует отсутствие проблем с условиями гонки. Дополнительные сведения см. В параметре readLockIdempotentReleaseDelay.

false

boolean

readLockRemoveOnRollback (блокировка)

Эта опция применяется только для readLock = idempotent. Он позволяет указать, следует ли удалять запись имени файла из репозитория идемпотентов, если обработка файла завершилась неудачно и произойдет откат. Если этот параметр имеет значение false, то запись имени файла подтверждается (как если бы файл был зафиксирован).

true

boolean

readLockTimeout (блокировка )

Дополнительный тайм-аут в миллисекундах для блокировки чтения, если поддерживается блокировкой чтения. Если не удалось предоставить блокировку чтения и сработал тайм-аут, Camel пропустит файл. При следующем опросе Camel снова попробует файл, и на этот раз, возможно, будет предоставлена ​​блокировка чтения. Используйте значение 0 или ниже, чтобы указать навсегда. В настоящее время fileLock изменен и переименован поддерживает тайм-аут. Примечание. Для FTP значение readLockTimeout по умолчанию составляет 20000 вместо 10000. Значение readLockTimeout должно быть выше readLockCheckInterval, но практическое правило должно иметь тайм-аут, который по крайней мере в 2 или более раз превышает readLockCheckInterval. Это необходимо для обеспечения того, чтобы процессу блокировки чтения было предоставлено время ожидания, чтобы попытаться захватить блокировку до того, как истечет время ожидания.

10000

long

backoffErrorThreshold (scheduler)

Количество последующих опросов об ошибках (неудачных из-за некоторой ошибки), которые должны произойти до того, как backoffMultipler должен сработать.

int

backoffIdleThreshold (планировщик)

Количество последующих опросов в режиме ожидания, которые должны произойти до того, как backoffMultipler должен запустить -в.

int

backoffMultiplier (планировщик)

Разрешить запланированному опросу потребителя отсрочки, если был количество последующих простоев/ошибок подряд. Множитель — это количество опросов, которые будут пропущены до того, как следующая фактическая попытка будет повторена. Когда используется этот параметр, необходимо также настроить backoffIdleThreshold и/или backoffErrorThreshold.

int

delay (планировщик)

Миллисекунды до следующего опроса.

500

long

жадный (планировщик)

Если включен жадный режим, то ScheduledPollConsumer сразу же снова запустится, если предыдущий прогон опросил 1 или более сообщений.

false

boolean

initialDelay (scheduler)

Миллисекунды до начала первого опроса.

1000

long

repeatCount (планировщик)

Задает максимальный предел количества возгораний. Поэтому, если вы установите его в 1, планировщик сработает только один раз. Если вы установите его на 5, он сработает только пять раз. Нулевое или отрицательное значение означает вечное срабатывание.

0

long

runLoggingLevel (планировщик)

При опросе потребитель записывает начало/завершение строки журнала. Эта опция позволяет вам настроить для этого уровень ведения журнала. Всего имеется 6 перечислений, и значение может быть одним из: TRACE, DEBUG, INFO, WARN, ERROR, OFF

TRACE

LoggingLevel

scheduleExecutorService (планировщик )

Позволяет настроить пользовательский/общий пул потоков для использования потребителем. По умолчанию у каждого потребителя есть собственный пул однопоточных потоков.

ScheduledExecutorService

планировщик (планировщик)

Использовать планировщик cron из компонентов camel-spring или camel-quartz. Используйте пружину значений или кварц для встроенного планировщика

none

Object

schedulerProperties (планировщик)

Для настройки дополнительных свойств при использовании настраиваемого планировщика или любого планировщика на основе Quartz, Spring.

Карта

startScheduler (планировщик)

Следует ли запускать планировщик автоматически.

true

boolean

timeUnit (планировщик)

Единица времени для параметров initialDelay и delay. Всего имеется 7 перечислений, и значение может быть одним из: НАНОСЕКУНД, МИКРОСЕКУНД, МИЛЛИСЕКУНД, СЕКУНД, МИНУТ, ЧАСОВ, ДНЕЙ

МИЛЛИСЕКУНД

TimeUnit

useFixedDelay (планировщик)

Управляет использованием фиксированной задержки или фиксированной скорости. Подробнее см. ScheduledExecutorService в JDK.

true

boolean

в случайном порядке (сортировка)

Перемешать список файлов (отсортировать в случайном порядке)

false

логическое

sortBy (сортировка)

Встроенная сортировка с использованием языка файлов. Поддерживает вложенную сортировку, поэтому вы можете сортировать по имени файла и в качестве второй группы сортировать по дате изменения.

Строка

sorter (sort)

Подключаемый сортировщик как класс java.util.Comparator.

Comparator

Поведение по умолчанию для производителя файлов

По умолчанию он заменяет любой существующий файл, если он существует с тем же именем.

Операции перемещения и удаления

Любое перемещение или операции удаления выполняются после завершения (после команды) маршрутизации; поэтому во время обработки Exchange файл все еще находится в папке входящих.

Давайте проиллюстрируем это на примере:

  from ("file://inbox? move = .done") .to ("bean: handleOrder  ");  

Когда файл помещается в папку inbox , файл потребитель замечает это и создает новый FileExchange , который перенаправляется на bean-компонент handleOrder . Затем компонент обрабатывает объект File . На данный момент файл все еще находится в папке inbox . После завершения bean-компонента и, следовательно, завершения маршрута, потребитель файла выполнит операцию перемещения и переместит файл в подпапку .done ..

Параметры move и preMove рассматриваются как имя каталога (хотя если вы используете такое выражение, как File Language или Simple, то результатом оценки выражения будет имя файла, которое будет использоваться — например, если вы установите

  move = ../backup/copy-of - $ {file: name}  

то, используя File Language, который мы используем, возвращает имя файла, которое будет использоваться), которое может быть относительным или абсолютным. Если относительный, каталог создается как подпапка внутри папки, в которой был использован файл.

По умолчанию Camel перемещает использованные файлы в папку Подпапка .camel относительно каталога, в котором был использован файл.

Если вы хотите удалить файл после обработки, маршрут должен быть:

  from ("file://inobox? delete = true").  to ("bean: handleOrder");  

Мы ввели предварительное перемещение операция по перемещению файлов до их обработки. Это позволяет вам отмечать, какие файлы были просканированы при перемещении в эту подпапку перед обработкой.

   from ("file://inbox? preMove = inprogress") .to ("bean: handleOrder");  

Вы можете комбинировать pre и обычный ход:

  из (  "file://inbox? preMove = inprogress & move = .done") .to ("bean: handleOrder");  

Таким образом, в этой ситуации файл находится в папке inprogress при обработке, а после обработки он перемещается в папку .done .

Детальный контроль над опциями перемещения и предварительного перемещения

Параметры move и preMove основаны на выражениях, поэтому у нас есть все возможности языка файлов для расширенной настройки каталога и шаблона имени.
На самом деле верблюд будет в окончательно преобразовать имя каталога, которое вы вводите, в выражение языка файлов. Поэтому, когда мы вводим move = .done , Camel преобразует это в: $ {file: parent}/. Done/$ {file: onlyname} . Это делается только в том случае, если Camel обнаруживает, что вы сами не указали $ {} в значении опции. Поэтому, когда вы вводите $ {} Camel, он не преобразует его, и, таким образом, у вас есть все возможности.

Итак, если мы хотим переместить файл в резервную папку с сегодняшней датой в качестве шаблона, мы можем сделать:

move=backup/${date:now:yyyyMMdd}/${file:name} 

О moveFailed

moveFailed Параметр позволяет вам перемещать файлы, которые не могут быть успешно обработаны, в другое место, например в папку ошибок по вашему выбору. Например, чтобы переместить файлы в папку ошибок с меткой времени, вы можете использовать moveFailed =/error/$ { file: name.noext } - $ {date: now: ггггММддЧЧммссССС}. $ {`` file: ext }.

Дополнительные примеры см. на языке файлов

Заголовки сообщений

Этот компонент поддерживает следующие заголовки:

Только производитель файлов

Заголовок Описание

CamelFileName

Задает имя файла для записи (относительно каталога конечной точки ). Это имя может быть String ; String с выражением File Language или Simple; или объект Expression. Если это null , то Camel автоматически сгенерирует имя файла на основе уникального идентификатора сообщения.

CamelFileNameProduced

Фактический абсолютный путь к файлу (путь + имя) для записанного выходного файла. Этот заголовок установлен Camel, и его цель — предоставить конечным пользователям имя записанного файла.

CamelOverruleFileName

Используется для отмены заголовка CamelFileName и использует вместо него значение ( но только один раз, поскольку производитель удалит этот заголовок после записи файла). Значение может быть только строкой. Обратите внимание, что если параметр fileName был настроен, он все еще оценивается.

Только потребитель файла

Заголовок Описание

CamelFileName

Имя потребляемого файла как относительный путь к файлу со смещением от начальный каталог, настроенный на конечной точке.

CamelFileNameOnly

Только имя файла (имя без начальных путей).

CamelFileAbsolute

Параметр boolean , определяющий, обозначает ли потребляемый файл абсолютное путь или нет. Обычно для относительных путей должно быть false .. Абсолютные пути обычно не используются, но мы добавили параметр перемещения, чтобы разрешить перемещение файлов по абсолютным путям. Но может использоваться и в другом месте.

CamelFileAbsolutePath

Абсолютный путь к файлу. Для относительных файлов этот путь содержит относительный путь.

CamelFilePath

Путь к файлу. Для относительных файлов это начальный каталог + относительное имя файла. Для абсолютных файлов это абсолютный путь.

CamelFileRelativePath

Относительный путь.

CamelFileParent

Родительский путь.

CamelFileLength

Значение long , содержащее размер файла.

CamelFileLastModified

Значение Long , содержащее метку времени последнего изменения файла.

Batch Consumer

Этот компонент реализует Batch Consumer.

Свойства Exchange, только потребитель файла

Поскольку потребитель файла реализует BatchConsumer , он поддерживает пакетирование файлов, которые он опрашивает. Под пакетной обработкой мы подразумеваем, что Camel добавит в Exchange следующие дополнительные свойства, чтобы вы знали количество опрошенных файлов, текущий индекс и то, завершен ли пакет уже.

Свойство Описание

CamelBatchSize

Общее количество файлов, опрошенных в этом пакете.

CamelBatchIndex

Текущий индекс пакета. Начинается с 0.

CamelBatchComplete

Логическое значение , указывающее последний Exchange в пакете. Имеет значение только true для последней записи.

Это позволяет вам, например, узнать, сколько файлов существует в этом пакете, и, например, позволить Aggregator2 агрегировать это количество файлов.

Использование кодировки

Начиная с Camel 2.9.3
Параметр charset позволяет настраивать кодирование файлов на конечных точках потребителя и производителя. Например, если вы читаете файлы utf-8 и хотите преобразовать файлы в iso-8859-1, вы можете сделать:

   from ("file: inbox? charset = utf-8"). to ("file: outbox? charset = iso-8859-1")  

Вы также можете использовать convertBodyTo в маршруте. В приведенном ниже примере у нас все еще есть входные файлы в формате utf-8, но мы хотим преобразовать содержимое файла в массив байтов в формате iso-8859-1. А затем позвольте bean-компоненту обработать данные. Перед записью содержимого в папку исходящих сообщений с использованием текущей кодировки.

  from ("file: inbox? Charset =  utf-8 ") .convertBodyTo (byte []. class," iso-8859-1 ") .to (" bean: myBean ") .to (" file: outbox ");  

Если вы опустите кодировку в конечной точке потребителя, то Camel не знает кодировку файла и по умолчанию будет использовать «UTF-8». Однако вы можете настроить системное свойство JVM для переопределения и использования другой кодировки по умолчанию с помощью ключа org.apache.camel.default.charset .

В приведенном ниже примере это может быть проблемой, если файлы не в кодировке UTF-8, которая будет кодировкой по умолчанию для чтения файлов.
В этом примере при записи файлов содержимое уже преобразовано в массив байтов, и поэтому содержимое будет записано напрямую как есть (без дополнительных кодировок).

   from ("file: inbox") .convertBodyTo (byte []. class, "iso-8859-1") .to ("bean: myBean") .to ("file: outbox");  

Вы также можете переопределить и контролировать динамическую кодировку при записи файлов, установив свойство на обмене с помощью ключа Exchange.CHARSET_NAME . Например, в приведенном ниже маршруте мы устанавливаем свойство со значением из заголовка сообщения.

  from ("file  : inbox ") .convertBodyTo (byte []. class," iso-8859-1 ") .to (" bean: myBean ") .setProperty (Exchange.CHARSET_NAME, header (" someCharsetHeader ")) .to (" файл:  outbox ");  

Мы предлагаем сделать все проще, поэтому, если вы выбираете файлы с той же кодировкой и хотите напишите файлы в определенной кодировке, а затем используйте параметр charset на конечных точках.

Обратите внимание, что если вы явно настроили параметр charset на конечной точке, то эта конфигурация используется независимо от свойства Exchange.CHARSET_NAME .

Если у вас есть проблемы, вы можете включить ведение журнала DEBUG в org.apache.camel.component.file , и Camel журналы, когда он читает/записывает файл с использованием определенной кодировки.
Например, маршрут ниже будет записывать е следующее:

  from ("file: inbox? charset = utf-8"). to ("file: outbox? charset = iso-8859-1")  

И журналы:

  DEBUG GenericFileConverter - чтение файла/Users/davsclaus/workspace/camel/camel-core/target/charset/input/input.  txt с кодировкой utf-8DEBUG FileOperations - Использование Reader для записи файла: target/charset/output.txt с кодировкой: iso-8859-1  

Общие проблемы с папками и именами файлов

Когда Camel создает файлы (записывает файлы), возникает несколько ошибок, влияющих на то, как установить имя файла по вашему выбору. По умолчанию Camel будет использовать идентификатор сообщения в качестве имени файла, а поскольку идентификатор сообщения обычно является уникальным сгенерированным идентификатором, вы получите такие имена файлов, как: ID-MACHINENAME-2443-1211718892437-1-0 . Если такое имя файла нежелательно, вы должны указать имя файла в заголовке сообщения CamelFileName . Также можно использовать константу Exchange.FILE_NAME .

Приведенный ниже пример кода создает файлы, используя идентификатор сообщения как имя файла:

  from ("direct: report"). to ("file: target/reports")  ;  

Чтобы использовать report.txt в качестве имени файла, вы должны:

  from ("direct: report"). setHeader (Exchange.FILE_NAME, constant ("report.txt")  ) .to ("file: target/reports");  

  1. то же, что и выше, но с CamelFileName :

  from ("direct: report"). setHeader ("CamelFileName", constant ("report.txt")). to ("file: target/reports");  

И синтаксис, в котором мы устанавливаем имя файла на конечной точке с помощью параметра URI fileName .

  from ("direct: report"). to ("file: target/r  eports/? fileName = report.txt ");  

Выражение имени файла

Имя файла можно задать либо с помощью параметра expression , либо как строковое выражение языка файлов в Заголовок CamelFileName . См. Синтаксис и примеры на языке файлов.

Использование файлов из папок, куда другие перетаскивают файлы напрямую

Будьте осторожны, если вы потребляете файлы из папки, в которую другие приложения записывают файлы напрямую. Взгляните на различные параметры readLock, чтобы увидеть, что подходит для ваших вариантов использования. Однако лучший подход — записать в другую папку и после записи переместить файл в папку для размещения.. Однако, если вы записываете файлы непосредственно в папку для перетаскивания, то измененная опция может лучше определить, записывается/копируется ли файл в данный момент, поскольку он использует алгоритм изменения файла, чтобы увидеть, изменяется ли размер/модификация файла с течением времени. Другие параметры readLock полагаются на Java File API, который, к сожалению, не всегда хорошо обнаруживает это. Вы также можете посмотреть параметр doneFileName, который использует файл-маркер (файл done), чтобы сигнализировать, когда файл готов и готов к использованию.

Использование готовых файлов

Начиная с Camel 2.6

См. также раздел Запись готовых файлов ниже.

Если вы хотите только для использования файлов, когда готовый файл существует, вы можете использовать параметр doneFileName в конечной точке.

  from ("file: bar? doneFileName = done");  

Будет использоваться только файлы из папки панели, если готовый файл существует в том же каталоге, что и целевые файлы. Camel автоматически удалит готовый файл , когда закончит использование файлов. Camel не удаляет автоматически файл done , если настроен noop = true .

Однако чаще всего используется один файл done для каждого целевого файла. Это означает, что существует соотношение 1: 1. Для этого вы должны использовать динамические заполнители в параметре doneFileName . В настоящее время Camel поддерживает следующие два динамических токена: file: name и file: name.noext , которые должны быть заключены в $ {}. Потребитель поддерживает только статическую часть имени файла done как префикс или суффикс (но не оба сразу).

  from ("file: bar? doneFileName = $ {file: name} .done");  

В этом примере будут опрашиваться только файлы, если существует готовый файл с именем имя файла .done. Например

  • hello.txt — это файл, который нужно использовать

  • hello.txt.done — это связанный файл готовой

Вы также можете использовать префикс для готового файла, например:

  from("file:bar?doneFileName=ready-${file:name}"); 

  • hello.txt — это файл, который нужно использовать

  • ready-hello.txt — это связанный файл готовой

Запись готовых файлов

Начиная с Camel 2.6

После того, как вы написали файл, вы можете захотеть написать дополнительный done файл как своего рода маркер, чтобы указать другим, что файл закончено и было написано. Для этого вы можете использовать параметр doneFileName в конечной точке производителя файла.

  .to ("file: bar? doneFileName = done");  

Просто создаст файл с именем done в том же каталоге, что и целевой файл.

Однако более распространено иметь один готовый файл для каждого целевого файла. Это означает, что существует соотношение 1: 1. Для этого вы должны использовать динамические заполнители в параметре doneFileName . В настоящее время Camel поддерживает следующие два динамических токена: file: name и file: name.noext , которые должны быть заключены в $ {}.

  .to ("file: bar? doneFileName = done - $ {file: name}");  

Например, создаст файл с именем done-foo.txt , если целевой файл был foo.txt в том же каталоге, что и целевой файл.

  .to ("file  : bar? doneFileName = $ {file: name} .done ");  

Например, создаст файл с именем foo.txt.done , если целевой файл находился foo.txt в том же каталоге, что и целевой файл.

.to("file:bar?doneFileName=${file:name.noext}.done"); 

Например, создаст файл с именем foo.done , если целевой файл был foo.txt в том же каталоге, что и целевой файл .

Образцы

# == = Чтение из каталога и запись в другой каталог

  from ("file://inputdir/? Delete =  true ") .to (" file://outputdir ")  

Прочитать из каталога и записать в другой каталог с помощью отменяющее динамическое имя

  from ("file://inputdir/? delete = true") .to ("file://outputdir? overruleFile = copy-of - $ {file: name} ")  

Прослушать каталог и создать сообщение для каждого файла, помещенного туда. Скопируйте содержимое в outputdir и удалите файл в inputdir .

Рекурсивное чтение из каталога и запись в другой

  from ("file://inputdir/? recursive = true & delete  = true ") .to (" file://outputdir ")  

Прослушайте каталог и создайте сообщение для каждый файл закинул туда. Скопируйте содержимое в outputdir и удалите файл в inputdir . Будет рекурсивно сканировать подкаталоги. Разместит файлы в той же структуре каталогов в outputdir , что и inputdir , включая все подкаталоги.

  inputdir/foo.txtinputdir/sub/bar. txt  

Результатом будет следующий формат вывода:

outputdir/foo.txtoutputdir/sub/bar.txt 

Использование flatten

Если вы хотите хранить файлы в каталоге outputdir в том же каталоге, игнорируя макет исходного каталога (например, чтобы выровнять путь), вы просто добавляете параметр flatten = true на стороне производителя файла:

  from ("file://inputdir/? recursive = true & delete = true") .to ("file://outputdir? flatten = true")   

Результатом будет следующий формат вывода:

  outputdir/foo.txtoutputdir/bar.txt  

Чтение из каталога и операция перемещения по умолчанию

Camel по умолчанию перемещает любой обработанный файл в .camel подкаталог в каталоге, из которого был получен файл.

  from ("file://inputdir/ ? recursive = true & delete = true ") .to (" file://outputdir ")  

Влияет на макет следующим образом :

  inputdir/foo.txtinputdir/ sub/bar.txt  

  inputdir/.camel/foo.txtinputdir/sub/.camel/bar.txtoutputdir/foo.txtoutputdir/sub/bar.txt   

Чтение из каталога и обработка сообщения в java

  from ("file://inputdir/") .process (new Processor () {public void process (Exchange exchange) throws Exception {body object  = exchange.getIn (). getBody (); //выполняем некоторую бизнес-логику с телом ввода}});  

Тело будет File , указывающий на файл, который только что был помещен в каталог inputdir .

Запись в файлы

Camel, конечно, также может записывать файлы, то есть создавать файлы. В приведенном ниже примере мы получаем несколько отчетов об очереди SEDA, которые мы обрабатываем, прежде чем они будут записаны в каталог.

Запись в подкаталог с использованием Exchange.FILE_NAME

Используя один маршрут, можно записать файл в любое количество подкаталогов. Если у вас настроен маршрут как таковой:

      

У вас может быть myBean задайте для заголовка Exchange.FILE_NAME такие значения, как:

  Обмен. FILE_NAME = hello.txt =>/rootDirectory/hello.txtExchange.FILE_NAME = foo/bye.txt =>/rootDirectory/foo/bye.txt  

Это позволяет использовать один маршрут для записи файлов в несколько пунктов назначения.

Запись файла через временный каталог относительно конечного пункта назначения

Иногда вам нужно временно записать файлы в какой-либо каталог относительно каталога назначения. Такая ситуация обычно возникает, когда какой-то внешний процесс с ограниченными возможностями фильтрации читает из каталога, в который вы пишете. В приведенном ниже примере файлы будут записаны в каталог /var/myapp/filesInProgress , а после завершения передачи данных они будут атомарно перемещены в каталог/var/myapp/finalDirectory.

  from ("direct: start").  to ("file:///var/myapp/finalDirectory? tempPrefix =/../filesInProgress/");  

Использование выражения для имен файлов

В этом примере мы хотим переместить использованные файлы в папку резервного копирования, используя сегодняшняя дата как имя подпапки:

  from ("file://inbox? move = backup/ $ {date: now: yyyyMMdd}/$ {file: name} "). to (" ... ");  

Дополнительные примеры см. в разделе «Язык файлов».

Избегание чтения одного и того же файла более одного раза (идемпотентный потребитель)

Camel поддерживает Idempotent Consumer непосредственно в компоненте, поэтому он будет пропускать уже обработанные файлы. Эту функцию можно включить, установив параметр idempotent = true .

   from ("file://inbox? idempotent = true") .to ("...");  

Camel использует абсолютное имя файла в качестве идемпотентного ключа для обнаружения повторяющихся файлов. Вы можете настроить этот ключ, используя выражение в параметре idempotentKey. Например, чтобы использовать в качестве ключа и имя, и размер файла

      

По умолчанию Camel использует хранилище в памяти для отслеживания потребляемых файлов, он использует кэш, который использовался недавно, до 1000 записей. Вы можете подключить свою собственную реализацию этого хранилища, используя параметр idempotentRepository , используя знак # в значении, чтобы указать, что это ссылка на компонент в реестре. с указанным id .

         

Camel будет регистрироваться на уровне DEBUG , если он пропускает файл, потому что он уже использовался раньше:

  DEBUG FileConsumer идемпотентен, и файл уже использовался ранее. Этот файл будет пропущен: target  idempotent  report.txt  

Использование файлового репозитория идемпотентов

В этом разделе мы будем использовать файловый репозиторий идемпотентов org.apache.camel.processor.idempotent.FileIdempotentRepository вместо репозитория в памяти, который используется как по умолчанию.
Этот репозиторий использует кеш 1-го уровня, чтобы избежать чтения файлового репозитория. Он будет использовать файловый репозиторий только для хранения содержимого кеш-памяти 1-го уровня. Таким образом, репозиторий может пережить перезагрузки сервера. Он будет загружать t При запуске содержимое файла помещается в кэш 1-го уровня. Структура файла очень проста, поскольку ключ хранится в отдельных строках файла. По умолчанию размер хранилища файлов составляет 1 МБ. Когда файл становится больше, Camel усекает хранилище файлов, перестраивая содержимое, сбрасывая кеш 1-го уровня в новый пустой файл.

Мы настраиваем наш репозиторий, используя Spring XML создает наш репозиторий идемпотентных файлов и определяет нашего потребителя файлов для использования нашего репозитория с помощью idempotentRepository , используя знак # для указания поиска в реестре:

Использование идемпотентного репозитория на основе JPA

В этом разделе мы будет использовать идемпотентный репозиторий на основе JPA вместо хранилища в памяти, которое используется по умолчанию.

Сначала нам понадобится блок сохранения в META-INF/persistence.xml , где нам нужно использовать класс org.apache.camel.processor.idempotent.jpa.MessageProcessed в качестве модели.

    org.apache.camel.processor.  идемпо  tent.jpa.MessageProcessed         

Затем мы можем создать наш репозиторий идемпотентов JPA также в файле XML Spring:

           

И да, тогда нам просто нужно сослаться на Компонент jpaStore в конечной точке потребителя файла с использованием idempotentRepository с использованием параметра синтаксиса # :

      

Фильтр с использованием org.apache.camel.component.file.GenericFileFilter

Camel поддерживает подключаемые стратегии фильтрации. Затем вы можете настроить конечную точку с таким фильтром, чтобы пропустить определенные обрабатываемые файлы.

В этом примере мы создали собственный фильтр, который пропускает файлы, начинающиеся с skip в имени файла:

А затем мы можем настроить наш маршрут с помощью фильтра атрибут для ссылки на наш фильтр (с использованием нотации # ), который мы определили в файле XML Spring:

         

Фильтрация с использованием средства сопоставления пути ANT

Средство сопоставления пути ANT основано на AntPathMatcher.

Пути к файлам соответствуют следующим правилам:

  • ? соответствует одному символу

  • * соответствует нулю или более символов

  • ** соответствует нулю или нескольким каталогам в пути

antInclude и Параметры antExclude позволяют легко указать стиль ANT include/exclude без необходимости определять фильтр. См. Параметры URI выше для получения дополнительной информации..

Пример ниже демонстрирует, как его использовать:

Сортировка с использованием компаратора

Camel поддерживает подключаемые стратегии сортировки. Эта стратегия заключается в использовании сборки в java.util.Comparator в Java. Затем вы можете настроить конечную точку с таким компаратором и попросить Camel отсортировать файлы перед обработкой.

В примере мы создали собственный компаратор, который просто сортирует по имени файла:

А затем мы можем настроить наш маршрут, используя параметр sorter для ссылки на наш сортировщик ( mySorter ) мы определили в XML-файле spring:

          

Параметры URI могут ссылаться на beans с использованием синтаксиса #

В приведенном выше маршруте Spring DSL обратите внимание, что мы можем ссылаться на beans в реестре, добавив к идентификатору префикс # . Таким образом, запись sorter = # mySorter проинструктирует Camel поискать в реестре bean-компонент с идентификатором mySorter .

Сортировка с использованием sortBy

Camel поддерживает подключаемые стратегии сортировки. Эта стратегия заключается в использовании языка файлов для настройки сортировки. Параметр sortBy настраивается следующим образом:

  sortBy = group 1;  группа 2; группа 3; ...  

Где каждая группа разделяется точкой с запятой. В простых ситуациях вы просто используете одну группу, поэтому простым примером может быть:

  sortBy = file: name   

Это будет отсортировано по имени файла, вы можете изменить порядок, добавив префикс в обратном направлении: в группу, поэтому сортировка теперь Z.. A:

sortBy=reverse:file:name 

Поскольку у нас есть все возможности File Language, мы можем использовать некоторые другие параметры, поэтому, если мы хотим отсортировать файлы по размеру, мы делаем:

sortBy=file:length 

Вы можете настроить игнорирование регистра, используя ignoreCase: для сравнения строк, поэтому, если вы хотите использовать сортировку имен файлов, но игнорировать регистр, мы делаем:

sortBy=ignoreCase:file:name 

Вы можете комбинировать игнорирование регистра и обратное, однако сначала необходимо указать обратное:

  sortBy =  reverse: ignoreCase: file: name  

В приведенном ниже примере мы хотим отсортировать по последнему измененному файлу, поэтому мы делаем:

sortBy=file:modified 

А потом мы хотите сгруппировать по имени как второй вариант, чтобы файлы с одинаковой модификацией были отсортированы по имени:

  sortBy = file  : modified; file: name  

Теперь здесь есть проблема, вы можете ее заметить? Что ж, измененная временная метка файла слишком хороша, поскольку она будет в миллисекундах, но что, если мы хотим отсортировать только по дате, а затем подгруппировать по имени?
Ну, поскольку у нас есть настоящая мощь File Language, мы можем используйте его команду даты, которая поддерживает шаблоны. Таким образом, это можно решить следующим образом:

  sortBy = date: file: yyyyMMdd; file: name   

Да, это довольно мощно, о, кстати, вы также можете использовать обратное преобразование для каждой группы, чтобы мы могли изменить имена файлов:

sortBy=date:file:yyyyMMdd;reverse:file:name 

Использование GenericFileProcessStrategy

параметр processStrategy можно использовать для использования настраиваемого GenericFileProcessStrategy , который позволяет реализовать собственное begin , логика фиксации и отката .
Например, предположим, что система записывает файл в папку, которую вы должны использовать. Но вы не должны начинать использовать файл до того, как будет записан другой готов файл.

Итак, реализовав наш собственный GenericFileProcessStrategy мы можем реализовать это как:

  • В begin () , мы можем проверить, существует ли специальный файл ready . Метод begin возвращает логическое , чтобы указать, можем ли мы использовать файл или нет.

  • В специальная логика метода abort () может выполняться в случае, если операция begin вернула false , например, для очистки ресурсов и т. д..

  • в методе commit () мы можем переместить фактический файл, а также удалить готовый файл.

Использование фильтра

Параметр filter позволяет реализовать настраиваемый фильтр в коде Java путем реализации файла org.apache.camel.component.file. GenericFileFilter интерфейс. В этом интерфейсе есть метод accept , который возвращает логическое значение. Верните true , чтобы включить файл, и false , чтобы пропустить файл. Существует метод isDirectory для GenericFile , независимо от того, является ли файл каталогом. Это позволяет вам фильтровать нежелательные каталоги, чтобы избежать обхода нежелательных каталогов.

Например, чтобы пропустить любые каталоги, которые начинаются с "пропустить" в названии может быть реализовано следующим образом:

Использование bridgeErrorHandler

Если вы хотите использовать обработчик ошибок Camel для обработки любых исключений, возникающих в файле-потребителе, вы можете включить параметр bridgeErrorHandler , как показано ниже. :

 //для обработки любого генерируемого исключения IOException onException (IOException.class) .handled (true) .log (  "Произошло исключение IOException из-за: $ {exception.message}") .transform (). Simple ("Error $ {exception.message}") .to ("mock: error");//это маршрут файла, по которому загружаются файлы  обратите внимание, как мы соединяем потребителя для использования обработчика ошибок маршрутизации Camel//эксклюзивныйReadLockStrategy настроен только потому, что это из модульного теста, поэтому мы используем это для имитации исключения  tionsfrom ("file: target/nospace? bridgeErrorHandler = true") .convertBodyTo (String.class) .to ("mock: result");  

Итак, все, что вам нужно сделать, это включить эту опцию, и обработчик ошибок в маршруте возьмет ее оттуда.

Важно при использовании bridgeErrorHandler . При использовании bridgeErrorHandler затем перехватчики, OnCompletions не применяется. Обмен обрабатывается непосредственно обработчиком ошибок Camel и не позволяет выполнять предварительные действия, такие как перехватчики, onCompletion.

Ведение журнала отладки

Этот компонент имеет уровень журнала TRACE , который может быть полезен при возникновении проблем.

Автоконфигурация загрузки Spring

При использовании файла с загрузкой Spring убедитесь, что вы используете следующую зависимость Maven для поддержки для автоматической настройки:

   org.apache.camel.springboot   верблюжий-файл-стартер   xx. x     

Компонент поддерживает 11 параметров, которые перечислены ниже.

Имя Описание По умолчанию Тип

camel.component.file.autowired- enabled

Включено ли автоматическое подключение. Это используется для параметров автоматического подключения (параметр должен быть помечен как автоматически подключенный) путем поиска в реестре, чтобы найти единственный экземпляр соответствующего типа, который затем настраивается на компоненте. Это можно использовать для автоматической настройки источников данных JDBC, фабрик соединений JMS, клиентов AWS и т. Д.

true

Boolean

camel.component.file.bridge-error- обработчик

Позволяет связать потребителя с обработчиком ошибок маршрутизации Camel, что означает любые исключения, возникшие, когда потребитель пытается получить входящие сообщения, или подобное, теперь будет обрабатываться как сообщение и обрабатываться обработчиком ошибок маршрутизации. По умолчанию потребитель будет использовать org.apache.camel.spi.ExceptionHandler для обработки исключений, которые будут регистрироваться на уровне WARN или ERROR и игнорироваться.

false

Boolean

camel.component.file.cluster.service.acquire-lock-delay

Время ожидания перед началом попытки получения блокировка.

String

camel.component.file.cluster.service.acquire-lock-interval

время ожидания между попытками получить блокировку.

String

Пользовательские атрибуты службы.

Map

Устанавливает, если служба файлового кластера должна d быть включен или нет, по умолчанию — false.

false

Boolean

ID кластерной службы

String

Порядок/приоритет поиска службы.

Integer

Корневой путь.

String

camel.component.file. enabled

Включать ли автоконфигурацию файлового компонента. Это включено по умолчанию.

Boolean

Будет ли производителя надо запускать ленивым (по первому сообщению). Запустив ленивый запуск, вы можете использовать это, чтобы разрешить CamelContext и маршруты для запуска в ситуациях, когда в противном случае производитель может выйти из строя во время запуска и вызвать сбой запуска маршрута. Если отложить этот запуск на «ленивый», тогда сбой запуска можно будет обработать во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Помните, что при обработке первого сообщения создание и запуск производителя может занять некоторое время и увеличить общее время обработки.

false

Boolean

Оцените статью
clickpad.ru
Добавить комментарий