#файлы #файловая_система
Например, диск 250G, на нем файл размером 200G, который надо разбить на два файла по 100G. Файловая система - какая угодно - интересны любые варианты, как это можно сделать.
Ответы
Ответ 1
Если ваша файловая система поддерживает разреженные файлы то общий алгоритм таков: открываем новый файл, перемещаем файловый указатель на то место, где должны находится последние N мегабайт файла, переписываем эти N мегабайт. Закрываем файл источник, усекаем его на размер переписанной части (системный вызов truncate() / ftruncate()). Опять открываем файл, переписываем предпоследние N мегабайт (правильно выставив файловый указатель в файле назначения). Повторяем до тех пока не перепишем все. Рекомендуется писать большими частями, что бы не было сильной дефрагментации в ФС и частями, кратными размеру блока файловой системы (обычно 4кб). При таком подходе каждую часть файла мы перепишем только 1 раз и сразу на свое место, так как разреженные файлы занимают на диске столько места, сколько в них записано, не зависимо от смещений по которым писали, т.е. при записи более ранней части ФС добавляет на своем уровне блоки в начало цепочки занятых файлом. На операционных системах unix/linux эти операции можно проделать из командной строки с использованием утилит dd для записи порции файла по требуемому смещению и truncate для усечения файла источника до требуемой длины. Будьте осторожны и аккуратны, я предупредил :) Примерно так: dd if=файл1 of=файл2 bs=1M count=51200 seek=51200 skip=51200 truncate -s 161061273600 файл1 dd if=файл1 of=файл2 bs=1M count=51200 seek=0 skip=0Ответ 2
Я правильно понимаю, что нужно делить файлы на несколько частей и затем через какой-то инструментарий получать к ним прозрачный доступ, как к обычным файлам? Т.е. в идеале пользователь даже не догадывается, что файл расположен на нескольких дисках, так? RAID-подобные системы, видимо, рассматривать не будем. У меня только пара идей для реализации подобного: Просто написать функцию, которая будет читать куски файлов, расположенных на разных дисках, последовательно. Данные о файлах хранятся в текстовом файле. Для разбиения тоже своя функция, которая как раз делит файл, записывает на разные диски и обновляет текстовый файл. Плюсы: самая простая реализация. Минусы: использование только в своих программах, сторонние пользовать не смогут. Перехват системных функций работы с файлами. Можно реагировать на определенное расширение, можно на имя файла. Перехватчику необходимо знать точные размеры файлов, хранящихся на разных дисках, и поставлять данные, в зависимости от того, с каким смещением от начала файла сейчас ведется чтение. Запись таких файлов делать спец. утилитой, которая делит файлы и пишет параметры разделения в некий файл данных, регулярно читаемый перехватчиком. Плюсы: реализовать не сильно сложно, сторонние программы также могут читать такие файлы прозрачно. Своя файловая система. Переписать тот же FAT32, позволив таблице размещения файлов ссылаться не только на кластеры текущего диска, но и на кластеры других дисков (или даже не кластеры, а просто на файлы других дисков). Идея хороша тем, что позволяет не менять FS других дисков, главное, чтобы начало файла находилось именно на этом диске. Плюсы: сторонние программы также могут читать такие файлы прозрачно. Минусы: сложновато в реализации, придётся писать свой драйвер (не знаю, есть ли в сети исходники драйвера FAT32).Ответ 3
В теории можно файл делить блоками. Например: 250(свободное место) - 200(размер файла) = 50 гигов на операции. Дальше берем 40(поменьше взял) из первого и пишем во второй. После чего переписываем первый. Получаем два файла 160 и 40. Дальше еще две итерации и файлы разделены: 120 и 80 100 и 100
Комментариев нет:
Отправить комментарий