Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++. Π‘Π±ΠΎΡ€Π½ΠΈΠΊ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 96

Автор Π”. БтСфСнс

#include <iostream>

#include <string>

#include <cstdlib>

#include <boost/filesystem/operations.hpp>

#include <boost/filesystem/fstream.hpp>


using namespace std;

using namespace boost::filesystem;


int main(int argc, char** argv) {

 // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²...

 try {

  path p = complete(path(argv[1], native));

  create_directory(p);

 } catch (exception& e) {

  cerr << e.what() << endl;

 }

 return(EXIT_SUCCESS);

}

Ѐункция create_directory создаСт ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹ Π·Π°Π΄Π°Π΅Ρ‚Π΅ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ path. Если этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΡƒΠΆΠ΅ сущСствуСт, выбрасываСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ filesystem_error (ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ ΠΎΡ‚ стандартного класса ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ). ПояснСния ΠΏΠΎ классу path ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ complete (ΠΎΠ±Π° ΠΎΠ½ΠΈ входят Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Boost Filesystem) приводятся Π² обсуТдСнии Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π° 10.7. Π‘ΠΌ. Ρ€Π΅Ρ†Π΅ΠΏΡ‚ 10.11, Π³Π΄Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ удалСния ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈ всСх содСрТащихся Π² Π½Π΅ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ². Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ вас Π½Π΅ Π²ΠΎΠ»Π½ΡƒΠ΅Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы вашСй ОБ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, вСроятно, ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ большСй Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒΡŽ.

Π‘ΠΌΠΎΡ‚Ρ€ΠΈ Ρ‚Π°ΠΊΠΆΠ΅

Π Π΅Ρ†Π΅ΠΏΡ‚ 10.12.

10.11. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

ВрСбуСтся ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ эта опСрация Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ пСрСносимой, Ρ‚.Π΅. Π² Π½Π΅ΠΉ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ спСцифичный для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ОБ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс.

РСшСниС

На Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ Π²Ρ‹ смоТСтС Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ систСмным Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ rmdir, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состав Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° компиляторов ΠΈ содСрТится Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… C-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΌΠΈ срСдствами C++ нСльзя ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ пСрСносимый способ удалСния ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. Π’Ρ‹Π·ΠΎΠ² rmdir ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·Π½Ρ‹ΠΉ Π²ΠΈΠ΄ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ОБ, Π½ΠΎ Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для удалСния ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. Π‘ΠΌ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 10.17, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ приводится короткая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡŽ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 10.17. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°

#include <iostream>

#include <direct.h>


using namespace std;


int main(int argc, char** argv) {

 if (argc < 2) {

  cerr << "Usage: " << argv[0] << " [dir name]" << endl;

  return(EXIT_FAILURE);

 }

 if (rmdir(argv[1]) == -1) { // Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³

  cerr << "Error: " << strerror(errno) << endl;

  return(EXIT_FAILURE);

 }

}

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Π‘ΠΈΠ³Π½Π°Ρ‚ΡƒΡ€Π° rmdir совпадаСт Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ОБ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ эта функция Π² Ρ€Π°Π·Π½Ρ‹Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ…. Π’ Windows ΠΎΠ½Π° ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π² <direct.h>, Π° Π² Unix β€” Π² <unistd.h>. Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ (имя ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°) ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -1, Ссли Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка, устанавливая Π² errno ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ€ ошибки. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π·Π°Π²ΠΈΡΡΡ‰ΡƒΡŽ ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π΅ΠΊΡΡ‚ΠΎΠ²ΡƒΡŽ строку ошибки, вызывая strerror ΠΈΠ»ΠΈ perror.

Если Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π½Π΅ пустой, rmdir Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ с ошибкой. Для просмотра списка содСрТимого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, пСрСчислСния Π΅Π³ΠΎ элСмСнтов для ΠΈΡ… удалСния см. Ρ€Π΅Ρ†Π΅ΠΏΡ‚ 10.12.

