Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.28;
Скачать: CL | DM;

Вниз

Работа с каталогами   Найти похожие ветки 

 
unregister_256   (2005-07-03 13:19) [0]

Как узнать количество и буквы жестких дисков?
Как считать каталоги и файлы в директории?
спасибо :)


 
Просто Джо ©   (2005-07-03 13:28) [1]

1. GetLogicalDrives or GetLogicalDriveStrings & GetDriveType.
2. FindFirst,FindNext,FindClose.


 
unregister_256   (2005-07-03 13:30) [2]

thanks


 
unregister_256   (2005-07-03 13:40) [3]

покажите на примере... а то чтото не могу разобраться с ними


 
Просто Джо ©   (2005-07-03 13:41) [4]


>  [3] unregister_256   (03.07.05 13:40)

Сорри, нет времени на написание примера. По FindXXX есть рабочий пример в справке.


 
unregister_256   (2005-07-03 13:43) [5]

ок... посморю...
но все таки - у кого есть время напишите плиз а то заумные функции... да и первых трех в делфи 7 вообще нет :(


 
Просто Джо ©   (2005-07-03 14:03) [6]

Вот, накатал пример класса. Протестировать не успеваю, но вроде работает.


unit Unit2;

interface
uses Windows, Classes;

type

 TCharArray = array of Char;

 TLogicalDrive = record
   Name: string;
   Kind: Word;
 end;

 TLogicalDrives = class
 private
   FDrives: TStrings;
   procedure ParseDrives (Chars: TCharArray);
   procedure Populate;
   function GetCount: Integer;
   function GetDrives(Index: Integer): TLogicalDrive;
 public
   property Count: Integer read GetCount;
   property Drives[Index: Integer]: TLogicalDrive read GetDrives; default;
   constructor Create;
   destructor Destroy; override;
 end;

 function DriveKindToString (AKind: Word): string;

implementation

const
 DriveTypes: array [0..6] of string =
 (
   "UNKNOWN",
   "NO ROOT DIR",
   "REMOVABLE",
   "FIXED",
   "REMOTE",
   "CDROM",
   "RAMDISK"
 );

function DriveKindToString (AKind: Word): string;
begin
 Result := DriveTypes[AKind]
end;

{ TLogicalDrives }

constructor TLogicalDrives.Create;
begin
 inherited Create;
 FDrives := TStringList.Create;

 Populate;
end;

destructor TLogicalDrives.Destroy;
begin
 FDrives.Free;
 inherited;
end;

function TLogicalDrives.GetCount: Integer;
begin
 Result := FDrives.Count
end;

function TLogicalDrives.GetDrives(Index: Integer): TLogicalDrive;
begin
 Result.Name := FDrives[Index];
 Result.Kind := Integer(FDrives.Objects[Index])
end;

procedure TLogicalDrives.ParseDrives(Chars: TCharArray);
var
 I,DrvType: Integer;
 S: string;
begin
 FDrives.Clear;

 S := "";
 for I := 0 to High(Chars) do
 begin
   if Chars[I] <> Chr(0) then
     S := S + Chars[I]
   else
   begin
     if Length(S) <> 0 then
     begin
       DrvType := GetDriveType(PChar(S));
       FDrives.AddObject(S,TObject(DrvType));
       S := ""
     end;
   end;
 end;
end;

procedure TLogicalDrives.Populate;
var
 BuffLen: Integer;
 Buff: TCharArray;
begin
 BuffLen := GetLogicalDriveStrings(0,nil) + 1;
 SetLength (Buff,BuffLen);
 GetLogicalDriveStrings(BuffLen,@Buff[0]);

 ParseDrives(Buff);
end;

end.


Пример использования:

procedure TForm1.Button1Click(Sender: TObject);
var
 Drives: TLogicalDrives;
 I: Integer;
 S: string;
begin
 Memo1.Clear;

 Drives := TLogicalDrives.Create;
 try

   for I := 0 to Drives.Count-1 do
   begin
     S := Drives[I].Name + " - " +
          DriveKindToString(Drives[I].Kind);
     Memo1.Lines.Add (S);
   end;

 finally
   Drives.Free;
 end;
end;

Разбирайся. Ничего сложного.


 
unregister_256   (2005-07-04 07:51) [7]

огромное спасибо


 
unregister_256   (2005-07-05 10:31) [8]


{
type
 TfrmMain = class(TForm)
   trvFils: TTreeView;
   imglstFils: TImageList;
}
procedure ScanDir(path:string; ptr:TTreeNode);
var
 f : TSearchRec;

begin
 if FindFirst(path+"*.*", faAnyFile, f) = 0 then
   begin

     repeat
       if (f.Name<>".")and(f.Name<>"..") then
         if (f.Attr and faDirectory) = faDirectory then
         begin
           ptr:=frmMain.trvFils.Items.AddChildFirst(ptr,"["+f.Name+"]");

           ptr.ImageIndex:=1;
           ptr.SelectedIndex:=2;

           ScanDir(path+f.Name+"\",ptr);
         end
         else frmMain.trvFils.Items.AddChild(ptr,f.Name);
     until FindNext(f)<>0;
     FindClose(f);

   end;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
 ScanDir("C:\Test\",trvFils.Items.Item[0]);
end;


Почему то каряво работает... причем дело явно не в алгоритме...
сами попробуйте


 
Anatoly Podgoretsky ©   (2005-07-05 10:34) [9]

Чем "карявость" измеряешь?


 
unregister_256   (2005-07-05 10:42) [10]

посмотри внимательно на получившуюся структуру катологов в ТриВью... многие файлы и каталоги находятся не в своих директориях... а еще попробуй отладку... сам все поймешь


 
MTsv DN   (2005-07-05 12:28) [11]

Вот модуль:
http://www.uus4u.com/download/modules/treedir.zip

С уважением MTsv DN


 
unregister_256   (2005-07-05 12:31) [12]

мне не надо никакких модулей... надо было бы давно бы нашел...
мне нужно узнать в чем ошибка


 
NeoTall   (2005-07-05 13:01) [13]

> мне не надо никакких модулей... надо было бы давно бы нашел...
Мог бы найти (а еще лучше написал самому) - ДАВНО БЫ СДЕЛАЛ... А не выпендривался бы...

> мне нужно узнать в чем ошибка
В клавиатуре или, вероятнее, В РУКАХ :о)


 
unregister_256   (2005-07-05 13:09) [14]

Да ну?
ну так сделай лучше!!


 
unregister_256   (2005-07-05 13:10) [15]


> MTsv DN   (05.07.05 12:28) [11]
> Вот модуль:
> http://www.uus4u.com/download/modules/treedir.zip
>
> С уважением MTsv DN

фенс


 
MTsv DN   (2005-07-05 13:22) [16]

> фенс
Пожалуйста...

С уважением MTsv DN


 
Digitman ©   (2005-07-05 15:50) [17]


> причем дело явно не в алгоритме


именно в алгоритме и дело


> еще попробуй отладку... сам все поймешь


тут и отладка не нужна ... алгоритм даже на невооруженный взгляд "кривой"


 
Anatoly Podgoretsky ©   (2005-07-05 15:53) [18]

unregister_256   (03.07.05 13:19)  
Как узнать количество и буквы жестких дисков?

У жестких дисков букв нет.


 
Просто Джо ©   (2005-07-05 15:57) [19]


>  [18] Anatoly Podgoretsky ©   (05.07.05 15:53)
> У жестких дисков букв нет.

Есть. Сам видел - на корпусе нарисованы. И ешшо цыфры :)


 
Просто Джо ©   (2005-07-05 16:30) [20]


> [8] unregister_256   (05.07.05 10:31)

Туман у тебя в голове какой-то... Извини, суже по коду - похоже он написан "методом тыка" :(

Если я правильно понял что тебе нужно, то вот переделал твой образец в рабочий вариант:

procedure ScanDir(Path:string; ATreeView: TTreeView; AParentNode: TTreeNode);
var
SR : TSearchRec;
NewNode: TTreeNode;
begin
if FindFirst(path+"*.*", faAnyFile, SR) = 0 then
  begin
    repeat
      if (SR.Name<>".")and(SR.Name<>"..") then
        if (SR.Attr and faDirectory) = faDirectory then
        begin
          NewNode := ATreeView.Items.AddChild(AParentNode,SR.Name);
          ScanDir(Path+SR.Name+"\",ATreeView,NewNode);
        end
        else
        begin
          NewNode := ATreeView.Items.AddChild(AParentNode,SR.Name);
          NewNode.Text := SR.Name;
        end;
    until FindNext(SR)<>0;
    FindClose(SR);
  end;
end;

Пример использования (перед запуском в TreeView1 должен быть создан 1 верхний Item):

 ScanDir("e:\temp\d\",TreeView1,TreeView1.Items.Item[0]);


 
unregister_256   (2005-07-06 09:42) [21]


> Просто Джо

Благодарю :)



Страницы: 1 вся ветка

Текущий архив: 2005.08.28;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.045 c
4-1121180798
NeoMaster
2005-07-12 19:06
2005.08.28
ReadDirectoryChagesW в сервисе


1-1123585722
rolex
2005-08-09 15:08
2005.08.28
Компонент для ввода IP адреса.


3-1121412047
msguns
2005-07-15 11:20
2005.08.28
Запрос на объединение строк


3-1121836820
Ольга
2005-07-20 09:20
2005.08.28
Проектирование БД. Учет ретроспективы.


1-1123169990
MaxVal
2005-08-04 19:39
2005.08.28
Добавление AVI-файла в EXE-файл!