Я хотел сохранить большой видеофайл на диске FAT32 (~18 ГБ), но обнаружил, что это просто невозможно из-за ограничений файловой системы.
Существует ли простой инструмент для разделения файла на более мелкие части, которые можно сохранить, а затем собрать их заново, когда мне понадобится извлечь заархивированный файл?
Или есть лучший способ хранения больших файлов в FAT32?
решение1
Большинство архиваторов файлов, таких как7-Зип, WinZip и WinRAR позволяют разделить архив на несколько файлов. Если важна скорость, можно попробовать отключить часть программы, отвечающую за сжатие.
В системах GNU/Linux вы можете использоватьрасколотьикотпрограммы из пакета coreutils (например, split -b 4294967295 FOO /media/FATDISK/BAR
для разделения FOO на BARaa, BARab, ... и cat /media/FATDISK/BAR?? > FOO
для его повторной сборки). Утилита командной строки Mac OS X split
работает таким же образом.
решение2
Если вы ищете быстрое решение этой проблемы, ознакомьтесь с другими ответами, в которых есть 7zip
или split
.Это больше похоже навесельерешение.
В итоге я написал небольшой скрипт на Python 2, чтобы добиться этого.
# Author: Alex Finkel
# Email: [email protected]
# This program splits a large binary file into smaller pieces, and can also
# reassemble them into the original file.
# To split a file, it takes the name of the file, the name of an output
# directory, and a number representing the number of desired pieces.
# To unsplit a file, it takes the name of a directory, and the name of an
# output file.
from sys import exit, argv
from os import path, listdir
def split(file_to_split, output_directory, number_of_chunks):
f = open(file_to_split, 'rb')
assert path.isdir(output_directory)
bytes_per_file = path.getsize(file_to_split)/int(number_of_chunks) + 1
for i in range(1, int(number_of_chunks)+1):
next_file = open(path.join(output_directory, str(i)), 'wb')
next_file.write(f.read(bytes_per_file))
next_file.close()
f.close()
def unsplit(directory_name, output_name):
assert path.isdir(directory_name)
files = map(lambda x: str(x), sorted(map(lambda x: int(x), listdir(directory_name))))
out = open(output_name, 'wb')
for file in files:
f = open(path.join(directory_name, file), 'rb')
out.write(f.read())
f.close()
out.close()
if len(argv) == 4:
split(argv[1], argv[2], argv[3])
elif len(argv) == 3:
unsplit(argv[1], argv[2])
else:
print "python split_large_file.py file_to_split output_directory number_of_chunks"
print "python split_large_file.py directory name_of_output_file"
exit()
решение3
Другой вариант: использовать split
команду из GNU Coreutils:
split --bytes=4G infile /media/FAT32drive/outprefix
чтобы разбить файл на части по 4 ГБ и сохранить их на выходном диске.
Исходный файл можно восстановить, объединив фрагменты (имена файлов отсортированы в алфавитном порядке).
Информацию об использовании см.split
руководство.
Coreutils, включая split
, должны быть установлены по умолчанию в Linux и Mac OS X. В Windows этодоступно на GnuWin32, или из Cygwin.
решение4
Для создания файлов с максимально допустимым размером в vfat (2³²-1 байт) используйте следующую команду (в bash):
split --bytes=$((2**32-1)) infile /media/FAT32drive/outprefix
или, если вы не хотите использовать встроенную математику bash:
split --bytes=4294967295 infile /media/FAT32drive/outprefix
Параметр «--bytes=4G» не работает, поскольку 4G равен 2³² байтам, что ровно на один байт больше максимального размера файла в vFAT.