QT — QFileSystemModel в программе сервер-клиент

Я работаю над проектом QT сервер-клиент, который позволяет передавать файлы между сервером и клиентом. Будучи проектом с графическим интерфейсом, я хочу отобразить файловую систему сервера в клиентской программе, например, в проводнике файлов.

Вопрос заключается в следующем: есть ли способ отправить QFileSystemModel или QFileSystemWatcher с сервера на клиент или отобразить системный файл сервера на стороне клиента? Спасибо.

2

Решение

Лучший подход к решению этой проблемы — реализовать метод сериализации для вашего объекта (объектов). Как только это будет сделано, вам нужно будет реализовать правила для обмена такими сериализованными объектами на уровне протокола связи.

Например, вы можете сериализовать путь следующим образом:

file size - 8bytes; path flags - 1byte; path size - 2bytes; actual path - `path size` bytes;

В поле размера файла вы сохраняете размер файла, на который указывает путь, в поле флагов вы сохраняете дополнительную информацию о файле (например, если это каталог / файл и т. Д .;) в размере пути размера пути и в поле фактического пути, (очевидно) путь.

Например, скажем, я хочу различать файлы / каталоги, установив бит 0 в поле флагов: 1 для файлов, 0 для каталогов. Путь к каталогу, содержащий 512 МБ файлов, таких как ‘/ abc / d / efg’, будет сериализован как (используя | как разделитель полей):

536870912 | 0 | 10 | /abc/d/efg

Чтобы сериализовать дерево каталогов, нужно просто сериализовать каждый файл и сохранить байты в векторе. Чтобы сериализовать вектор, нужно просто добавить к нему префикс (скажем, 4 байта), указывающий количество файлов, которые он содержит; Например, поток в этом формате:

2 | (536870912 | 0 | 10 | /abc/d/efg), (536870912 | 0 | 10 | /abc/d/efh)

Скажите мне, что у меня есть 2 записи пути к файлу, оба размером 512 МБ, оба каталога один с именем /abc/d/efg/ и один с именем /abc/d/efh,

Теперь вы знаете, как сериализовать / десериализовать дерево каталогов. Чтобы отправить его другой стороне, я бы сначала поставил перед моим сериализованным объектом уникальный тип идентификатора сообщения (чтобы другая сторона знала, что он получает), а затем отправил его.

Итак, в конце, учитывая две записи выше, и предполагая, что я префикс этого типа сериализованного объекта с 0x00 конечный поток будет выглядеть так:

0 | 2 | (536870912 | 0 | 10 | /abc/d/efg), (536870912 | 0 | 10 | /abc/d/efh)

0

Другие решения

Вы можете попробовать, работает ли использование QDataStream с классом модели.
Действительно хороший пример можно найти здесь:

YouTube: C ++ Qt 85 — Сериализация базовых объектов двоичного ввода-вывода

0

По вопросам рекламы [email protected]