Russian Qt Forum
Апрель 29, 2024, 12:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QFile и файлы больше 2GB под Windows  (Прочитано 13169 раз)
Sega
Гость
« : Май 15, 2005, 22:18 »

Как решить проблему при работе с большими файлами в QT 3.1.2 под Windows. В качестве указателя позиции файла используется тип int, что и является проблемой при работе с файлами больше 2GB.
Записан
Keiko
Гость
« Ответ #1 : Май 16, 2005, 00:23 »

странно, http://webcvs.kde.org/*checkout*/qt-copy/Attic/changes-3.1.0-beta1

Написано, что поддерживается.
Записан
Sega
Гость
« Ответ #2 : Май 16, 2005, 01:01 »

Да в Solaris поддерживается. Меня интерисует, как это сделать под Windows. Где почему-то в функции QFile::at(Offset pos) Offset на самом деле определен как int, хотя логично бы использовать __int64.
Записан
Sergeich
Гость
« Ответ #3 : Май 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
Записан
Sergeich
Гость
« Ответ #4 : Май 16, 2005, 14:54 »

Да, кстати. Вроде бы в Qt4 все эти проблемы решены: там везде юзается int64
Записан
Ruslan Popov
Гость
« Ответ #5 : Май 16, 2005, 16:26 »

Есть подозрение, что дело в файловой системе.
Вы точно не используете FAT32?
Записан
Sega
Гость
« Ответ #6 : Май 16, 2005, 16:39 »

Я использую ntfs. Как временное решение использую низкоуровневый ввод вывод. Просто так теряется кроссплатформенность. Мне прогу на sun компилить тоже надо. Там с большими файлами все в порядке. Странно что с windows такая проблема.
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #7 : Май 16, 2005, 21:57 »

Цитата: "Ruslan Popov"
Есть подозрение, что дело в файловой системе.
Вы точно не используете FAT32?


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

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

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

так же в gcc такой тип есть
Записан
Sega
Гость
« Ответ #8 : Май 16, 2005, 22:52 »

Файловая система тут не причем. Максимальный размер файла в FAT32 4 Тбайт. У меня вообще это вылезло на NTFS.
В микрософтовском компиляторе есть специальный тип __int64. Он и используется в _lseeki64. А тут Trolltech явно промахнулось. Вот в qt4 действительно уже все ок. Но посмотрев исходники понимаешь, что и в QT3 это как бы задумано, но к сожалению не работает.
Записан
Sergeich
Гость
« Ответ #9 : Май 17, 2005, 14:10 »

Цитата: "Sega"
Максимальный размер файла в FAT32 4 Тбайт.

Ну это ты загнул Веселый . Больше 2Гб туды не запихнешь Грустный
Записан
Sega
Гость
« Ответ #10 : Май 17, 2005, 18:58 »

Загнул точно. Максимальный размер файла для fat32 все же не 2, а 4GB.
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q314463&ID=kb;en-us;Q314463
Записан
Sergeich
Гость
« Ответ #11 : Май 18, 2005, 00:19 »

Это теория ( от Microsoft ). На практике при размере файла больше 2Гб начинаются глюки.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 22.