![]() |
|
|
![]()
|
|
| livo |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 14.10.2007 Репутация: 1 Всего: 1 |
Поиски по форуму ответа не дали.
Я знаю такие способы копирования:
Но, я так понимаю, они загружают данные в буфер перед тем, как отправить содержимое этого буфера на винч. Однако мне бы хотелось производить копирование напрямик: используя только средства жесткого диска. Ведь это быстрее. Существует ли решение этой задачи? |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
насколько я понял, тебе нужна ф-я CopyFile
Добавлено через 1 минуту и 57 секунд
АФАИК, ф-я CopyFile то-же использует какой-то буфер внутри себя, а то что ты хочешь - вряд-ли возможно, так-как жесткий диск ничего не знает о файловой системе |
|||
|
||||
| livo |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 14.10.2007 Репутация: 1 Всего: 1 |
Lazin, о функции CopyFile я тоже знаю. По твоим словам выходит, что невозможно скопировать файл не используя какой-то буфер в оперативке.
В таком случае было бы неплохо реализовать алгоритм, позволяющий максимально быстро копировать файлы. Например, как в тотал коммандер (здесь копирование, по-моему, даже быстрее, чем в апи SHFileOperations). Скоро подготовлю пример. Вот он (почему-то не работает):
Это сообщение отредактировал(а) livo - 1.11.2009, 13:43 |
|||
|
||||
| vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: 10 Всего: 12 |
Если честно, вопрос очень странный. Такое ощущение, но я надеюсь, что ошибаюсь, что Вы мало знаете устройство компьютера в целом, а в частности устройство и работу жесткого. Даже если бы это и было возможно, то только с двумя жесткими дисками. Но тогда жесткие диски должны были бы уметь коннектиться друг к другу и осуществлять прямое копирование без использование ОС. Я о таком чуде не слышал! А если у Вас используется всего 1 диск, то без буфера тут вообще не обойтись, как Вы себе представляете как 1 головка будет переносить данные из одной области в другую? Еще при копировании должен быть компромисс скорость/буфер выделенный в памяти.
-------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
| livo |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 14.10.2007 Репутация: 1 Всего: 1 |
vikaz, моя задача проста: произвести наиболее быстрое копирование. Вот и все.
Насчет устройства винта, я знаю, что невозможно читать и писать одновременно. Однако я знаю, что жестк. диск имеет собственный буфер. Просто стало интересно: можно ли его использовать в своей программе. |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
им управляет контроллер жесткого диска, никак не ос что-бы максимально быстро считать и записать файл, нужно читать и записывать в обход системного кэша, считываешь сектор(или сразу несколько) из одного файла, записываешь в другой. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Ну так если подумать. NTFS это файловая система. Про нее жесткий диск ничего не знает, так же как о файлах. Для него нет понятия файла. Самое низкоуровневое что можно сделать, только обратиться к драйверу файловой системы напрямую. Думаю, что функция ReadFile как раз это и делает, по крайней мере ее используют для операций ввода/вывода драйверов.
На счет копирования файлов хочу поделиться своим опытом. Если физически устройства различные, то буфера 40-100кб будет достаточно. Если это 2е партиции одного винта, то выгодно использовать буфер порядка 10Мб, поскольку в этом случае количество перемещений магнитной головки будет минимальным. Для флешки оптимальный размер гораздо меньше, главное чтобы время на вызовы функции не было дольше операции копирования блока (лучше если не мене десяти раз меньше) -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| livo |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 14.10.2007 Репутация: 1 Всего: 1 |
Было бы неплохо обойти этот кэш. Но каким образом это можно сделать? |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
Ф-ии ReadFile/WriteFile, нужно указать флаг FILE_FLAG_NO_BUFFERING, читать и записывать можно будет только порции данных, кратные размеру сектора, вся необходимая информация есть в MSDN, в описании ф-ий ReadFile/WriteFile |
|||
|
||||
| vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: 10 Всего: 12 |
Полностью поддерживаю.... -------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
| livo |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 14.10.2007 Репутация: 1 Всего: 1 |
А можно ли в паре с этими функциями использовать отображение прогресса копирования?
|
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
||||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Если использовать CopyFileEx, то можно воспользоваться параметром LPPROGRESS_ROUTINE lpProgressRoutine и выводить прогресс из калбэка.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| livo |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 14.10.2007 Репутация: 1 Всего: 1 |
Alexeis, спс за подсказку.
Реализовал такой вот примерчик:
Однако сравнил время копирования файла размером 2 412 146 169 байт с помощью этого алгоритма и с помощью т. коммандера. Разница составиляла от 7 до 10 секунд. |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |