Как вырезать кусок файла
Допустим у меня есть файл binarnik.bin размером 100 метров мне нужно из середины этого файла убрать кусок размером в 20 метров чтобы файл стал размером 80 метров за максимально быстрое время
грубо говоря мне нужно !фрагментировать! файл ))
может что подскажете
Можно Дж.Рихтера книжку посмотреть по 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, каковым бейсиковский массив является по адресу самого массива содержит информацию о размере, поэтому надо передавать адрес первого элемента.
Бейсик тут плохой помощник.
Можно Дж.Рихтера книжку посмотреть по 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 гигов оставшиеся перегонять?
это уйма времени нужно чтото намного быстрее
это я и сам прекрасно знаю
- мне нужна скорость - в ущерб фрагментации
копирование порциями - очень долго - вдруг у меня файл размером 10 гигов а мне где-нибудь в начале 1 мегабайт надо вырезать и что мне все 9 гигов оставшиеся перегонять?
это уйма времени нужно чтото намного быстрее
10Mb это не так уж много. Нужно бы использовать Win32 API.
1.Запросить память равную второй половине (VirtualAlloc)
2.Открыть файл
3.Читать всю вторую половину в память одной командой
4.Позиционировать указатель на конце первой половины
5.Записать вторую половину одной командой.
6.Закрыть файл и освободить память (VirtualFree)
10Mb это не так уж много. Нужно бы использовать Win32 API.
1.Запросить память равную второй половине (VirtualAlloc)
2.Открыть файл
3.Читать всю вторую половину в память одной командой
4.Позиционировать указатель на конце первой половины
5.Записать вторую половину одной командой.
6.Закрыть файл и освободить память (VirtualFree)
тут не 10 мегов а 10 гигов я привел то есть 10240 мегабайт
так что нет - нужно имнно то что нужно
- а на 10 мегов я бы и не парился )))
- мне нужна скорость - в ущерб фрагментации
Похоже, что решение уже придумано? Хочешь таблицу размещения файлов подправить - так это вопрос по системному программированию. VB - слишком высокоуровневый язык для таких операций. Кроме того, я даже не натыкался на на Win API, которое позволяло бы такие "опасные" для системы операции делать. Но дефрагментаторы - то люди пишут.
Похоже, что решение уже придумано? Хочешь таблицу размещения файлов подправить - так это вопрос по системному программированию. VB - слишком высокоуровневый язык для таких операций. Кроме того, я даже не натыкался на на Win API, которое позволяло бы такие "опасные" для системы операции делать. Но дефрагментаторы - то люди пишут.
пожалуй я придумал как обойтись без фрагментирования файла
но опятже возник вопрос - а как с конца то файл отрезать - не записывая его заново??? :) :) :) - но думаю история тажа что и с фрагментированием ))