Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2008, 12:14   #1
Jupiter
Пользователь Подтвердите свой е-майл
 
Регистрация: 26.03.2008
Сообщений: 42
По умолчанию Помогите разобраться с TSearchRec

Помогите пожалуйста разобраться.

Написал программу которая должна выводить инфо о файлах.
Поиск в каталоге производится функциями FindFirst и FindNext.
Кстати, есть ли альтернативные методы поиска файлов?

Когда файл размером до 2ГБ, или около того, всё нормально, но
попался файл с размером 3*896*010*831 байт, и т.к
TSearchRec = record
Size : Integer;

то значение Size было отрицательным числом.
Я обратил внимание на
TSearchRec = record
FindData: TWin32FindData

оказалось что значение TSearchRec.Size берётся из
TSearchRec.FindData.NFileSizeLow : DWORD;

Тогда в своей программе я просто начал писать не
FileSize := TSearchRec.Size;
а
FileSize := TSearchRec.FindData.NFileSizeLow;

теперь значение 3896010831 отображается правильно.

Далее попался "*.MDF" Архив (Образ диска).
Его размер- 4*655*677*440 байт, это значение выходит за диапазон
допустимых значений LongWord, и в переменной TSearchRec.FindData.NFileSizeLow
теперь тоже неправильное значение.
Вместо 4 655 677 440 байт там 360 710 144 байт.

Можно ли как то получить правильный размер файла из TSearchRec, не обращаясь
к другим функциям?

Кстати TSearchRec.FindData.NFileSizeHigh при малых размерах файла = 0.
А в случае с 4*655*677*440 байт = 1.
Может здесь нужно учитывать и это значение?.
И если нужно, то каким образом?

Заранее спасибо.
Jupiter вне форума Ответить с цитированием
Старый 01.04.2008, 12:25   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Попробуйте GetFileSizeEx
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 01.04.2008, 12:29   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитирую http://api.farmanager.com/ru/winapi/...find_data.html

Цитата:
nFileSizeHigh
Старшее двойное слово 64-х разрядного размера файла в байтах. Размер файла равен (nFileSizeHigh * (1+MAXDWORD)) + nFileSizeLow.
nFileSizeLow
Младшее двойное слово размера файла в байтах.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.04.2008, 12:38   #4
Jupiter
Пользователь Подтвердите свой е-майл
 
Регистрация: 26.03.2008
Сообщений: 42
По умолчанию

Спасибо. Попробую.

А где лучше держать результат? В Int64?
Jupiter вне форума Ответить с цитированием
Старый 01.04.2008, 13:03   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну если там держать получится, держи там...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.04.2008, 13:33   #6
Jupiter
Пользователь Подтвердите свой е-майл
 
Регистрация: 26.03.2008
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Когда я так написал- компилятор не захотел компилировать.
выдал: "Overflow in conversion or arithmetic operation"

похоже что ошибка здесь (1+MAXDWORD).
так и должно быть?
Может у меня что- то неправильно настроено?

Немного по экспериментировав, написал два рабочих способа.

Function oooooo : Int64;
Var
SR : TSearchRec;

begin

{ Код........}

// 1- й вариант
Result :=
MAXDWORD;
Result :=
SR.FindData.nFileSizeHigh *
(Result + 1) +
SR.FindData.nFileSizeLow;

// 2- й вариант
Result :=
SR.FindData.nFileSizeHigh;
Result :=
(Result shl 32) xor
SR.FindData.nFileSizeLow;

Какой из этих вариантов лучше использовать?
Jupiter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите разобраться Tanuska___:) БД в Delphi 1 04.09.2008 14:56
Помогите разобраться с С++ igroman Общие вопросы C/C++ 1 03.08.2008 23:15
Помогите разобраться! SerSasha Помощь студентам 4 09.06.2008 10:00
Помогите разобраться! Кот Microsoft Office Excel 3 14.08.2007 19:48