Текущий архив: 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