Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;

}