// Download files from sourceforge svn web view page, preserve folder structure. bool SvnSourceForge::DownloadFolder( const std::string & page_url, const std::string & folder_path, GameDownloader & download, std::ostream & error_output) { // Download files. std::vector<std::string> folders; std::vector<std::string> files; if (!DownloadFolder(page_url, "", download, folders, files, error_output)) { while (!files.empty()) { const std::string temp_path = download.GetHttp().GetDownloadPath(files.back()); PathManager::RemoveFile(temp_path); files.pop_back(); } return false; } // Creare folders. PathManager::MakeDir(folder_path); while (!folders.empty()) { PathManager::MakeDir(folder_path + folders.back()); folders.pop_back(); } // Copy files. while (!files.empty()) { const std::string temp_path = download.GetHttp().GetDownloadPath(files.back()); const std::string file_path = folder_path + files.back(); PathManager::CopyFileTo(temp_path, file_path); PathManager::RemoveFile(temp_path); files.pop_back(); } return true; }
int FtpClient::DownloadFolder ( char *dir, char *lDir ) { try { char localdir[4096]; strcpy ( localdir, lDir ); int error = ChangeDir ( dir ); if ( error ) cout << "Failed to change remote dir to "<<dir<<" , error="<<error<<endl; else cout << "\nDirectory was changed to "<<dir<<endl; strcat ( localdir, dir ); if ( !mkdir ( localdir, 0777 ) || errno == EEXIST) cout << "\nLocal directory " << localdir << "created"<<endl; else { cout <<"\nLocal directory " << localdir << "wasn't created, err="<<errno<<endl; } string list[1000]; int i = 0, j = 0, n = 0; if ( !List ( "this" ) ) { while ( j < strlen ( Result ) ) { //list[i] = new string; while ( Result[j] == '\r' || Result[j] == '\n' ) j++; while ( Result[j] != '\r' && Result[j] != '\n' && Result[j] != '\0' ) { list[i] += Result[j++]; } i++; j++; } n = i; } else { return LIST_CMD_FAILED; } for ( i = 0; i < n; i++ ) { int found; if ( list[i][0] == 'l' ) continue; if ( list[i][0] == 'd' ) { //folder sau fisier cu spatii found = list[i].find_last_of (' '); string folder = list[i].substr ( found+1 ); if ( folder != "." && folder != ".." ) { char fd[256]; strcpy ( fd, dir ); if ( dir[strlen ( dir ) - 1] != '/' ) strcat ( fd, "/" ); strcat ( fd, folder.c_str() ); DownloadFolder ( fd, lDir ); } } else { char seps[] = " "; char *token; char file[512]; strcpy ( file, list[i].c_str() ); token = strtok ( file, seps ); //ia cate un cuvant string vector[20]; int prop = 0; while ( token != NULL ) { vector[prop] = token; //punem cuvantul in vector token = strtok ( NULL, seps ); prop++; //numarul de proprietati } bzero ( file, 512 ); if ( prop > 9 ) { for ( int x = 8; x < prop; x++ ) { strcat ( file, vector[x].c_str() ); strcat ( file, " " ); } file[strlen ( file ) - 1] = '\0'; } else strcpy ( file, vector[prop-1].c_str() ); char localPath[4096]; strcpy ( localPath, localdir ); if ( localdir[strlen ( localdir )-1] != '/' ) strcat ( localPath, "/" ); strcat ( localPath, file ); cout<<"\nDownloading file="<<file<<endl; int error = 0; error = DownloadFile ( file, localPath ); if ( error == 0 ) cout << "\nFile was downloaded succesfully\n"; else cout << "\nWe encountered an error while downloading the file, error="<<error<<"\n"; } } } catch ( Exception ex ) { cout << ex.Message << endl << ex.ErrorCode << endl; return 1; } return 0; }
// Download files and folders lists from sourceforge svn web view page static bool DownloadFolder( const std::string & page_url, const std::string & folder, GameDownloader & download, std::vector<std::string> & folders, std::vector<std::string> & files, std::ostream & error_output) { // Download folder page. if (!download(page_url)) { error_output << "Download failed: " << page_url << std::endl; return false; } // Load folder page. const std::string page_path = download.GetHttp().GetDownloadPath(page_url); std::ifstream page(page_path.c_str()); if (!page) { error_output << "File not found: " << page_path << std::endl; return false; } // Fast forward to the start of the list. Utils::SeekTo(page, "<ul>"); // Loop through each entry. while (page) { Utils::SeekTo(page, "<li><a href=\""); const std::string name = Utils::SeekTo(page, "\">"); if (name.empty() || name == "../" || name == "Sconscript") continue; // Download sub folder. if (*name.rbegin() == '/') { if (!DownloadFolder(page_url + name, folder + name, download, folders, files, error_output)) { return false; } folders.push_back(folder + name); continue; } // Download file. const std::string file_url = page_url + name; if (!download(file_url)) { error_output << "Download failed: " << file_url << std::endl; return false; } files.push_back(folder + name); } page.close(); PathManager::RemoveFile(page_path); return true; }