Автор вопроса: Neco | Web-сайт:neco.pisem.net | ICQ: 247906854
Народ! Здарова! У меня здесь ночь, поэтому доброго всем утра! 8) Спать хочется-а-а... Ближе к делу. Начал тут создавать класс для редактирования тэгов первой версии (по примеру Беляева) и вдруг понял, что класс должен уметь удалять тэги вообще. Не знаю, кому может понадобиться, но раз начал писать - надо! И вот тут-то вышла заминочка... Тэги первой версии, как вы все, наверное, знаете, храняться в последних 127 байтах файла. Чтобы удалить тэг, их можно затереть нулями, но это нехарашо как-то. Получается, что каждый созданный, а потом удалённый тэг будет прибавлять файлу вес. Значит надо удалить конец файла. "Всего-то!" - подумал я и ... тормознулся! Я-то оказывается, понятия не имею, как можно уменьшить размер файла. Некоторую долю шока даже испытал... Неприятно... Я понимаю, что самый простой способ - это скопировать в переменную начало (весь файл минус 127 байт) и записать его во второй файл, потом первый стереть и переименовать второй в первый. Но этот способ вынуждает останавливать трэк, а WinAmp делает это без срывов (в отличие от редактирования тэгов второй версии - вот где гимор-то). Так вот, народ. Подскажите, пожалуйста, как разобраться с этой, на первый взгляд плёвой, проблемой.
P.S. Может ответ и очевиден, но я сейчас спать хочу - голова работает в экономичном режиме. Задам вопрос и лапки кверху. Это я к тому, что если я завтра утром, вдруг пойму КАК, то сразу вам расскажу...
По поводу того, что WinAMP делает это без срывов, мне кажется, что он использует для воспроизведения маппированный файл (хотя непонятно, почему он тогда отрубается, если файл вдруг становится недоступным?), а исправляет реальный. А еще вариант - он откладывает изменение файла... Хотя не проверял, сложно сказать.
А может WinAmp попросту кэширует некоторое кол-во информации.. А вообще я вот сейчас посмотрел, удалил ID v3 тэг, файл сколько весил, так ни на байт и не полегчал... Заполнил весь, не потяжелел, так что похоже никто на этом не заморачивался...
Это как кэш в винампе настроен. Если поставишь метров 6-7 - будет весь файл в него загонять, потом его хоть удаляй - все равно он его играть будет. Проверено.
Dim strTmp As String Open strFile For Binary Access Read Lock Write As #1 'Seek #1, LOF(1) - 127 strTmp = Space$(LOF(1) - 127) Get #1, 1, strTmp Close #1 Open strFile For Output As #1 Print #1, strTmp Close #1
2LamerOnLine: А почему же тогда при применении изменений тэгов второй версии идёт скачок, а при изменении первых нет? ИМХО тут дело именно в том, что изменения в конце файла ему по шарабану - он читает из середины. А когда ВинАмп удаляет начало файла, то он, как я понимаю, сначала запоминает место на котором играл, потом закрывает, быстренько редактирует, включает его снова и ставит время как было, ну и, может, плюс время на перезапись. Но точность, видимо, не ВАХ (может до секунды?), поэтому и срывает.
)) Necо, все равно, ты при таком подходе файл удаляешь, т.е. при открытиии файла For Output, все содержимое файла - теряется, так что это мало отличается от того чтобы удалить файл...
Neco, я в предыдущем посте сказал же что файл размера не меняет, пробуй сам!!! Т.е. WinAmp не удаляет данные, а попросту заполняет их нулями!!! А вторые теги (т.к. они не имеют какого-то ограничения), их нулями заполнять не реально, и вот тут уже WinAmp перезаписывает данные в файл. Все вышесказанное, естесственно, только мои предположения, и на то что они есть правда нет ни какой гарантии (WinAmp не емть Open Source программа), но судя по его поведению, все так и есть...
А я тебе про что говорю? Разумеется, WinAmp буферизирует часть файла, и пока он его воспроизводит - он к нему периодически возвращается. Попробуешь изменить файл в это время - возникнут проблемы. На последние 127 байт ему наплевать, это логично.
Когда же буфер стоит метров на 7, он считывает файл целиком и закрывает его. Дальнейшие извращения над файлом на звучании не сказываются. Сам проверь.