2014-01-03 1 views
2

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

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

+0

No. Придумайте собственную реализацию или использовать какой-либо существующий подход к сетевой файловой системе (например, SFTP или NFS). –

+0

Одним из способов было бы использовать QtNetwork в приложении dektop для отправки данных, а затем вы используете эти методы gui для отображения на клиентской стороне. – lpapp

ответ

0

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

Например, вы можете сериализовать этот путь:

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

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

Например, я хочу различать файлы/каталоги, установив бит 0 в поле flags: 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) 

бы сказать мне, что у меня есть два путь к файлу записи и размер 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 - Binary IO basic object serialization

+0

благодарю вас за ответ ... Мне удалось сохранить QFileSystemModel в файл (на стороне сервера), отправить его через tcp-сокет, но когда я пытаюсь загрузить объект из файла (на стороне клиента) в QFileSystemModel, он сработает ... Я думаю, что QT не перегрузил оператор «>>» для QFileSystemModel .... –

+0

Должен быть интерфейс, определяющий, является ли он сериализуемым или нет - проверьте, реализуют ли классы модели те или реализуют его самостоятельно, когда подклассы QFileSystemModel.Я не вижу причин, почему он не должен работать так, как его просто куча байтов и код загрузчика/хранителя. – user1610743

Смежные вопросы