Если Π²Π°ΠΌ трСбуСтся ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ, Π½Π΅ слСдуСт самому ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ #ifdef, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ Π² Π½ΠΈΡ… спСцифичныС для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ОБ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, β€” Π»ΡƒΡ‡ΡˆΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Boost Filesystem. Π’ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Boost Filesystem ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ концСпция ΠΏΡƒΡ‚ΠΈ для ссылки Π½Π° Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π° ΠΏΡƒΡ‚ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” remove.

Ѐункция removeRecurse ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 10.18 рСкурсивно удаляСт ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΈ всС Π΅Π³ΠΎ содСрТимоС. НаиболСС Π²Π°ΠΆΠ½ΠΎΠΉ Π΅Π΅ Ρ‡Π°ΡΡ‚ΡŒΡŽ являСтся функция remove (которая Π½Π° самом Π΄Π΅Π»Π΅ являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ boost::filesystem::remove, Π° Π½Π΅ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ). Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡƒΡ‚ΡŒ path Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ удаляСт Π΅Π³ΠΎ, Ссли это Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ пустой ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π½ΠΎ ΠΎΠ½Π° Π½Π΅ удаляСт ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Ссли ΠΎΠ½ содСрТит Ρ„Π°ΠΉΠ»Ρ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 10.18. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° срСдствами Boost

#include <iostream>

#include <string>

#include <cstdlib>

#include <boost/filesystem/operations.hpp>

#include <boost/filesystem/fstream.hpp>


using namespace std;

using namespace boost::filesystem;


void removeRecurse(const path& p) {

 // Π‘Π½Π°Ρ‡Π°Π»Π° ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ содСрТимоС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°

 directory_iterator end;

 for (directory_iterator it(p); it != end; ++it) {

  if (is_directory(*it)) {

   removeRecurse(*it);

  } else {

   remove(*it);

  }

 }

 // Π—Π°Ρ‚Π΅ΠΌ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ сам ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³

 remove(p);

}


int main(int argc, char** argv) {

 if (argc != 2) {

  cerr << "Usage: " << argv[0] << " [dir name]\n";

  return(EXIT_FAILURE);

 }

 path thePath = system_complete(path(argv[1], native));

 if (!exists(thePath)) {

  cerr << "Error: the directory " << thePath.string()

   << " does not exist.\n";

  return(EXIT_FAILURE);

 }

 try {

  removeRecurse(thePath);

 } catch (exception& e) {

  cerr << e.what() << endl;

  return(EXIT_FAILURE);

 }

 return(EXIT_SUCCESS);

}

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ просмотр содСрТимого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… пояснСний, ΠΈ это являСтся Ρ‚Π΅ΠΌΠΎΠΉ Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π° 10.12.

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Boost Filesystem достаточно ΡƒΠ΄ΠΎΠ±Π½Π°, ΠΎΠ΄Π½Π°ΠΊΠΎ слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΎΠ½Π° Π½Π΅ являСтся стандартом, ΠΈ поэтому Π½Π΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² любой срСдС. Если Π²Ρ‹ посмотритС Π½Π° исходный ΠΊΠΎΠ΄ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Boost Filesystem, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ фактичСски ΠΎΠ½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹, спСцифичныС для Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹. Если вас Π½Π΅ Π²ΠΎΠ»Π½ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы вашСй ОБ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π²ΠΏΠΎΠ»Π½Π΅ вСроятно, ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ большСй Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒΡŽ.

Π‘ΠΌΠΎΡ‚Ρ€ΠΈ Ρ‚Π°ΠΊΠΆΠ΅

Π Π΅Ρ†Π΅ΠΏΡ‚ 10.12.

10.12. Π§Ρ‚Π΅Π½ΠΈΠ΅ содСрТимого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

ВрСбуСтся ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ содСрТимоС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, вСроятно, для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠΌ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ.

РСшСниС

