Изменить размер файла c
Я пишу класс персистентности данных для хранения аудио для моего аудиоредактора. Я решил использовать fstream (возможно, плохая идея) для создания файла с произвольным доступом для чтения и записи.
Каждый раз, когда я записываю небольшой звук в свой файл, я просто прикрепляю его к концу этого файла. Другая внутренняя структура данных / файл, содержит указатели на аудиофайл и отслеживает изменения.
Когда я отменяю действие записи и затем делаю что-то еще, последний бит аудиофайла становится неактуальным. На него нет ссылки в текущем состоянии документа, и вы не можете вернуться обратно в состояние, в котором вы сможете его снова увидеть. Поэтому я хочу отрезать эту часть файла и начать запись с нового конца. Мне не нужно вырезать биты в середине, просто с конца.
Когда пользователь выйдет, этот файл останется и будет перезагружен при повторном открытии проекта.
В моем приложении я ожидаю, что пользователь будет делать это все время, и возможность сделать это может сэкономить мне до 30% размера файла. Этот файл будет длинным, потенциально очень, очень длинным, поэтому перезаписывать его в другой файл каждый раз, когда это происходит, нецелесообразно.
Переписать его, когда пользователь сохраняет, может быть вариант, но он все еще не так привлекателен.
Я мог бы вставить значение в начале, которое говорит, как долго должен быть файл, и затем перезаписать конец, чтобы перезапустить пространство, но в то же время. Если бы я хотел постоянно обновлять файл хранилища данных в случае сбоя, это означало бы, что я буду переписывать начало снова и снова. Я беспокоюсь, что это может быть плохо для флешек. Я мог бы также пересчитать конец полезной части файла при загрузке, проанализировав файл указателя, но в то же время я мог бы потратить все это пространство потенциально, и это сложно.
Есть ли простой вызов для этого в API fstream?
Я использую не ту библиотеку? Заметьте, я хочу придерживаться чего-то общего STL, которое я предпочел, чтобы я мог сохранить код как можно более кросс-платформенным
Я не могу найти это в документации и искал много часов. Это не конец света, но сделает это немного проще и потенциально более эффективным. Возможно я просто скучаю по этому как-то.
Спасибо за вашу помощь
Андре
Решение
Есть ли простой вызов для этого в API fstream?
Если у вас есть компилятор C ++ 17, используйте std::filesystem::resize_file . В предыдущих стандартах такого не было в стандартной библиотеке.
Другие решения
Если у вас есть переменная, которая содержит вашу текущую позицию в файле, вы можете найти длину вашего «ненужного фрагмента» и просто продолжить запись оттуда.
К сожалению, вам придется написать кроссплатформенную функцию усекать, что бы позвонить SetEndOfFile в окнах и усекать в Linux Это достаточно просто с использованием макросов препроцессора.
Друзья!
До сей поры не было в этом необъходимости, а поскольку задача тривиальная (вроде бы) в существовании подобной функции я не сомневался.
Но вот теперь понадобылось изменить размер файла, а такой api-функции, оказывается, нет!
КАк быть? Ума не приложу. Создавать новый файл и копировать в него старый до нужной позиции это несерьёзно. ПОдскажите, а?
(Вернее, есть много всяких надписей в google SуеFileSize, но этот какие-то методы. Мне нужна простенькая api-функция
Ну, или на худой конец, как это сделать программно? Файл текстовый. ПРобовал запихать в него EOF по нужной позиции (дабы отсечь "хвост" файла)- не получается)
Как программно удалить кнопку которую программно создал но только если она уже существует
Есть ScrollView в котором много компонентов,чтоб не выводить сразу все решил выводить по 10 штук и.
существует ли в языке Си функция replace? и если существует то как работает?
А если её нет то каким образом можно изменить числа входящие в массив?
Как программно изменить размер формы?
Подскажите плиз как програмно можно изменить размер формы
Как можно программно изменить размер консоли программы
Подскажите пожалуйста, как можно программно изменить размер консоли программы? Пробовал Window.
Получается уменьшить никак нельзя(разве что сжать архиватором) . А вот увеличить наверно можно, забив в него данные таким образом чтоб сам файл не пострадал. Например видел программу которая в файл Jpeg рисунка подмешивает текст, при этом размер файла увеличивается а картинка не меняеться.
Не устраивает ответ при всём уважении к отвечающему.
Смотри, уменьшить размер вручную (текстовый файл), проще пареной репы. Бинарник- то же самое (открываем hex- редактором и правим)
. Я должен поверить что эти действия до сих пор не автоматизированы?
Если дело сводится к тому, чтобы в недрах винды найти некоторую стркутурку, соджержащую данные о файле, одно из полей которой- его размер. В общем, надеюсь, что откликнутся люди, етоторые это дело проделывали.
Главное нужно указать изображение на вашем компьютере или телефоне, указать качество от 1 до 100, нажать кнопку ОК внизу страницы. Остальные настройки выставлены по умолчанию. Чем больше указано «качество» в настройках (80-100), тем больше получится размер файла. И наоборот, меньшее качество (50-75) даст меньший размер JPEG файла. При необходимости уровень качества (сжатия), с которым был создан jpeg-файл, можно узнать здесь.
Если после сжатия размер jpeg файла стал наоборот больше, чем оригинал, то значит нужно понизить уровень качества с 80 на более меньшее число, например, установить 60. Размеры в пикселях и мегабайтах до и после сжатия можно будет увидеть после обработки или нажатия кнопки OK. Если при уровне качества в 40-50 размер всё равно больше оригинала, то сжимать картинку нет смысла – она и так была хорошо сжата. Можно разве что попробовать удалить метаданные, встроенные в jpg файл или удалить exif + сделать jpg прогрессивным без потери качества.
Исходное изображение никак не изменяется. Вам будет предоставлена другая обработанная картинка в формате jpg.
На фотографиях "Красного перчика после дождя" указан уровень качества JPEG для сравнения:
Размеры этой jpg картинки в зависимости от уровня качества (Q - качество, KB - это размер в килобайтах):
Q 10 = 2 KB; Q 15 = 2,7 KB; Q 30 = 4,3 KB; Q 50 = 5,9 KB; Q 60 = 6,7 KB; Q 70 = 7,9 KB; Q 80 = 9,8 KB; Q 90 = 14,1 KB; Q 100 = 46,5 KB.
Из вышеуказанных примеров можно сделать вывод, что наилучшим соотношением размер-качество может быть уровень качества от 75 до 95. А для того, чтобы картинка занимала наименьший размер и была в тоже время более и менее нормальной, подойдёт качество 60-70. Если качество не имеет значения, а нужен маленький размер файла, то подойдёт процент качества от 30 до 50.
Обратите внимание, что размер файла прогрессивной JPEG картинки обычно меньше стандартной на 2-3% с таким же качеством изображения, да и ещё будет красиво открываться при её загрузке в интернет браузере, как это обычно делают в фильмах! Пример стандартной и прогрессивной JPEG картинки можно посмотреть здесь.
Ещё можно сжать JPG указав желаемый размер в Кбайтах, а также уменьшить размер фото или картинки в килобайтах или мегабайтах за счёт уменьшения количества пикселей или мегапикселей.
Допустим, есть какой-то произвольный файл, который имеет вес N КБ.
Можно ли изменить размер файла в большую сторону при этом не потеряв свойств файла(файл по прежнему открывается в программах, которых открывался ранее и не должен отображаться как-то иначе) или подобная манипуляция будет напрямую зависеть от формата над которым это будет делаться?
Например, дополнить незначащими 0 .
Однозначно зависит от формата и от того, как формат читается. ZIP-файлы, к примеру, должны читаться с хвоста и добавление в хвост лишней информации может привести к нечитаемости. Но большинство софта кладут на спецификацию и читают ZIP с головы.
9,596 4 4 золотых знака 19 19 серебряных знаков 35 35 бронзовых знаковДля изменения размера файла предусмотрена группа системных вызовов truncate(2). Одноимённая утилита позволит получить возможность вызывать их из командой строки. Например, следующая команда установит новый размер указанного файла равным 17 ТБ. Причём, если его размер был больше, содержимое будет урезано, если он был меньше, содержимое будет дополнено нулевыми байтами. Стоит отметить, что в последнем случае файл получится разреженным - в реальности на диске не будут храниться сполшные нули, а будет просто пометка в дескрипторе файла, что он содержит нулевые блоки. Это довольно эфективно.
Эта команда не изменяет все остальные свойства файла, она влияет только на содержимое и размер.
Читайте также: