أسئلة حول برنامجي الأول باستخدام مكتبات Boost (استثناءات ، مسار طويل)

StackOverflow https://stackoverflow.com/questions/4262555

  •  27-09-2019
  •  | 
  •  

سؤال

أحاول كتابة برنامجي الأول في C ++ ، وأحتاج إلى استخدام مكتبة Boost. أحاول كتابة برنامج يتخطى شجرة الدليل بشكل متكرر وإرجاع تاريخ أحدث ملف وأقدمه.

هذا هو المكان الذي أنا الآن:

#define BOOST_FILESYSTEM_VERSION 3

#include "boost/filesystem.hpp"
#include <iostream>
#include <ctime>


using namespace std;
namespace fs = boost::filesystem;


int main() {
 fs::recursive_directory_iterator it_end;
 fs::recursive_directory_iterator it_dir("e:\\");
 fs::path p;

 time_t oldest( time(NULL) );
 time_t newest(0);

 try {
  for ( ; it_dir != it_end; ++it_dir ) {
   p = *it_dir;
   try {
    time_t t( last_write_time(p) );
    if (t<oldest) oldest=t;
    if (t>newest) newest=t;
    if (fs::is_directory(p)) cout << (p) << " " << t << endl;
   } 

   catch (const fs::filesystem_error& ex) {
    cout << "\n" << ex.what() << "\n";
   }
  }
 }

 catch (const fs::filesystem_error& ex) {
  cout << "\n" << ex.what() << "\n";
 }

 cout << "\nOldest: " << ctime(&oldest);
 cout << "Newest: " << ctime(&newest) << endl;

 return 0;
}

المشاكل التي قابلتها هي:

1. عندما أواجه مسارًا طويلًا جدًا (أكثر من 256 أو 260 حرفًا ، على ما أعتقد) ، هناك خطأ:

boost::filesystem::last_write_time: The system cannot find the path specified:

2. عندما أقابل دليلًا غير قابل للوصول ، مثل "معلومات حجم النظام" ، لديّ نوعان آخران:

boost::filesystem::last_write_time: Access is denied: "e:\System Volume Information"

boost::filesystem::directory_iterator::construct: Access is denied: "e:\System Volume Information"

كيف يمكنني تعديل الكود أعلاه للتعامل مع أسماء المسارات الطويلة تحت Windows؟ هل من الصعب حقًا القيام بذلك؟ بعض البرامج ، مثل Total Commander على سبيل المثال ، ليس لديها أي مشاكل في المسارات الطويلة ، ولكن لا يزال لدى العديد من البرامج.

والسؤال الأكثر أهمية هو كيف يمكنني بالفعل جعل الرمز أعلاه يعمل (لا يهتم بالمسارات الطويلة). المشكلة هي أنه عندما for ( ; it_dir != it_end; ++it_dir ) يجتمع مع دليل لا يمكن الوصول إليه ، وهو يلقي استثناءً ، وللتقلب هذا الاستثناء ، أحتاج إلى تحديد المصيد الخارجي. لكن عندما أكون خارجها يعني أن إلى عن على الدورة لا تستمر. لذلك يعني أن الكود أعلاه يعمل بقدر أول مجلد لا يمكن الوصول إليه. هناك يلقي استثناء وينتهي.

هل هناك أي طريقة للعودة إلى إلى عن على دورة بعد إلقاء استثناء؟فكرتي هي القيام بـ ++ IT_DIR داخل الصيد والبدء في دورة مرة أخرى. ولكن كيف يمكنني أن أبدأ مرة أخرى؟ قذيفة أنا نقلها إلى وظيفة منفصلة؟

آسف إذا لم يكن فهمي واضحًا ، فهو أول مشروع لي. لم أستخدم C ++ من قبل ولكني أبذل قصارى جهدي!

تعديل:

أي إجابة أخرى؟ المشكلة هي أن المصيد لا يعمل داخل دورة "لا يمكن الوصول إليها" نوع من الأخطاء. كيف يمكنني جعلها تعمل في الداخل؟ هنا هو أصغر رمز ينتج الخطأ. هل هناك أي طريقة لالتقاط هذا الخطأ داخل الدورة؟ أو قبض عليه بطريقة يمكن أن تستمر بعد تخطي العنصر غير الممكن الوصول مع IT_DIR ++؟

int main() {
 fs::recursive_directory_iterator it_end;
 fs::recursive_directory_iterator it_dir("e:\\");

  for ( ; it_dir != it_end; ++it_dir ) {
  //something here
  }
}
هل كانت مفيدة؟

المحلول

اتضح أنه خطأ في التعزيز. لقد وجدت تذكرة دعم الأخطاء لذلك وساهمت في ذلك.

نصائح أخرى

فقط ضع المحاولة/التقاط داخل الحلقة ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top