Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
12 / 4 / 1
Регистрация: 11.09.2018
Сообщений: 67

Прогресс выполнения копирования через File::Copy или быстрое копирование

23.10.2018, 04:27. Показов 3117. Ответов 36

Студворк — интернет-сервис помощи студентам
Доброго времени суток, коллеги.
Я конечно не могу похвастаться большим опытом в программировании на С++, тем более что приходиться работать в среде с /clr
Задача простая, скопировать файлы и попутно выводить прогресс. Среди условий копирование файлов с компа на "флешку" (на самом деле устройство определяемое как флешка) и обратно.
Если при копирование НА комп с носителя все прошло благополучно, и файлы копируются, и прогресс показывается и скорость удовлетворительная, то при обратной операции, (Внимание!!!) те же файлы, на то же устройство, в общем полностью обратный процесс, занимает очень и очень длительное время. В чем причина не понятно, подозреваю, что эта проблема вызвана самим устройством (флешкой), то есть подозреваю что аппаратно чтение быстрее скорости априори и при использовании моей функции для копирования, происходит многократное усугубление ситуации.
Также, не будь дураком, порыскал в гугле на тему как ускорить копирование, так и не разобравшись, догадался использовать:
C++
1
System::IO::File::Copy("источник", "назначение")
оказалось что эта функция работает в направлении С компа НА флешку куда быстрее. Тут понятно, по этой теме инфы предостаточно виноваты во всем потоковые операции. Я решил не заморачиваться, и быстренько состряпал функцию для вывода процесса копирования с использование наиболее быстрого имеющегося у меня кода, однако вот уже битый час не могу понять почему функция, которая должна складывать размер файлов и выдавать результат сразу выдает конечный размер файла, как только до него доходит очередь.
То есть функция складывает размер файлов и выдает результат, но выдает не совсем так как ожидалось. Я уже эту функцию перевернул с ног на голову и как только не извращался, даже дошел до того что брал под контроль папки и считывал размер всех ее файлов, но она упрямо выдает сразу конечный результат, когда четко известно что копирование еще не завершено.
Может мне кто-то помочь в данной ситуации. Самый простой вариант это довести до ума функцию сообщающую прогресс копирования при использовании
C++
1
File::Copy();
, ну или может вы поделитесь своим рабочим кодом быстрого копирования файлов с прогрессом.
Для справки, проект не коммерческий, даже немного благотворительный ))

Привожу для примера один из вариантов функции отслеживающей прогресс, как бы отслеживающей ((
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int checkSumm(ArrayList^ commands){
            int allSumm = 0;
            int checkedSumm = 0;
            int result = 0;
            String^ patternCopy = "^copy_\\((.+)\\)_to_\\((.+)\\)$";
            for each(String^ commanda in commands){
                if(Regex::IsMatch(commanda,patternCopy)){
                    MatchCollection^ matching = Regex::Matches(commanda,patternCopy);
                    String^ fileFrom = (String^) matching->default[0]->Groups[1]->Value;
                    String^ fileTo = (String^) matching->default[0]->Groups[2]->Value;
                    arrOutFiles->Add(fileTo);
                    FileInfo^ finfoFrom = gcnew FileInfo(fileFrom);
                    FileInfo^ finfoTo = gcnew FileInfo(fileTo);
                    allSumm += Convert::ToInt32(finfoFrom->Length);
                    if(finfoTo->Exists){
                        checkedSumm += Convert::ToInt32(finfoTo->Length);
                    }
                }
            }
//на этого крокодила ниже не обращайте внимания, мне так надо )))
            result = Convert::ToInt32(Math::Floor((double)checkedSumm*(double)100/(double)allSumm));
            return result;
}

Добавлено через 14 минут
Небольшое дополнение: Есть мысли, что функция копирования создает "пустой" файл конечного объема, отсюда возможно что моя функция прогресса получает такой результат, но на флешке при прерванной операции фалйы имеют реальный размер, я конечно могу ошибаться и могу еще много чего не знать. Опыта ведь мало (((
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.10.2018, 04:27
Ответы с готовыми решениями:

Отобразить прогресс перемещения или копирования файла (CopyFileEx или MoveFileWithProgress)
Добрый день! Хочу при перемещении файла отображать прогресс, например в ProgressBar. Использую функцию MoveFileWithProgress. Знаю, там...

Файл базы SQLITE не копируется через IO.File.Copy
Ребят, никто не сталкивался? Хочу сделать кнопочку создания (копирования) резервной коаии базы данных. База пока не сильно надулась, всего...

Ожидания выполнения до конца или прогресс бар
Всем привет! Суть в том что при загрузке фотографий в БД , если закрыть окно - то фотографии загружаются не полностью.returnValue - дает...

36
Эксперт .NET
 Аватар для Rius
13371 / 7826 / 1695
Регистрация: 25.05.2015
Сообщений: 23,827
Записей в блоге: 14
23.10.2018, 17:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от PsychoTech Посмотреть сообщение
Или быть может перепишите на /cli? Этот вариант более предпочтительней.
Для меня C++/CLI такой... Читать могу кое-как, а писать - нет.
Цитата Сообщение от PsychoTech Посмотреть сообщение
может соберете простенькую библиотеку dll
В архиве. 2 варианта метода.
C#
1
2
3
CopyLib.CopyUtility.CopyFile(source, destination, true, useBuffer, percent => Console.WriteLine(percent));
и
CopyLib.CopyUtility.CopyFile(source, destination, percent => Console.WriteLine(percent));
Вложения
Тип файла: zip copy.zip (37.6 Кб, 4 просмотров)
0
12 / 4 / 1
Регистрация: 11.09.2018
Сообщений: 67
23.10.2018, 17:22  [ТС]
И еще хотелось бы выяснить детали, причины и следствия, чтобы не просто копировать код а еще и понимать что при этом делается. Иначе плохой из меня программист получится.

Добавлено через 4 минуты
Цитата Сообщение от Rius Посмотреть сообщение
Для меня C++/CLI такой... Читать могу кое-как, а писать - нет.
Не зря видимо меня наставник отговорил от шарпа ))) Я читать могу и С++ и /cli и шарп, шарп и cli похожи, я даже часть кодов уже адаптировал, но это не всегда удается, как в данном случае. Конкретно я не знаю как использовать
C++
1
FileStream
ибо он немного отличается от шарповского. Что ж буду пробовать может бубен поможет)) ну а нет значит буду использовать то что есть.
0
Эксперт .NET
 Аватар для Rius
13371 / 7826 / 1695
Регистрация: 25.05.2015
Сообщений: 23,827
Записей в блоге: 14
23.10.2018, 17:43
Цитата Сообщение от PsychoTech Посмотреть сообщение
Не зря видимо меня наставник отговорил от шарпа )))
Абсолютно зря и не продуманно. Увы, C++/CLI - дохлый язык.
Берём, например, справку по методу FileStream.Read и видим примеры на языках: C#, VB.Net и... всё. А те, кто непонятно зачем выбрал другие языки, сами себе злобные буратины
По C# документации и примеров - МОРЕ, а по C++/CLI - кот наплакал.

Добавлено через 1 минуту
Цитата Сообщение от PsychoTech Посмотреть сообщение
ибо он немного отличается от шарповского
Ничем он не отличается. Методы те же, т.к. они во фреймворке находятся. Запись в коде только немного другая.

Добавлено через 10 минут
Цитата Сообщение от PsychoTech Посмотреть сообщение
И еще хотелось бы выяснить детали, причины и следствия, чтобы не просто копировать код а еще и понимать что при этом делается
Буфер байт надо создать лишь 1 раз, потом читать в него и из него записывать. Прочие операции, типа чтения массива из BinaryReader и проверки длины потока, излишни. Кстати, на Си WinAPI такой код переносится тривиально.

Ну и повторюсь, вам, вполне может быть, кажется, что запись идёт быстро. Потому что кеширование так и выглядит.
0
12 / 4 / 1
Регистрация: 11.09.2018
Сообщений: 67
23.10.2018, 18:01  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Ну и повторюсь, вам, вполне может быть, кажется, что запись идёт быстро. Потому что кеширование так и выглядит.
Ну как может казаться если программа автоматом извлекает устройство через 20 сек и через минуты Это абсурдно уже звучит. ))
0
23.10.2018, 18:03

Не по теме:

Ооо, сколько в мире творится абсурда, и не перечислить...

0
12 / 4 / 1
Регистрация: 11.09.2018
Сообщений: 67
25.10.2018, 19:52  [ТС]
И я лопух и никто не подсказал . Все я правильно делал надо было всего лишь добавить в код
C++
1
binwriter->Flush();
и всЁ.
0
Эксперт .NET
 Аватар для Rius
13371 / 7826 / 1695
Регистрация: 25.05.2015
Сообщений: 23,827
Записей в блоге: 14
25.10.2018, 20:01
Во-первых, надо юзать using () {}
Во-вторых, Flush перед Close не обязателен. А с using ни то, ни другое не требуется.
В-третьих, потестите флешку в Crystal Disk Mark.
1
12 / 4 / 1
Регистрация: 11.09.2018
Сообщений: 67
25.10.2018, 20:04  [ТС]
мой принцип работает, пусть работает.))
Про конструкцию using я что-то не могу припомнить чтобы в моих учебниках об этом говорилось.
0
Эксперт .NET
 Аватар для Rius
13371 / 7826 / 1695
Регистрация: 25.05.2015
Сообщений: 23,827
Записей в блоге: 14
25.10.2018, 20:06
Цитата Сообщение от PsychoTech Посмотреть сообщение
мой принцип работает, пусть работает.))
Это костыль. А костыли славятся тем, что у разработчика они работают, пока на них не дышишь. А у пользователя - падают.
Цитата Сообщение от PsychoTech Посмотреть сообщение
Про конструкцию using я что-то не могу припомнить чтобы в моих учебниках об этом говорилось.
Либо невнимательно читали, либо фиговый учебник.
using Statement (C# Reference)
Используйте её по возможности всегда, с теми классами, что реализуют IDisposable.
0
12 / 4 / 1
Регистрация: 11.09.2018
Сообщений: 67
25.10.2018, 20:23  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
using Statement (C# Reference)
https://habr.com/post/111071/
Вы все же к шарпу привыкли, но я учту все ваши замечания и буду совершенствоваться.
0
25.10.2018, 20:24

Не по теме:

Ой блин, точно :D
Не все возможности от C# портируют в остальные языки.

0
25.10.2018, 20:55

Не по теме:

Цитата Сообщение от Rius Посмотреть сообщение
Не по теме:
Ой блин, точно :D
Не все возможности от C# портируют в остальные языки.
Если бы на c++/cli не забили бы(к стати он с vs 2005 ни капельки не изменился), то может быть и были прибамбасы вроде using, lock. А так приходится писать целые блоки вместо одной команды и скобок.
PsychoTech, если собрались работать на .net, то лучше слезать потихоньку с этого языка в пользу c# или vb.net (который попроще будет)

0
25.10.2018, 20:57

Не по теме:

Цитата Сообщение от Sklifosofsky Посмотреть сообщение
А так приходится писать целые блоки вместо одной команды и скобок.
Да... Кто выбрал этот язык , хотя его предупредили о заброшенности, - сам виноват.

"Карибасы должны страдать!" - EVE Online.

0
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
25.10.2018, 20:58
https://docs.microsoft.com/ru-... hprogressw
Так для справки, есть API для копирования/переноса данных файла. При помощи обработчика можно вести учет копированных данных, ошибок записи и не которых других прибамбасов
0
12 / 4 / 1
Регистрация: 11.09.2018
Сообщений: 67
31.10.2018, 17:42  [ТС]

Не по теме:

Цитата Сообщение от Sklifosofsky Посмотреть сообщение
PsychoTech, если собрались работать на .net, то лучше слезать потихоньку с этого языка в пользу c# или vb.net (который попроще будет)
Я не по своей воле сижу на c++/cli. У меня ограниченная лицензия ОС и единственное что стало из семейства Microsoft Visual это Visual C++ 2008 Express Edition. Почему это семейство думаю понятно, средствами не располагаю, и разрабатываемый интерфейс более приятный чем у билдера и прочих где все выглядит как программы из 90-х. Пока учил язык среды хватало для отработки примеров. Но а едва выучил, оказалось что уже нужно приступать к работе и сделать несколько программ, поэтому вникать в тонкости среды нет времени и использую как есть без лишних настроек. Позже когда "горячие" проекты будут закончены, думаю посвящу время на изучение среды, а может и переставлю систему на ноуте (у меня только он). Я сначала даже не вдуплился что среда под /cli. вот так и живем. В целом проблемы не вижу, все что я хотел, почти уже закончил, причем без особых трудностей, ну разве что из-за своей невнимательности, и частных случаев, когда пришлось обращаться за помощью к более опытным.



Добавлено через 4 минуты

Не по теме:

Цитата Сообщение от Sklifosofsky Посмотреть сообщение
лучше слезать потихоньку с этого языка в пользу c# или vb.net (который попроще будет)
А вопрос не по теме, а что С++ в чистом виде тоже отмирает? Просто хотелось бы работать именно на с++, хотя думаю в последствии подтянусь и на С#

0
Эксперт .NET
 Аватар для Rius
13371 / 7826 / 1695
Регистрация: 25.05.2015
Сообщений: 23,827
Записей в блоге: 14
31.10.2018, 17:54
Цитата Сообщение от PsychoTech Посмотреть сообщение
Почему это семейство думаю понятно
Windows XP, чтоль?...
Цитата Сообщение от PsychoTech Посмотреть сообщение
средствами не располагаю
Есть бесплатная Visual Studio 2017 Community. Если делаете для себя, или контора у вас мелкая.
Но если у вас крупное предприятие, то Community да, не подойдёт. Но, точно также не подойдёт и Express, т.к. её лицензия запрещает применение на коммерческих предприятиях для коммерческих разработок (и не смотрите, что она типа бесплатная).
Цитата Сообщение от PsychoTech Посмотреть сообщение
разрабатываемый интерфейс более приятный чем у билдера и прочих где все выглядит как программы из 90-х
Согласен.

Цитата Сообщение от PsychoTech Посмотреть сообщение
А вопрос не по теме, а что С++ в чистом виде тоже отмирает?
Ни разу не отмирает. К сожалению , полных альтернатив пока нет.
Просто на заре появления .Net Framework компания Microsoft разработала свой язык как альтернативу Java от Oracle, это был C#. А чтобы заманить разработчиков на VC++ и VB сюда, были сделаны и эти языки.
Но получилось так, что C# успешно развивается, получает новые фичи, имеет море документации и примеров; VB .Net оставлен для новичков, ничего не усложняют и не развивают; C++/CLI - непонятно, очень нишевый, без него можно обойитсь, как следствие - он не популярен.
0
31.10.2018, 19:23  [ТС]

Не по теме:

Цитата Сообщение от Rius Посмотреть сообщение
Windows XP, чтоль?...
8.1 для одного языка последние версии Visual Studio не устанавливаются, ругается на систему, короче гони бабло или иди по известному адресу :ireful: Это система шла с ноутом, руки сразу не дошли сменить а теперь надо мозговать куда всю инфу слить чтобы не потерять.
Цитата Сообщение от Rius Посмотреть сообщение
лицензия запрещает применение на коммерческих предприятиях для коммерческих разработок
Класть я на них хотел с их лицензиями, я игры на этой платформе не планирую выпускать, а вот для внутреннего пользования среди "наших" думаю пойдет.
Цитата Сообщение от Rius Посмотреть сообщение
.Net Framework
вообще задачи не стояло, я хотел просто выучить язык с++. Сейчас добью программу и займусь организацией своих инструментов, еще и телефон прошить надо, опять спутники не видит. (((

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.10.2018, 19:23

Не удаётся отображать прогресс выполнения SQL запросов через Recordset
Возможно, тема уже обсуждалась, но ответа на свой вопрос через поиск не нашёл. Прошу помочь, если кто-то сталкивался с аналогичной...

Fail to copy file to HDD.File:E\images\WOP000280OXXTC0111.SWM
Добрый день,новичек просит помощи в решении ошибки(тема),возникающей при установке W7 домашняя расширенная (лицензионная,пред установлен...

Построчное копирование папок, с сохранением структуры или копирования из файла
Добрый вечер. 1 вопрос: Подскажите пожалуйста, как можно произвести копирование каталогов с определенным вложением (содержимым...

Прогресс выполнения функции AJAX и время выполнения
Здравствуйте. Как ни странно не нашел ответа на решение своей проблемы. Есть функция, которая обрабатывается AJAX-ом на стороне сервера....

Команда копирования Copy
Команда копирования Copy: 1) Добавить несколько строк с клавиатуры в конец существующего текстового файла (txt). 2) Что следует выбрать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru