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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2019, 08:40   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию неправильно определяется размер больших файлов

необходимо по таймеру узнавать размер файла, в который пишет другая программа.
Это можно сделать вот так:
Код:
function GetFileSize(const FileName: string) : UInt64;
var
  FileHandle : THandle;
begin
  if FileExists(FileName) then
  begin
    FileHandle := Winapi.Windows.CreateFile(PChar(FileName), GENERIC_READ,
                                    FILE_SHARE_READ, nil, OPEN_EXISTING,
                                    FILE_ATTRIBUTE_NORMAL, 0);
    if (FileHandle <> 0) and (FileHandle <> INVALID_HANDLE_VALUE) then
    begin
      Result := Winapi.Windows.GetFileSize(FileHandle,nil);
      CloseHandle(FileHandle);
    end else
    Result := 0;
  end else
  Result := 0;
end;
Логично предположить, что в 32-битном проекте не будет определяться размер файлов, которые больше 4ГБ. По-этому, в настройках проекта я поставил билд под Win64.
Однако, даже так, даже если запрашиваемый файл не используется никакими другими программами, его размер, если он больше 4ГБ, возвращается неправильный.
Почему? Проект же 64-битный.

Последний раз редактировалось BLACK_RAIN; 17.04.2019 в 08:42.
BLACK_RAIN вне форума Ответить с цитированием
Старый 17.04.2019, 09:28   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

На работе негде посмотреть. Дам подсказку корректный размер возвращается при использовании функций с суффиксом
Winapi.Windows.CreateFileEx
Winapi.Windows.GetFileSizeEx

Create тоже надо с EX.

Лично я использовал TFileStream для работы с файлом 8 Гб. Delphi XE10, и вроде даже в 32-х битном окружении.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 17.04.2019, 09:28   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

FindFirst и FindData.nFileSizeHigh, FindData.nFileSizeLow
или GetFileSizeEx
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.04.2019, 10:49   #4
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

извиняюсь, поторопился. Надо было так:
Код:
      dwLow := Winapi.Windows.GetFileSize(FileHandle, @dwHigh);
      Result := dwLow or Int64(dwHigh) shl 32;
Цитата:
Сообщение от Аватар Посмотреть сообщение
FindFirst и FindData.nFileSizeHigh, FindData.nFileSizeLow
Это не работает, если файл в данный момент используется для записи.
BLACK_RAIN вне форума Ответить с цитированием
Старый 17.04.2019, 10:55   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А смысл узнавания размера файла открытого для записи? После закрытия он другой может быть
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.04.2019, 11:31   #6
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
После закрытия он другой может быть
А это и не важно. Главное - перехватить момент, когда размер файла перестал увеличиваться.
BLACK_RAIN вне форума Ответить с цитированием
Старый 17.04.2019, 11:49   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А если занят монопольно для записи? CreateFile не поможет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.04.2019, 12:13   #8
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А если занят монопольно для записи? CreateFile не поможет
В моём случае помогает и ладно. Программа оооооооочень узконаправленная.
BLACK_RAIN вне форума Ответить с цитированием
Старый 17.04.2019, 12:19   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Ладно, допустим для чтения доступно. Что-то в него пишет, но на накопитель еще не выгружено, в буфере сидит. А размер не меняется
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.04.2019, 13:10   #10
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Ладно, допустим для чтения доступно. Что-то в него пишет, но на накопитель еще не выгружено, в буфере сидит. А размер не меняется
В таком случае, всё плохо. Выполнится ненужное действие. Иногда это критично, а иногда нет. Но другого способа нет. Лучше так, чем вообще никак. Но, как показали тесты, такая ситуация случается крайне редко. А если будет случаться чаще, можно пожертвовать частотой проверки и увеличить интервал таймера. Думаю, что пишушая в файл программа (учитывая ее назначение) дольше 10 секунд держать информацию в буфере не будет.
Теперь можете кидаться какашками.
BLACK_RAIN вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать массив кругов, размер которого определяется пользователем? lichking Общие вопросы Delphi 5 20.11.2016 00:34
Неправильно определяется ширина окна браузера AlexKain JavaScript, Ajax 8 11.06.2016 17:13
Неправильно определяется заголовок графического файла (Delphi) KBO Помощь студентам 30 05.08.2015 18:04
Неправильно определяется отступ слева justfor JavaScript, Ajax 2 25.02.2015 10:37
Сортировка больших файлов. stpdqstns Общие вопросы C/C++ 6 05.03.2013 22:52