Neuroware
@Neuroware
Программист в свободное от работы время

Возможно ли «соединить» два файла, не перемещая данные?

Для одной задачи потребовалось "соединять" куски данных, которые представляют собой простые файлы (не важно в каком виде в них данные), лежащие на диске (fat32 или ntfs). Очевидным способом соединения является дописывание одного файла к другому, но это требует перемещение данных на диске, что в принципе в рамках задачи лишнее действие, т.к. они оба априори лежат на одном и том же диске. Насколько я помню ФС хранит у себя грубо говоря информацию о том, где файл начинается и какую длину имеет, далее каждый отдельный блок от файла хранит информацию о том, где лежит следующий, то есть теоретически для такого "соединения" достаточно в первом файле последний блок "связать" с первым блоком второго файла и изменить информацию о длине первого. Но как это реализовать не представляю, есть идеи куда можно копать?
  • Вопрос задан
  • 726 просмотров
Решения вопроса 3
@tex0
Задумайся над смыслом понятия "дефрагментация диска".
И как сказал выше Hydro - в ЮзверьМоде ты такого не сделаешь. Нужно делать в KernelMode. Кури в сторону организации хранения данных (файловые системы).
Ответ написан
Комментировать
@Hydro
C#/.NET Developer
В UserMode (тем более в .NET) режиме Вы ограничены абстракцией под названием "файловая система" и доступа к физической организации файлов вы не имеете.
С реализациями файловых систем не знаком, но предполагаю, что игра свеч не стоит.
Когда то ранее имел дело с файловыми системами для микроконтроллеров - вот там файл лежал линейно во Flash и любая вставка в середину вызывала перетирание конца файла, вставки и записи конца файла уже по смещению с учетом размера вставки.
Ответ написан
Комментировать
struggleendlessly
@struggleendlessly
.net Senior developer
еи логически подумать - то это может быть удобно только при миллионых+ операциях. вам надо будет опуститься в самый нижний уровень, вполть до ручного управления данными на диске. в новых виндовсах (начиная с висты) это сделать практически нереально и скорее всего нужно будет использовать не дот нет а напрямую С/С++, что еще усложнит задачу. И такая прога будет стоить годы разработки и сотни тысяч в деньгах.... если оно того стоит - ответ можно. кстати я еще читал, что можно перепрошивать контроллеры винчестеров.....
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Mrrl
@Mrrl
Заводчик кардиганов
В любом случае, для этого нужно, чтобы длина первого файла была кратна размеру кластера. Тогда, при наличии физического доступа к диску, шансы могут быть ненулевыми.
Если файлы для задачи были промежуточными, то, возможно, проще было бы ввести промежуточный тип - "многофайловый файл", который сам разбирается, из какого файла что читать. Там надо переопределить метод ReadBytes() (и всякие мелочи вроде Seek, Position, Length...) Заодно и в других программах может пригодиться.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы