Russian Qt Forum

Qt => Общие вопросы => Тема начата: Sega от Май 15, 2005, 22:18



Название: QFile и файлы больше 2GB под Windows
Отправлено: Sega от Май 15, 2005, 22:18
Как решить проблему при работе с большими файлами в QT 3.1.2 под Windows. В качестве указателя позиции файла используется тип int, что и является проблемой при работе с файлами больше 2GB.


Название: QFile и файлы больше 2GB под Windows
Отправлено: Keiko от Май 16, 2005, 00:23
странно, http://webcvs.kde.org/*checkout*/qt-copy/Attic/changes-3.1.0-beta1

Написано, что поддерживается.


Название: QFile и файлы больше 2GB под Windows
Отправлено: Sega от Май 16, 2005, 01:01
Да в Solaris поддерживается. Меня интерисует, как это сделать под Windows. Где почему-то в функции QFile::at(Offset pos) Offset на самом деле определен как int, хотя логично бы использовать __int64.


Название: QFile и файлы больше 2GB под Windows
Отправлено: Sergeich от Май 16, 2005, 14:51
У меня была такая же проблема: QT-шники советовали для поддержки больших файлов зафигачить configure с параметром -largefile (под линухом) или чем-то вроде того. Но проблемы это не решало, как я не изголялся sizeof( QIODevice::Offset ) все равно был равен 4. В итоге я плюнул на QFile и стал юзать низкоуровневый ввод/вывод. В итоге пришлось написать свою ф-цию сдвига
Код:

#include <sys/types.h>

#ifdef Q_WS_WIN
    #include <io.h>
#endif
#ifdef Q_WS_X11
    #include <unistd.h>
#endif

Q_LLONG seek64(int fd, Q_LLONG offset, int origin)
{
#ifdef Q_WS_WIN
return _lseeki64(fd, offset, origin);
#elif defined(Q_WS_X11)
return lseek(fd, offset, origin);
#endif
return -1;
}

плюс добавить в *.pro-файл строчки
Код:

DEFINES += _FILE_OFFSET_BITS=64
DEFINES += _LARGEFILE_SOURCE


Название: QFile и файлы больше 2GB под Windows
Отправлено: Sergeich от Май 16, 2005, 14:54
Да, кстати. Вроде бы в Qt4 все эти проблемы решены: там везде юзается int64


Название: QFile и файлы больше 2GB под Windows
Отправлено: Ruslan Popov от Май 16, 2005, 16:26
Есть подозрение, что дело в файловой системе.
Вы точно не используете FAT32?


Название: QFile и файлы больше 2GB под Windows
Отправлено: Sega от Май 16, 2005, 16:39
Я использую ntfs. Как временное решение использую низкоуровневый ввод вывод. Просто так теряется кроссплатформенность. Мне прогу на sun компилить тоже надо. Там с большими файлами все в порядке. Странно что с windows такая проблема.


Название: QFile и файлы больше 2GB под Windows
Отправлено: Admin от Май 16, 2005, 21:57
Цитата: "Ruslan Popov"
Есть подозрение, что дело в файловой системе.
Вы точно не используете FAT32?


это одна из причин

но они же сказали у них есть int который под windows равен long

в Delphi и Borland появились типы типа long long 8 байт

так же в gcc такой тип есть


Название: QFile и файлы больше 2GB под Windows
Отправлено: Sega от Май 16, 2005, 22:52
Файловая система тут не причем. Максимальный размер файла в FAT32 4 Тбайт. У меня вообще это вылезло на NTFS.
В микрософтовском компиляторе есть специальный тип __int64. Он и используется в _lseeki64. А тут Trolltech явно промахнулось. Вот в qt4 действительно уже все ок. Но посмотрев исходники понимаешь, что и в QT3 это как бы задумано, но к сожалению не работает.


Название: QFile и файлы больше 2GB под Windows
Отправлено: Sergeich от Май 17, 2005, 14:10
Цитата: "Sega"
Максимальный размер файла в FAT32 4 Тбайт.

Ну это ты загнул :D . Больше 2Гб туды не запихнешь :(


Название: QFile и файлы больше 2GB под Windows
Отправлено: Sega от Май 17, 2005, 18:58
Загнул точно. Максимальный размер файла для fat32 все же не 2, а 4GB.
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q314463&ID=kb;en-us;Q314463


Название: QFile и файлы больше 2GB под Windows
Отправлено: Sergeich от Май 18, 2005, 00:19
Это теория ( от Microsoft ). На практике при размере файла больше 2Гб начинаются глюки.