Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как вырезать кусок файла

1.9K
20 октября 2004 года
Putch
64 / / 22.02.2003
Собственно неожиданно понадобилось совершить следующе:




Допустим у меня есть файл binarnik.bin размером 100 метров мне нужно из середины этого файла убрать кусок размером в 20 метров чтобы файл стал размером 80 метров за максимально быстрое время

грубо говоря мне нужно !фрагментировать! файл ))


может что подскажете


4.4K
22 октября 2004 года
blind rain
66 / / 20.07.2004
Бейсик тут плохой помощник.
Можно Дж.Рихтера книжку посмотреть по Windows насчет мапируемых в память файлов, может чем полезна будет.

Если проще, то читать небольшими порциями 100K файл (только не с помощью Open и не в String, а, например, API CreateFile и в Buffer() as Byte), и добавлять в другой файл, пропуская ненужные блоки.
При работе с API функциями, которые указатели на память требуют, полезны функции VarPtr, StrPtr, а в Declare выражении параметры String или другие структуры API text viewer-ом подсунутые заменять на ByVal pData as Long (с разумным подходом, конечно).
массив передавать как VarPtr(Buffer(0)), а то SAFEARRAY, каковым бейсиковский массив является по адресу самого массива содержит информацию о размере, поэтому надо передавать адрес первого элемента.
1.9K
22 октября 2004 года
Putch
64 / / 22.02.2003
Цитата:
Originally posted by blind rain
Бейсик тут плохой помощник.
Можно Дж.Рихтера книжку посмотреть по Windows насчет мапируемых в память файлов, может чем полезна будет.

Если проще, то читать небольшими порциями 100K файл (только не с помощью Open и не в String, а, например, API CreateFile и в Buffer() as Byte), и добавлять в другой файл, пропуская ненужные блоки.
При работе с API функциями, которые указатели на память требуют, полезны функции VarPtr, StrPtr, а в Declare выражении параметры String или другие структуры API text viewer-ом подсунутые заменять на ByVal pData as Long (с разумным подходом, конечно).
массив передавать как VarPtr(Buffer(0)), а то SAFEARRAY, каковым бейсиковский массив является по адресу самого массива содержит информацию о размере, поэтому надо передавать адрес первого элемента.







это я и сам прекрасно знаю

- мне нужна скорость - в ущерб фрагментации
копирование порциями - очень долго - вдруг у меня файл размером 10 гигов а мне где-нибудь в начале 1 мегабайт надо вырезать и что мне все 9 гигов оставшиеся перегонять?
это уйма времени нужно чтото намного быстрее

8.0K
25 октября 2004 года
Volkov
15 / / 23.09.2004
Цитата:
Originally posted by Putch

это я и сам прекрасно знаю

- мне нужна скорость - в ущерб фрагментации
копирование порциями - очень долго - вдруг у меня файл размером 10 гигов а мне где-нибудь в начале 1 мегабайт надо вырезать и что мне все 9 гигов оставшиеся перегонять?
это уйма времени нужно чтото намного быстрее


10Mb это не так уж много. Нужно бы использовать Win32 API.

1.Запросить память равную второй половине (VirtualAlloc)
2.Открыть файл
3.Читать всю вторую половину в память одной командой
4.Позиционировать указатель на конце первой половины
5.Записать вторую половину одной командой.
6.Закрыть файл и освободить память (VirtualFree)

1.9K
25 октября 2004 года
Putch
64 / / 22.02.2003
Цитата:
Originally posted by Volkov

10Mb это не так уж много. Нужно бы использовать Win32 API.

1.Запросить память равную второй половине (VirtualAlloc)
2.Открыть файл
3.Читать всю вторую половину в память одной командой
4.Позиционировать указатель на конце первой половины
5.Записать вторую половину одной командой.
6.Закрыть файл и освободить память (VirtualFree)





тут не 10 мегов а 10 гигов я привел то есть 10240 мегабайт

так что нет - нужно имнно то что нужно

- а на 10 мегов я бы и не парился )))

4.4K
26 октября 2004 года
blind rain
66 / / 20.07.2004
Цитата:
Originally posted by Putch


- мне нужна скорость - в ущерб фрагментации



Похоже, что решение уже придумано? Хочешь таблицу размещения файлов подправить - так это вопрос по системному программированию. VB - слишком высокоуровневый язык для таких операций. Кроме того, я даже не натыкался на на Win API, которое позволяло бы такие "опасные" для системы операции делать. Но дефрагментаторы - то люди пишут.

1.9K
26 октября 2004 года
Putch
64 / / 22.02.2003
Цитата:
Originally posted by blind rain


Похоже, что решение уже придумано? Хочешь таблицу размещения файлов подправить - так это вопрос по системному программированию. VB - слишком высокоуровневый язык для таких операций. Кроме того, я даже не натыкался на на Win API, которое позволяло бы такие "опасные" для системы операции делать. Но дефрагментаторы - то люди пишут.





пожалуй я придумал как обойтись без фрагментирования файла
но опятже возник вопрос - а как с конца то файл отрезать - не записывая его заново??? :) :) :) - но думаю история тажа что и с фрагментированием ))

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог