Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Параметры логических дисков 
:(
    Опции темы
Гость_Peter
Дата 18.12.2005, 19:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Как узнать количество свободного места на HDD? Функция GetDiskFreeSpace - врет. А в GetDiskFreeSpaceEX результат в PLargeInteger.Что это такое и как его например вывести в edit. Или есть чего попроще.
  Вверх
Snowy
Дата 18.12.2005, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Код

var
  pli: PLargeInteger;
begin
  ......
  Edit1.Text:=IntToStr(pli^);

PM MAIL   Вверх
MIX55
Дата 18.12.2005, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


много работы
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 208
Регистрация: 23.10.2005
Где: Здесь

Репутация: нет
Всего: 4



держи раз:http://www.torry.ru/vcl/filedrv/driveinformation/CDiskInfo.zip
держи два:http://www.carbonsoft.com/download/cxdrive1_r1005.zip
два компонента внутри примеры разобраться пара пустяков
--------------------
Hарод, а как в дельфи писать паскалевские проги....?*********************************************Жизнь слишком коротка, чтобы писать на Assembler'e
PM MAIL ICQ   Вверх
Guest
Дата 18.12.2005, 21:08 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Snowy @ 18.12.2005, 20:18)
Код

var
  pli: PLargeInteger;
begin
  ......
  Edit1.Text:=IntToStr(pli^);

Спасибо за ответы! Но вот это работает, если размер диска гдето
2 ГБайта ,если больше на операции вывода возникает ошибка.
  Вверх
Snowy
Дата 18.12.2005, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Цитата(Guest @ 18.12.2005, 21:08)
Но вот это работает, если размер диска гдето
2 ГБайта ,если больше на операции вывода возникает ошибка.

Под Win95. Под NT - 4Gb smile

Вот. Набросал на скорую руку.
Код

function GetTotalSize(disk: char): Int64;
var
  fs, ts: Int64;
  tf: PLargeInteger;
begin
  GetMem(tf, 8);
  GetDiskFreeSpaceEx(PChar(disk+':\'), fs, ts, tf);
  FreeMem(tf);
  result:=ts;
end;

function GetFreeSize(disk: char): Int64;
var
  fs, ts: Int64;
  tf: PLargeInteger;
begin
  GetMem(tf, 8);
  GetDiskFreeSpaceEx(PChar(disk+':\'), fs, ts, tf);
  FreeMem(tf);
  result:=fs;
end;

Добавлено @ 22:41
P.S. под Win95 все равно возвращать будет только до 2Гб.
(хотя, win95 вроде больше и не держит)
Delphi сама определит, под какой системой программа запущена.
PM MAIL   Вверх
Guest
Дата 18.12.2005, 23:12 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо , сейчас попробую. Но оказывается есть совсем простое решение (откопал в компонентах по выше приведенным ссылкам) - две функции из модуля SysUtils:

function DiskSize(Drive: Byte): Int64; - размер всего диска.
function DiskFree(Drive: Byte): Int64; - размер свободного места на диске.

где Drive номер диска: A=1,B=2,C=3,...
Функции возвращают -1 если диска не существует.
И результат вывести без проблем - Edit1.text:=inttostr(DiskSize(3));
  Вверх
Guest
Дата 19.12.2005, 00:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Попробовал. Параметры диска 15 ГБайт определяет корректно.
  Вверх
Snowy
Дата 19.12.2005, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Цитата(Guest @ 18.12.2005, 23:12)
function DiskSize(Drive: Byte): Int64; - размер всего диска.
function DiskFree(Drive: Byte): Int64; - размер свободного места на диске.

Ну вообще логично. То же самое, только своего писать не нужно.
Вот код этих функций:
Код

function InternalGetDiskSpace(Drive: Byte;
  var TotalSpace, FreeSpaceAvailable: Int64): Bool;
var
  RootPath: array[0..4] of Char;
  RootPtr: PChar;
begin
  RootPtr := nil;
  if Drive > 0 then
  begin
    RootPath[0] := Char(Drive + $40);
    RootPath[1] := ':';
    RootPath[2] := '\';
    RootPath[3] := #0;
    RootPtr := RootPath;
  end;
  Result := GetDiskFreeSpaceEx(RootPtr, FreeSpaceAvailable, TotalSpace, nil);
end;

function DiskFree(Drive: Byte): Int64;
var
  TotalSpace: Int64;
begin
  if not InternalGetDiskSpace(Drive, TotalSpace, Result) then
    Result := -1;
end;

function DiskSize(Drive: Byte): Int64;
var
  FreeSpace: Int64;
begin
  if not InternalGetDiskSpace(Drive, Result, FreeSpace) then
    Result := -1;
end;

По сути то же самое, только не с выделением памяти, а с массивом.
PM MAIL   Вверх
Guest
Дата 20.12.2005, 22:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











И надо учесть что все так легко получилось поскольку использовалась не API ф-цыя GetDiskFreeSpaceEx где все параметры PLargeInteger, а ее аналог из модуля SysUtils где два параметра int64.
  Вверх
Snowy
Дата 21.12.2005, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Цитата(Guest @ 20.12.2005, 22:55)
не API ф-цыя GetDiskFreeSpaceEx где все параметры PLargeInteger, а ее аналог из модуля SysUtils где два параметра int64.

LargeInteger - это только для 9x систем. В NT возвращает именно то, что нужно.
И используется не ее аналог, а указатель на данную функцию.
Просто дельфи подменяет этот указатель,в зависимости от того, под какой операционкой работает программа.
Это справедливо и для варианта, который я предложил, т.к. в нем используется все та же функция с подменой, а не прямое обращение к WinAPI.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0873 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.