GuiThumbnail.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "GuiThumbnail.h"
  2. #include <string.h>
  3. #include <wchar.h>
  4. #include <mutex>
  5. #include <thread>
  6. std::mutex mtx; // 声明一个互斥锁
  7. void processFile(const std::wstring& srcFile, const std::wstring& thumbFile)
  8. {
  9. std::lock_guard<std::mutex> lock(mtx); // 在此作用域内自动加锁和解锁
  10. // 访问共享资源的代码
  11. // AI EPS INDD 文件导出缩略图
  12. bool ret = AdobeThumbnail_W(srcFile.c_str(), thumbFile.c_str());
  13. // CorelDRAW CDR 文件导出缩略图
  14. if (!ret)
  15. ret = CorelThumbnail_W(srcFile.c_str(), thumbFile.c_str());
  16. // DWG 文件导出缩略图
  17. if (!ret)
  18. ret = DWGThumbnail_W(srcFile.c_str(), thumbFile.c_str());
  19. // 可以在此处添加处理成功或失败的逻辑
  20. if (!ret){
  21. char bad_File[MAX_PATH] = "001_Bad_Filelist.txt";
  22. FILE * pf = fopen(bad_File, "a+");
  23. WCHARTochar(bad_File, srcFile.c_str());
  24. fprintf(pf, "Name: %s\n", bad_File);
  25. fclose(pf);
  26. }
  27. }
  28. // 执行提取缩略图 主功能
  29. bool GuiThumbnail(const wchar_t* keyWord, const wchar_t* savePath)
  30. {
  31. wchar_t src_filename[MAX_PATH] = {0};
  32. wchar_t thumb_filename[MAX_PATH] = {0};
  33. Everything_SetSearch(keyWord);
  34. if (false == Everything_Query(TRUE))
  35. return false;
  36. std::vector<std::wstring> vec_files;
  37. std::vector<std::wstring> vec_names;
  38. const wchar_t* rs = L"(.+)(\\.(?:ai|AI|indd|INDD|Indd|eps|EPS|Eps|pdf|PDF|cdr|CDR|Cdr|dwg|DWG|Dwg|DWg|dWG))"; // 正则字符串,exp开始的单词
  39. std::wregex expression(rs); // 字符串传递给构造函数,建立正则表达式
  40. for (int i = 0 ; i < Everything_GetNumResults(); i++) {
  41. bool ret = std::regex_match((wchar_t*)Everything_GetResultFileName(i), expression);
  42. if (ret) {
  43. Everything_GetResultFullPathNameW(i, src_filename, MAX_PATH);
  44. vec_files.push_back(src_filename);
  45. vec_names.push_back((wchar_t*)Everything_GetResultFileName(i));
  46. }
  47. }
  48. // 如果没有目录建立,进入目录
  49. _wmkdir(savePath);
  50. _wchdir(savePath);
  51. // // 文件导出缩略图
  52. // for (int i = 0 ; i != vec_files.size(); i++) {
  53. // wcscpy(src_filename, vec_files[i].c_str());
  54. // wcscpy(thumb_filename, vec_names[i].c_str());
  55. // wcscat(thumb_filename, L"_T.jpg");
  56. // // AI EPS INDD 文件导出缩略图
  57. // bool ret = AdobeThumbnail_W(src_filename, thumb_filename);
  58. // if (!ret) // CorelDRAW CDR 文件导出缩略图
  59. // ret = CorelThumbnail_W(src_filename, thumb_filename);
  60. // }
  61. const int trn = 8;
  62. std::vector<std::thread> threads;
  63. while (vec_files.size() > trn) {
  64. for (int i = 0; i < trn; i++) {
  65. const std::wstring& srcFilename = vec_files[i];
  66. const std::wstring& thumbFilename = vec_names[i] + L"_T.jpg";
  67. threads.emplace_back(std::thread(processFile, srcFilename, thumbFilename));
  68. }
  69. // 等待所有线程执行完毕
  70. for (auto& trd : threads) trd.join();
  71. threads.clear();
  72. vec_files.erase(vec_files.begin(), vec_files.begin() + trn);
  73. vec_names.erase(vec_names.begin(), vec_names.begin() + trn);
  74. }
  75. for (int i = 0; i < vec_files.size(); i++) {
  76. const std::wstring& srcFilename = vec_files[i];
  77. const std::wstring& thumbFilename = vec_names[i] + L"_T.jpg";
  78. threads.emplace_back(std::thread(processFile, srcFilename, thumbFilename));
  79. }
  80. // 等待所有线程执行完毕
  81. for (auto& trd : threads) trd.join();
  82. return true;
  83. }
  84. // 临时PNG显示文件
  85. bool Thumbnail_TempPng(const wchar_t* src_filename, const wchar_t* tmppng)
  86. {
  87. bool ret = AdobeThumbnail_W(src_filename, tmppng);
  88. if (!ret)
  89. ret = CorelThumbnail_W(src_filename, tmppng);
  90. if (!ret)
  91. ret = DWGThumbnail_W(src_filename, tmppng);
  92. return ret;
  93. }