Для получСния пСрСносимого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ классами ΠΈ функциями Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Boost Filesystem. Она содСрТит ряд ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, обСспСчивая пСрСносимоС прСдставлСниС ΠΏΡƒΡ‚Π΅ΠΉ, ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡŽ, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡŽ ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Ρ‚.ΠΏ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 10.19 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· этих срСдств.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 10.19. Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°

#include <iostream>

#include <boost/filesystem/operations.hpp>

#include <boost/filesystem/fstream.hpp>


using namespace boost::filesystem;


int main(int argc, char** argv) {

 if (argc < 2) {

  std::cerr << "Usage: " << argv[0] << " [dir name]\n";

  return(EXIT_FAILURE);

 }

 path fullPath = // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ, Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ

  system_complete(path(argv[1], native));

 if (!exists(fullPath)) {

  std::cerr << "Error: the directory " << fullPath.string()

   << " does not exist.\n";

  return(EXIT_FAILURE);

 }

 if (!is_directory(fullPath)) {

  std::cout << fullPath.string() << " is not a directory!\n";

  return(EXIT_SUCCESS);

 }

 directory_iterator end;

 for (directory_iterator it(fullPath);

  it != end; ++it) {        // ΠŸΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ

                           // элСмСнт ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΏΠΎΡ‡Ρ‚ΠΈ

  std::cout << it->leaf(); // Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ это дСлалось Π±Ρ‹ для

  if (is_directory(*it))   // STL-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°

   std::cout << " (dir)";

  std::cout << '\n';

 }

 return(EXIT_SUCCESS);

}

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Как ΠΈ ΠΏΡ€ΠΈ создании ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² (см. Ρ€Π΅Ρ†Π΅ΠΏΡ‚Ρ‹ 10.10 ΠΈ 10.11), Π½Π΅ сущСствуСт стандартного, пСрСносимого способа чтСния содСрТимого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ Тизнь Π² C++, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Filesystem ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Boost содСрТит ряд пСрСносимых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ. Она Ρ‚Π°ΠΊΠΆΠ΅ содСрТит ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ; Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ ΠΏΡ€ΠΈ описании Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ² этой Π³Π»Π°Π²Ρ‹ ΠΈΠ»ΠΈ Π½Π° Π²Π΅Π±-страницС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Boost Filesystem сайта www.boost.com.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 10.19 приводится простая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° просмотра ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° (Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ls Π² Unix ΠΈΠ»ΠΈ dir Π² MS-DOS). Π‘Π½Π°Ρ‡Π°Π»Π° ΠΎΠ½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ Π½Π° основС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

path fullPath = complete(path(argv[1], native));

Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, содСрТащСй ΠΏΡƒΡ‚ΡŒ, называСтся, СстСствСнно, path (ΠΏΡƒΡ‚ΡŒ). Π‘ этим Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ файловая систСма, ΠΈ ΠΎΠ½ Π»Π΅Π³ΠΊΠΎ прСобразуСтся Π² строку ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° path::string. ПослС формирования ΠΏΡƒΡ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° провСряСт Π΅Π³ΠΎ сущСствованиС (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exists), Π·Π°Ρ‚Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, is_directory, провСряСт, Π·Π°Π΄Π°Π΅Ρ‚ Π»ΠΈ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. Если ΠΎΡ‚Π²Π΅Ρ‚ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»Π΅Π½, Ρ‚ΠΎ всС Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΏΠΎ просмотру содСрТимого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.

Ѐайловая систСма ΠΈΠΌΠ΅Π΅Ρ‚ класс с ΠΈΠΌΠ΅Π½Π΅ΠΌ directory_iterator, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ сСмантику ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ примСняСмой для стандартных ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° элСмСнты ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. Однако Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ стандартных ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² здСсь Π½Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° end, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ элСмСнт, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π° послСдним элСмСнтом (Ρ‚.Π΅. vector<T>::end). ВмСсто этого, Ссли Π²Ρ‹ создаСтС ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° directory_iterator ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ стандартного конструктора, ΠΎΠ½ прСдоставляСт ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² опСрациях сравнСния для опрСдСлСния ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ просмотра ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€.