На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> Размер файла
    ЛЮди подскажите.
    Есть такая проблема: Нужно узнать размер файла.

    Использовал...
    ExpandedWrap disabled
      function GetFileSize(FileName: String): Integer;
      var
        FS: TFileStream;
      begin
        try
          FS := TFileStream.Create(Filename, fmOpenRead);
        except
          Result := -1;
        end;
        if Result <> -1 then Result := FS.Size;
        FS.Free;
      end;
       
      procedure TForm1.FormCreate(Sender: TObject);
      begin
        ShowMessage(IntToStr(GetFileSize('c:\prova.pdf')));
      end;

    Но этот код не работает, если файл используется другим приложением. Подскажите, как узнать размер, если файл используется в данный момент.
      ExpandedWrap disabled
        function GetFileSize(FileName: String): Integer;
        var
          FS: TFileStream;
        begin
          try
            FS := TFileStream.Create(Filename, fmOpenRead or fmShareDenyWrite);
          except
            Result := -1;
          end;
          if Result <> -1 then Result := FS.Size;
          FS.Free;
        end;
         
        procedure TForm1.FormCreate(Sender: TObject);
        begin
          ShowMessage(IntToStr(GetFileSize('c:\prova.pdf')));
        end;
      Сообщение отредактировано: Rrader -
        ExpandedWrap disabled
          function GetFSize(const fName: string): Integer;
          var
            w32fd: WIN32_FIND_DATA;
            find_h: DWORD;
           
          begin
            find_h:=FindFirstFile(PChar(fName), w32fd);
            if find_h<>INVALID_HANDLE_VALUE then
              Result:=w32fd.nFileSizeLow else
              Result:=-1;
            Windows.FindClose(find_h);
          end;


        Добавлено
        Rrader
        твой способ не будет работать с открытыми файлами.
          Цитата Ct757 @
          Rrader
          твой способ не будет работать с открытыми файлами.

          Более того. И у Rrader, и у GreySkil есть серьезная ошибка в коде. Если TFileStream.Create пройдет без ошибки, то на момент проверки if Result <> -1, значение Result не определено. И поведение программы будет вообще не предсказуемым.
          Кстати, об этом должен был предупредить компилятор. Или у вас отключены проедупреждения?
          Сообщение отредактировано: Петрович -
            ExpandedWrap disabled
              function FileSize(const FileName: String): Cardinal;
              var
                FileHandle: THandle;
              begin
                try
                  FileHandle :=  CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ,
                      nil, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0);
                  try
                    Result := GetFileSize(FileHandle, nil);
                  finally
                    CloseHandle(FileHandle);
                  end;
                except
                  raise Exception.Create('Oops! Can''t get file size :(');
                end;
              end;
            Сообщение отредактировано: Domino -
              to Domino твой код даст ошибку если файл открыт другой программой.
              Правильный способ, лишенный этого недостатка, уже приведен Ct757'ом.
              Правда он возвращает 32-х битную величину. Т.е. применима только к файлам, размер которых не превышает 4Гб. Современные файловые системы (NTFS) допускаю размеры файлов более 4 Гб (64 бита). Вот вариант который позволяет работать с такими файлами:
              ExpandedWrap disabled
                function FileSize (FileName :String) :Int64;
                var
                  Handle: tHandle;
                  FindData: tWin32FindData;
                begin
                  Handle := FindFirstFile(PChar(FileName), FindData);
                  if Handle = INVALID_HANDLE_VALUE then
                    SysUtils.RaiseLastOSError;
                 
                  Windows.FindClose(Handle);
                  if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0 then
                    Result := 0  // Размер каталога всегда считаем равным 0
                  else begin
                    SysUtils.Int64Rec(Result).Hi := FindData.nFileSizeHigh;
                    SysUtils.Int64Rec(Result).Lo := FindData.nFileSizeLow;
                  end;
                end;
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0260 ]   [ 15 queries used ]   [ Generated: 17.05.24, 06:18 GMT ]