Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
sergio1
12 / 1 / 1
Регистрация: 08.11.2008
Сообщений: 41
#1

Фрагментирование файла - C++

14.11.2010, 19:38. Просмотров 963. Ответов 7
Метки нет (Все метки)

Всем доброго времени суток.
Пишу программу для работы с большими файлами. Файл состоит из блоков размером 512 байт. Каким образом при удалении блоков в середине файла сделать так, чтобы система не передвигала все блоки после удаленных, а просто фрагментировала файл? Количество блоков может быть очень большим и такой сдвиг может занять относительно много времени.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2010, 19:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Фрагментирование файла (C++):

Сформировать два текстовых файла из целых чисел. Записать в третий файл минимальный элемент первого файла и максимальный элемент второго файла - C++
Тема: работа с текстовыми файлами с использованием стандартных функций библиотеки stdio.h Нужно составить программу: Сформировать два...

Winsock2.h:udp фрагментирование данных - C++
Доброго времени суток! Подскажите пожалуйста, какие можно использовать средства (функции) для фрагментации большого буфера (большой...

Даны два текстовых файла. Добавить в начало первого файла содержимое второго файла - C#
Даны два текстовых файла. Добавить в начало первого файла содержимое второго файла

Даны два текстовых файла. Добавить в конец первого файла содержимое второго файла - C#
Даны два текстовых файла. Добавить в конец первого файла содержимое второго файла.

Даны два текстовых файла. Добавить в конец первого файла содержимое второго файла - Pascal
3)Даны два текстовых файла. Добавить в конец первого файла содержимое второго файла.

Даны два файла, получить третий, содержащий чётные строки первого файла и нечётные строки второго файла - Visual Basic
Даны два файла, получить третий, содержащий чётные строки первого файла и нечётные строки второго файла. Вообще не имею понятия, как...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
14.11.2010, 21:18 #2
Фрагментировать файл не получиться, т.к. файл на диске лежит кластерами обычно по 4096 или 8192 байт. Постое эффективное решение - удаляемый блок не удалять, а помечать на удаление (устанавливая флаг), чтобы процедура поиска, например, эти блоки просто пропускала (не просматривала). Время от времени производить поджатие файла, физически удаляя помеченные блоки. Как-то так.
0
unStatiK
Заблокирован
15.11.2010, 01:06 #3
Нужно еще учесть что универсальной программы не получится , разные ФС (ext3,ext4,reiserFS.NTFS...) ведут себя по разному с файлами
0
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
15.11.2010, 11:29 #4
Каким образом при удалении блоков в середине файла сделать так, чтобы система не передвигала все блоки после удаленных, а просто фрагментировала файл?
Система и не будет никогда передвигать блоки - у нее нет такой функции насколько я знаю

Добавлено через 56 секунд
А еще лучше - опиши задачу полностью
0
sergio1
12 / 1 / 1
Регистрация: 08.11.2008
Сообщений: 41
15.11.2010, 20:34  [ТС] #5
Я хочу написать что-то типа формата файла-контейнера, в котором могут храниться другие файлы. То есть архив, но без сжатия данных. В начале файла хотелось бы записать блок со структурой контейнера, а дальше - сами данные. И вот проблема с удалением данных - приходится двигать все данные после удаленного блока.
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
16.11.2010, 00:03 #6
Так-то можно попробовать реализовать в качестве упражнения, но где это принесёт реальную пользу- неизвестно.

Короче, если бы мне надо было сделать край, чтобы можно было удалять из файла блоки по 512 байт без какой-либо ощутимой потери времени, я бы реализовал это так: перегнал файл в строку, разбил её на куски по 512 байт (позаботился уж чтобы в последнем было 512, раз уж так надо,) а потом соединил их между собой однонаправленным списком.

Так, теперь удаление какого-либо куска из СТРОКИ можно реализовать без проблем. Изучаем списки.

Так, работа с файлом свелась бы к работе с массивом символов типа unsigned char. Редактирование и прочее. Непросто, особенно если в разных участках памяти строка, но реализуемо всё же.

А потом понадобилось бы реализовать код (или отдельно экзешник), который по окончании работы со строкой перегонял бы её в файл-результат. Вот тут бы время терялось. Но! Коль скоро работа со строкой уже закончена (редактирование, вырезание или чего там) то потеря времени уже некритично было бы.
0
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
16.11.2010, 11:53 #7
Я хочу написать что-то типа формата файла-контейнера, в котором могут храниться другие файлы. То есть архив, но без сжатия данных.
Для чего тебе такой формат ?

Использовать библиотеку для работы с ZIP-архивами ( разумеется без сжатия данных ) можно ?

И вот проблема с удалением данных - приходится двигать все данные после удаленного блока.
вариант 2) в принципе уже озвучили
помечать свободные блоки по 512 байт
тогда не придется сдвигать
отдельно написать процедуру сжатия всего архива

вариант 3)
сделать некий аналог файловой системы (но внутри файла)
то есть помечать в каких блоках лежит файл1
какие блоки свободные
при этом будет проблема фрагментации которая решается написанием дефрагментатора
0
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
16.11.2010, 12:34 #8
В НТФС есть возможность использовать sparce files(разреженные файлы), в которых предполагается множество нулевых блоков. Можеш под себя адаптировать.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2010, 12:34
Привет! Вот еще темы с ответами:

Даны два файла, получить третий, содержащий чётные строки первого файла и нечётные строки второго файла - QBasic
Даны два файла, получить третий, содержащий чётные строки первого файла и нечётные строки второго файла.

Скачивание файла WebClient с отображением процентов загрузки файла, progressBar, скоростью загрузки файла - C#
Приветствую! Нужна Ваша помощь... Имеется такой кодик, слепленный из готовых примеров System.Net.WebClient webClient =...

Даны два текстовых файла с именами Name1 и Name2. Добавить в конец файла Name1 содержимое файла Name2 - C#
Даны два текстовых файла с именами Name1 и Name2. Добавить в конец файла Name1 содержимое файла Name2. Добавлено через 20 минут ...

Переписать в файл B из файла A те компоненты файла A, которые делятся без остатка на 2 - Pascal ABC
Создать файл A, компонентами которого являются числа от 1 до 20.Переписать в файл B из файла A те компоненты файла A, которые делятся без...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.11.2010, 12:34
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru