Получить путь к файлу в Qt из дескриптора файла winapi в виде QString, QFileInfo или чего-то подобного

#c #qt #winapi #handle #fileapi

#c #qt #winapi #дескриптор #fileapi

Вопрос:

Мое приложение использует CopyFileExW для быстрого копирования и включает обратный вызов LPPROGRESS_ROUTINE для отслеживания прогресса. Поскольку я могу копировать файлы одновременно, мне нужно отслеживать прогресс файла в глобальном смысле.

Для этого я бы использовал QMap<QStrin&, quint64&&t; в качестве сопоставления пути к файлу / хэша файла и записанных байтов на файл. Чтобы получить путь к файлу или хэш файла, мне нужно получить путь к файлу. Одно из предложений — использовать GetFinalPathNameByHandleA, что выглядит многообещающе.

Проблема:

Похоже, у меня нет доступа к функции GetFinalPathNameByHandleA, найденной в <fileapi.h&&t; , как показано на изображении ниже:

Как я могу получить путь к файлу из дескриптора файла (особенно в Windows)?

к вашему сведению: использование Windows 10 x64 с 32-разрядным компилятором MinGW и Qt Creator 4.12

Комментарии:

1. Какую версию Windows вы используете? GetFinalPathNameByHandleA должен быть там с Windows Vista…

2. Поскольку я могу копировать файлы одновременно, мне нужно отслеживать прогресс файла в глобальном смысле — это 100% ошибка проектирования

3. @Разгром Windows 10 x64 со статической сборкой Qt 5.13.1

4. 32-разрядная MinGW — это наихудшая возможная среда компиляции, которую вы могли бы выбрать для разработки Windows. Он поставляется с заголовками, которые не обновлялись десятилетиями, и использует значения по умолчанию, как если бы мы все еще были в основном ориентированы на Windows 95. Практически любая другая IDE / платформа разработки подходит лучше (только не выбирайте Code::Blocks по тем же причинам).

5. CopyFileEx() позволяет передавать пользовательские данные в процедуру выполнения обратного вызова. Вы могли бы использовать эту функцию для передачи указателя на каждый из quint64 ваших QMap файлов, чтобы обратный вызов мог их обновить. Вам вообще не нужно было бы получать путь к файлу, за исключением самого вызова CopyFileEx() .