void commands_ns::ChType(FileSystem *fs, int argc, char *argv[], std::ostream& out) { FileIterator* fi = fs->GetIterator(); int i = 0, count = strlen(argv[0]), flag = 1; char *arg_name = new char[count]; if (argc != 2) { out << "Неправильное количество параметров" << std::endl; delete[] arg_name; return; } while (argv[0][i] != '.') { arg_name[i] = argv[0][i]; ++i; if (i > count - 2) { out << "Введены некорректные данные" << std::endl; delete[] arg_name; return; } } if (i == 0) { out << "Введены некорректные данные" << std::endl; delete[] arg_name; return; } arg_name[i] = '\0'; count -= i; ++i; char *arg_type = new char[count]; count = 0; while (argv[0][i]) { arg_type[count] = argv[0][i]; ++i; ++count; } arg_type[count] = '\0'; count = 0; if (fs->names_types(arg_name) || fs->names_types(arg_type)||fs->names_types(argv[1])) { out << "Введены некорректные данные" << std::endl; delete[] arg_name; delete[] arg_type; return; } if (fs->GetFilesCount() != 0) { while (fi->HasNext()) { fi->Next(); FileDescriptor* fd = fi->GetFileDescriptor(); if (strcmpi(fd->GetName(), arg_name) == 0 && strcmpi(fd->GetType(), arg_type) == 0) { if (strcmp(arg_type,argv[1])==0){ out << "Изменение имени прошло успешно" << std::endl; delete[] arg_name; delete[] arg_type; return; } FileIterator* fi2 = fs->GetIterator(); while (fi2->HasNext()) { fi2->Next(); FileDescriptor* fd2 = fi2->GetFileDescriptor(); if (strcmpi(fd2->GetName(), arg_name) == 0 && strcmpi(fd2->GetType(), argv[1]) == 0) { out << "Файл с таким именем и типом уже существует" << std::endl; delete[] arg_name; delete[] arg_type; return; } } flag = 0; fd->SetType(argv[1]); fi->SetFileDescriptor(fd); out << "Изменение имени прошло успешно" << std::endl; delete[] arg_name; delete[] arg_type; return; } ++count; } } if (flag == 1) { out << "Файла в системе не обнаружено" << std::endl; } delete[] arg_name; delete[] arg_type; }
void commands_ns::AddToFile(FileSystem *fs, int argc, char *argv[], std::ostream& out) { size_t size = 0; if (argc != 2) { out << "Неправильное количество параметров" << std::endl; return; } char *nt[2]; nt[0] = strtok(argv[0], "."); nt[1] = strtok(NULL, ""); char *s = strtok(NULL, ".,-!"); if ((!nt[0]) || (!nt[1]) || (s)) { out << "Введены некорректные данные" << std::endl; return; } if (fs->names_types(nt[0])||fs->names_types(nt[1])) { out << "Введены некорректные данные" << std::endl; return; } if (fs->GetFilesCount() <= 0) { out << "Файл не найден" << std::endl; return; } if ((!argv[1]) || (strlen(argv[1]) <= 0)) { out << "Информация для добавления не введена" << std::endl; return; } int addSize = strlen(argv[1]); int fileIndx = -1; //формируем список блоков из дескрипторов по возрастанию смещения====== std::list < MemList> List; std::list<MemList>::iterator iter; std::list<MemList>::iterator fileToAdd; FileIterator *fi = fs->GetIterator(); FileDescriptor *fd; MemList ml; unsigned int indx = 0, max_indx; while (fi->HasNext()) { fi->Next(); fd = fi->GetFileDescriptor(); if ((strcmpi(fd->GetName(), nt[0]) == 0) && (strcmpi(fd->GetType(), nt[1]) == 0)) { fileIndx = indx; } ml.FDescrPtr = fd; ml.offset = fd->GetOffset(); ml.sz = fd->GetSize(); ml.index = indx; if (List.empty()) { List.push_back(ml); if (indx == fileIndx) {fileToAdd = List.begin();} } else { for (iter = List.begin(); iter != List.end(); iter++) { if ((ml.offset < (*iter).offset) || ((ml.offset == (*iter).offset) && (ml.sz < (*iter).sz))) { List.insert(iter, ml); if (indx == fileIndx) { fileToAdd = std::prev(iter); } break; } } if (iter == List.end()) { List.push_back(ml); if (indx == fileIndx) { fileToAdd = std::prev(List.end()); } } } ++indx; } max_indx = indx - 1; if (fileIndx==-1) { out << "Файл с указанным именем не существует" << std::endl; return; } //вставляем пустой блок в начало, если нужно size_t FD_END = 0; if ((*(List.begin())).offset > FD_END) { ml.offset = FD_END; ml.sz = (*(List.begin())).offset - FD_END; ml.FDescrPtr = NULL; List.insert(List.begin(), ml); } //вставляем пустые блоки в список for (iter = List.begin(); iter != List.end(); iter++) { if (std::next(iter) != List.end()) { if ((*(std::next(iter))).offset != ((*iter).offset + (*iter).sz)) { ml.offset = (*iter).offset + (*iter).sz; ml.sz = (*(std::next(iter))).offset - ml.offset; ml.FDescrPtr = NULL; List.insert(std::next(iter), ml); ++iter; } } } //проверяем размер size_t MaxSz = fs->GetMaxSize(); if (((*(std::prev(List.end()))).offset + (*(std::prev(List.end()))).sz+addSize) > MaxSz) { out << "Недостаточно места для добавления введенной информации" << std::endl; return; } //меняем размер файла, в который добавляется информация (*fileToAdd).sz += addSize; (*fileToAdd).FDescrPtr->SetSize((*fileToAdd).sz); if (std::next(fileToAdd) == List.end())//если файл последний в памяти - просто добавляем в размер { fi = fs->GetIterator(); int i = 0; while (fi->HasNext()) { fi->Next(); if (i == (*fileToAdd).index) { fi->SetFileDescriptor((*fileToAdd).FDescrPtr); break; } } out << "Информация добавлена" << std::endl; return; } //если не последний - ищем подходящую "дырку" bool isMoved = false; for (iter = List.begin(); iter != List.end(); iter++) { if (((*iter).FDescrPtr == NULL) && ((*iter).sz >= (*fileToAdd).sz)) { MemList ml = (*fileToAdd); List.erase(fileToAdd); ml.offset = (*iter).offset; (*iter).sz -= ml.sz; (*iter).offset += ml.sz; std::list<MemList>::iterator movedFile = List.insert(iter, ml); (*movedFile).FDescrPtr->SetOffset((*movedFile).offset); if ((*iter).sz <= 0) { List.erase(iter); } fileToAdd = movedFile; isMoved = true; break; } } //если нет подходящей дырки - сдвигаем все следующие блоки if (!isMoved) { for (iter = std::next(fileToAdd); iter != List.end(); iter++) { (*iter).offset += addSize; } } //меняем дескрипторы и записываем их в файл в нужном порядке fi = fs->GetIterator(); for (indx = 0; indx <= max_indx; indx++) { for (iter = List.begin(); ((iter != List.end()) && ((*iter).index != indx)); iter++) {} fi->Next(); (*iter).FDescrPtr->SetOffset((*iter).offset); fi->SetFileDescriptor((*iter).FDescrPtr); } fi->Close(); out << "Информация добавлена" << std::endl; return; }
void commands_ns::DelFile(FileSystem *fs, int argc, char *argv[], std::ostream& out) { if (argc != 1) { out << "Неправильное количество параметров" << std::endl; return; } if (strlen(argv[0]) > 41) { out << "Введены некорректные данные" << std::endl; return; } char *nt[2]; nt[0] = strtok(argv[0], "."); nt[1] = strtok(NULL, ""); char *s = strtok(NULL, ".,-!"); if ( (!nt[0]) || (!nt[1]) || (s) ) { out << "Введены некорректные данные" << std::endl; return; } if (fs->names_types(nt[0])||fs->names_types(nt[1])) { out << "Введены некорректные данные" << std::endl; return; } FileIterator* fi = fs->GetIterator(); FileIterator* prevfi = fs->GetIterator(); int j = 0; int next_index; int n = fs->GetFilesCount(); if (fs->GetFilesCount() != 0) { while (fi->HasNext()) { fi->Next(); FileDescriptor* fd = fi->GetFileDescriptor(); next_index = fi->GetNextIndex(); if (strcmpi(fd->GetName(), nt[0]) == 0 && strcmpi(fd->GetType(), nt[1]) == 0) { if (j == 0) { fs->set_first_file(next_index); } else { prevfi->set_next(next_index); } fi->Delete(); out << "Файл удален." << std::endl; return; } prevfi->Next(); j++; } out << "Файл с указанным именем не существует" << std::endl; } else out << "Файлов в системе не обнаружено." << std::endl; }