Можно ли удалить оба конца большого файла без копирования? - PullRequest
3 голосов
/ 12 апреля 2009

Я хотел бы знать, возможно ли с помощью Windows и c ++ взять большой видеофайл (длиной в несколько гигабайт) и удалить его первые и последние несколько сотен мегабайт «на месте».

Традиционный подход копирования полезных данных в новый файл часто занимает до 20 минут, казалось бы, ненужного копирования.

Есть ли что-нибудь умное, что можно сделать низкоуровневым с диском, чтобы это произошло?

Ответы [ 5 ]

6 голосов
/ 12 апреля 2009

Конечно, это возможно в теории. Но если ваша файловая система NTFS, будьте готовы потратить несколько месяцев на изучение всех структур данных, которые вам нужно обновить. (Все это официально без документов.)

Кроме того, вам нужно либо

  1. Каким-то образом отключите громкость и затем внесите изменения; или
  2. Узнайте, как написать драйвер файловой системы ядра, купить лицензию у MS, разработать драйвер и использовать его для внесения изменений в действующую файловую систему.

Немного проще, если ваша файловая система чем-то проще, чем FAT32. Но в любом случае: короче говоря, это может быть возможным, но даже если это так, это займет годы из вашей жизни. Мой совет: не беспокойся.

Вместо этого рассмотрите другие способы решения проблемы : например, с помощью сценария avisynth , который обслуживает только кадры из интересующего вас региона.

4 голосов
/ 12 апреля 2009

Вы надеетесь просто поиграть с адресами секторов в записи каталога? Это практически немыслимо, что план будет работать.

Прежде всего, потребуется, чтобы количество данных, которые вы хотите удалить, было точно равно размеру сектора. Это не очень вероятно, учитывая, что, возможно, в самом начале есть некоторые данные заголовка, которые должны остаться там.

Даже если он отвечает этим требованиям, потребуется низкоуровневая модификация, которую Windows очень старается помешать вам сделать.

2 голосов
/ 11 мая 2011

Да, вы можете сделать это в NTFS.

Конец, который вы удаляете с помощью SetFileLength.

Начало или любую другую большую последовательную область файла, которую вы перезаписываете нулями. Затем вы помечаете файл как "разреженный" , который позволяет файловой системе восстанавливать эти кластеры.

Обратите внимание, что это на самом деле не изменит смещения данных относительно начала файла, а только предотвратит использование файловой системой пространства для хранения ненужных данных.

2 голосов
/ 12 апреля 2009

Может быть, ваш формат файла позволяет «пропустить» байты, чтобы вы могли просто перезаписать (т.е. с отображением памяти) необходимые части. Это, конечно, по-прежнему занимало бы излишне много места на диске.

1 голос
/ 12 апреля 2009

Даже если операции с файловой системой низкого уровня были простыми, редактирование видеофайла - это не просто удаление ненужных мегабайт. Вы все еще должны учитывать такие понятия, как сжатие, кадры, мультиплексирование аудио и видео, контейнеры медиафайлов и многие другие ...

Лучшее решение - просто принять двадцать минут бездействия.

...