This C++ program does the same job as the C# program: it scans the "./data" directory for PDF files,
The std::filesystem::directory_iterator class is used to iterate over the files in the directory. The filename and its extension are retrieved using the path::filename and path::extension methods, respectively.
The std::sort function is used to sort the filenames in alphabetical order. Then, the program opens the output file with std::ofstream and writes the HTML content to it.
Please ensure that your compiler supports C++17 to use the library. You can usually enable C++17 in your compiler's settings or by using the -std=c++17 or -std=gnu++17 flag.
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <filesystem>
int main() {
const std::string dirPath = "./data";
const std::string outputPath = "./index.html";
// Check if the directory exists
if (!std::filesystem::exists(dirPath)) {
std::cout << "Directory '" << dirPath << "' does not exist.\n";
return 1;
}
std::vector<std::string> pdfFiles;
// Get pdf files
for (const auto &entry : std::filesystem::directory_iterator(dirPath)) {
if (entry.path().extension() == ".pdf") {
pdfFiles.push_back(entry.path().filename().string());
}
}
// Sort the file names in alphabetical order
std::sort(pdfFiles.begin(), pdfFiles.end());
std::ofstream outputFile;
outputFile.open(outputPath);
outputFile << "<html><title> PDF files</title>\n";
outputFile << "<body>\n";
outputFile << "<h1>List of ebooks</h1>\n";
outputFile << "<ul>\n";
// Create a list item for each pdf file
for (const auto& pdfFile : pdfFiles) {
std::string fileName = pdfFile;
std::string linkText = fileName.substr(0, fileName.find_last_of(".")).replace(fileName.find("_"), 1, " "); // Replace underscores with spaces
outputFile << "<li><a href=\"" << fileName << "\">" << linkText << "</a></li>\n";
}
outputFile << "</ul>\n";
outputFile << "</body>\n";
outputFile << "</html>\n";
outputFile.close();
std::cout << "Index.html has been created.\n";
return 0;
}
Last updated