Ищу алгоритм удаления
Ну вот создал я файл, сколько резервировать?
------
размер диска/квоты делишь на размер выбранного блока => получаешь возможное количество блоков
смотришь сколько байт нужно чтобы поместился номер последнего блока
резервируешь: количество блоков * количество байт для номера
И, кстати, будет не вредно сразу прописать весь файлик мусором - чтоб место физически выделилось.
1. Все полезные алгоритмы нужно хранить на флешки/CD/внешнем диске.
2. Даже Microsoft не смогла сделать толком нормальную утилиту по дефрагментации диска, она купила её помойму у Symantec. Когда удаляются файлы, там помечается каким-то флагом что файл удалён, и при этом остаются дырки, а при дефрагметации диска пустые места (дырки) заполняются данными. Дефрагментация это долгий процесс.
3. В файловой системе блоки (сектора) фиксировоной длины, помойму 1 блок (сектор) = 512 байт.
4. Не понял задачу, но как-то так:
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
// Копирует блок в общую память
void copy_block(char *buf, char *data, int pos) {
memcpy(buf+pos, data, strlen(data));
}
// Удаляет блок из общей памяти
void delete_block(char *buf, int pos, int len) {
memset(buf+pos, '\0', len);
}
int main(int argc, char** argv) {
char *buf; // Общая память
char block1[] = "Hello "; // блок содержащий слово Hello
char block2[] = "Igor"; // блок содержащий слово Igor
char block3[] = "Ann";// блок содержащий слово Ann
buf = (char *)malloc(65535); // Резервируем память 65К
memset(buf, '\0', 65535); // Инициализируем память
copy_block(buf, block1, 0); // Копируем в 0 ячейку памяти Hello
copy_block(buf, block2, strlen(block1)); // Копируем в 5 ячейку памяти Igor
cout << buf << endl; // Выводим на экран Hello Igor
delete_block(buf, strlen(block1), strlen(block2)); // Удаляем в 5 ячейки памяти 3 байта
cout << buf << endl; // Выводим на экран Hello
copy_block(buf, block3, strlen(block1));// Копируем в 5 ячейку памяти Ann
cout << buf << endl; // Выводим на экран Hello Ann
free(buf); // Освобождаем зарервированную память
return 0;
}
А с блоками можно сделать примерно так:
struct BLOCK_1 {
long next_offset;
char buf[5];
};
struct BLOCK_2 {
long next_offset;
char buf[10];
};
struct BLOCK_3 {
long next_offset;
char buf[15];
};
BLOCK_1 block_1;
BLOCK_2 block_2;
BLOCK_3 block_3;
block_1.next_offset = 5;
strcpy(block_1.buf, "Igor");
block_2.next_offset = 5 + 10;
strcpy(block_2.buf, "Ann");
block_3.next_offset = 5 + 10 + 15;
strcpy(block_3.buf, "Mustermann");
P.S.:Извиняюсь если ответил не так, что-то последние три дня плохо соображаю, две ночи плохо спал.
Моя ФЛ Он и ОнаКогда удаляются файлы, там помечается каким-то флагом что файл удалён, и при этом остаются дырки, а при дефрагметации диска пустые места (дырки) заполняются данными.
А зачем физически удалять данные, если достаточно пометить их как свободные для перезаписи?
Дефрагментация это долгий процесс.
Вместо вредной и медленной дефрагментации лучше скопировать всё на другой пустой диск, а потом на первом всё удалить. Теперь можно при необходимости повторить процесс, но в обратном направлении.
Чтобы фрагментация меньше доставляла проблем, нужно придерживаться примерно такого же правила, как для RAM - память должна использовать не более, чем на 2/3 от доступной. В идеале не более, чем на половину. Если используется больше, нужно докупить памяти. Оперативка, кстати, тоже страдает от фрагментации, хотя и в меньшей степени из-за своей скорости. Но ещё она страдает вдобавок и от свопа.
Значит вопрос фрагментации не решался.
Всё отлично решалось. И блоки были, только не фиксированной длины, а просто кратные степени 2ки.
Но пока ничего не навеяло на путь решения. Уже на этапе удаления блока, два соседних удалённых блока объединялись и в таблицу удаленных записывался только этот объединённый блок.
А как это повлияет на размер файла?
-------
А должно?
Или как я туда смогу что то записать из данных?
------
Находишь в таблице блоков пустой (000) блок и пишешь туда. Что не вошло - пишешь в следующий пустой.
Там навигация по блокам совершено элементарная - по положению описателя блока сразу получаешь смещение в файле, а описатель содержит номер следующего используемого блока.
не фиксированной длины, а просто кратные степени 2ки.
------
голову примени - либо фрагментация, либо фиксированный размер блока. Другого просто нет. Даже не комбинируется.
У винды, кстати, память управляется блоками фиксированной длины и под это дело уходит хренова куча памяти.
два соседних удалённых блока объединялись
-----
У тебя квота Х.
Ты пишешь последовательно (Х/2-2), (4). (Х/2-2) - полный.
Освобождаешь оба (Х/2-2).
Теперь тебе надо писать ровно (Х/2) - все, приплыли.
Если не приплыли, то как-то без блоков переменой длины.
А как это повлияет на размер файла?-------А должно?
конечно, зачем мне лишний мусор в файле
Находишь в таблице блоков пустой
Речь как то и идет о таблице пустых блоков мне нужно утилизовать записи которые уже не используются.
Что не вошло - пишешь в следующий пустой
Концепт другой, блок заполняется полностью.
зачем мне лишний мусор в файле
------
Чтобы повех него писать новую инфу.
Или т при удалении файла прописываешь занимаемое им место поперемено 0/1?
о таблице пустых блоков
------
А нету такой. За ненадобностью.
мне нужно утилизовать записи
-----
Ну так объявляешь блоки свободными и все.
Концепт другой,
------
Выше написано во что упрешься.

