Вот две функции, в одной идет сканирование каталога и вснесение данных в stl::list о найденных файлах, а вторая производит запись в файл
Код | bool scanDirectory(const char *path, std::list<FILEINFO> &pack) { _finddata_t c_file; intptr_t hfile;
char *mask = "*.*"; char path_file[255];
strcpy(path_file, path); strncat(path_file, "/", strlen("/")); strncat(path_file, mask, strlen(mask)); path_file[strlen(path_file)] = '\0';
if((hfile = _findfirst(path_file, &c_file)) == -1L) return false; else { do { if(strcmp(c_file.name, ".") == 0 || strcmp(c_file.name, "..") == 0) continue;
if(c_file.attrib & _A_SUBDIR) { path_file[0] = '\0'; strcpy(path_file, path); strncat(path_file, "/", strlen("/")); strncat(path_file, c_file.name, strlen(c_file.name)); path_file[strlen(path_file)] = '\0';
scanDirectory(path_file, pack); } else if(c_file.attrib & (_A_RDONLY | _A_HIDDEN | _A_SYSTEM | _A_ARCH)) { FILEINFO fileinfo;
int size_path = strlen(path) + 1; fileinfo.path = new char[size_path]; if(!fileinfo.path) printf("Can't selected a memory!!!\n");
strcpy(fileinfo.path, path); strcat(fileinfo.path, "/");
fileinfo.path[size_path] = '\0';
int lenght_name = strlen(c_file.name) + 1; fileinfo.name = new char[lenght_name]; strcpy(fileinfo.name, c_file.name); fileinfo.name[lenght_name] = '\0';
fileinfo.size = c_file.size;
pack.push_back(fileinfo); } }while(!_findnext(hfile, &c_file));
_findclose(hfile); }
return true; } //-------------------------------------------------------- void savePack(const char *path_src, const char *path_dest) { std::list<FILEINFO> pack; // упаковка
scanDirectory(path_src, pack);
std::fstream out(path_dest, std::ios::binary|std::ios::out);
out << "WFLS";
std::list<FILEINFO>::iterator iterator; int check_sum = 0;
for(iterator = pack.begin(); iterator != pack.end(); ++iterator) { char buffer[255];
strcpy(buffer, iterator->path + 3); buffer[strlen(iterator->path) - 3] = '\0';
out << strlen(buffer) << buffer; out << strlen(iterator->name) << iterator->name;
printf("size = %d\n", iterator->size);
unsigned char *data = new unsigned char[iterator->size];
char file[255]; strcpy(file, iterator->path); strcat(file, iterator->name); file[strlen(file) + 1] = '\0';
std::fstream in(file, std::ios::in|std::ios::binary);
in.read(reinterpret_cast<char*>(data), iterator->size); data[iterator->size] = 0;
out << iterator->size << data;
in.close();
check_sum += sizeof(strlen(buffer)) + strlen(buffer); check_sum += sizeof(strlen(iterator->name)) + strlen(iterator->name); check_sum += sizeof(iterator->size) + iterator->size; }
check_sum += sizeof(check_sum);
out << check_sum;
out.close(); }
|
|