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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2012, 18:02   #1
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию Папки и файлы в директории

Привет. Хотел бы любезно узнать такое:
Есть полный путь к папке(он записан в переменую). Эта папка содержит файлы и другие папки. Мне нужно узнать сколько сначало папок в деректории, следом сколько ВСЕГО(!) файлов во всей деректории. И из каждого файла извлечь файловый путь. ShellAPI подключен. В книге про делпфи(библия делпфи) есть что-то похожее, но я нечего в ней не пойму.
Как сделать всё выше написаное(до таких слов: "ShellAPI подключен")?
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 20.11.2012, 18:05   #2
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,759
По умолчанию

Поиск файлов и папок осуществляется через FindFirst, FindNext, FindClose
FaTaL вне форума Ответить с цитированием
Старый 20.11.2012, 18:07   #3
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Поиск файлов и папок осуществляется через FindFirst, FindNext, FindClose
я тоже знаю, но как прописать чтобы можно было узнать сколько папок?
А ваще что-то похожее было в книге.

Вот получил количество файлов во всей деректории:
Код:
Tin:=FindFirst(gPath + '/*.*/', faAnyFile,SR); //получаем количество файлов
В общем пока так:
Код:
var
SR:TSearchRec;
Tin: integer;
s: boolean;
FileNam: array [1..MAX_PATCH] of String;
i: integer;
begin
s:=false;
//начало диалога
gPath:='';
if SelectDirectory('Выбирите папку', '', gPath) then
s:true //для вида
else
exit;
if gPath<>'' then //проверяемся
begin
Tin:=FindFirst(gPath + '/*.*/', faAnyFile,SR); //получаем количество файлов
For i:=1 To Tin Do
begin
if (SR.Name='.') or (SR.Name='..') or (SR.Name='') then continue; //продолжаем цыкл
FileNam[i]:=SR.Name; //Получаем имя
end;
FindClose(SearchRec); //закрываем поиск
end;
end;
Что дальше ума не прилажу?

Вот получил, но нечего не происходит в итоге, помогите исправить:
Код:
var
SR: TSearchRec;
Tin: integer;
s: boolean;
FileNam: String;
i: integer;
function SlashSep(Path, FName: String): string;
begin
if Path[Length(Path)] <> '\' then
Result:=Path + '\' + FName
else
Result:=Path + FName;
end;
begin
s:=false;
//начало диалога
gPath:='';
if SelectDirectory('Выбирите папку', '', gPath) then
s:=true //для вида
else
exit;
if gPath<>'' then //проверяемся
begin
Tin:=FindFirst(gPath + '/*.*/', faAnyFile,SR); //получаем количество файлов
For i:=1 To Tin Do
begin
if (SR.Name='.') or (SR.Name='..') or (SR.Name='') then continue; //продолжаем цыкл
FileNam:=SlashSep(gPath, SR.Name); //получаем имя
//добавляем
ListBox2.Items.Add(FileNam);
ListBox1.Items.Add(ExtractFileName(FileNam));
end;
FindClose(SR); //закрываем поиск
end;
end;
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.

Последний раз редактировалось Stilet; 20.11.2012 в 19:04.
саша40 вне форума Ответить с цитированием
Старый 20.11.2012, 18:46   #4
Plastik
Новичок
Джуниор
 
Аватар для Plastik
 
Регистрация: 26.03.2007
Сообщений: 2
По умолчанию

Цитата:
procedure ScanDirFilesW(StartPath : pWideChar;out Dirs,Files : dword);
var xDird,xFiles : dword;
procedure FirstDir1(NextPath : pWideChar);
var xPath : packed array[0..2047]of WideChar;
xData : WIN32_FIND_DATAW;xHandle : tHandle;
begin
lstrCpyW(xPath,NextPath);
if xPath[lstrLenW(xPath)-1]<>'\'then lstrCatW(xPath,'\');
lstrCatW(xPath,'*.*');
xHandle:=FindFirstFile(xPath,xData) ;
if xHandle<>INVALID_HANDLE_VALUE then begin
repeat
if(lstrCmp('.',xData.cFileName)<>0) and(lstrCmp('..',xData.cFileName)<> 0)then begin
if(xData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY>0)then begin
inc(xDird);
lstrCpyW(xPath,NextPath);lstrCatW(x Path,'\');lstrCatW(xPath,xData.cFil eName);
FirstDir1(xPath);
end else inc(xFiles);
lstrCpyW(xPath,NextPath);lstrCatW(x Path,'\');lstrCatW(xPath,xData.cFil eName);writeln(xPath);
{Это для того, чтобы видеть найденные объекты в консольном окне}
end;
until not FindNextFile(xHandle,xData);
FindClose(xHandle);
end;
end;
begin
xDird:=0;xFiles:=0;
FirstDir1(StartPath);
Dirs:=xDird;Files:=xFiles;
end;
uses Windows; не забываем
Вызываем процедуру из основной программы:
ScanDirFilesW('c:\NVIDIA',x1,x2);
x1 - количество папок.
x2 - количество файлов.
Процедура сканирует все вложенные папки тоже.
Игнорирует "." и "..".
Любитель целебного (40%) напитка...

Последний раз редактировалось Plastik; 20.11.2012 в 18:48.
Plastik вне форума Ответить с цитированием
Старый 20.11.2012, 18:51   #5
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

ну мне нужно просто это:
-Кол-во папок.
-Имена папок(желательно).
-Полный файловый путь к файлам в папках.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 20.11.2012, 18:53   #6
Plastik
Новичок
Джуниор
 
Аватар для Plastik
 
Регистрация: 26.03.2007
Сообщений: 2
По умолчанию

writeln(xPath);
В Этой переменной xPath полный путь и хранится.
Если не нужно сканирование дерева, убери рекурсию "вызов FirstDir1(xPath);".
Просто имена хранятся в переменной xData.cFileName.
Разумеется всё это работает только внутри цикла repeat-until.
Любитель целебного (40%) напитка...

Последний раз редактировалось Plastik; 20.11.2012 в 18:57.
Plastik вне форума Ответить с цитированием
Старый 20.11.2012, 18:56   #7
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от Plastik Посмотреть сообщение
writeln(xPath);
В Этой переменной "xPath" полный путь и хранится.
Если не нужно сканирование дерева, убери рекурсию "вызов FirstDir1(xPath);".
Просто имена хранятся в переменной xData.cFileName
Разумеется всё это только внутри цикла repeat-until.
это кому говоришь?
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 20.11.2012, 19:09   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
это кому говоришь?
Тебе конечно. Ты же тему поднял?
Это пояснения как поправить под твою задачу.
То что ты привел - функция. Ее нужно вызывать где-то. К примеру по клику кнопки.
Только она какая-то замученная... Я бы по другому делал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.11.2012, 21:13   #9
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,759
По умолчанию

Самому сейчас не охото под вас подстраивать, спать пора. Вот нашёл в одном из своих проектов копирование папки с подпапками и всеми файлами, переделайте просто под себя
Код:
procedure CopyDir(ist, nazn: String);
var sr:TSearchRec;
      ScanDir, KonDir: String;
      ISearch:Integer;
begin
   ScanDir:=ist; 
   KonDir:=nazn;
   ISearch:=FindFirst(ScanDir+'\*.*', faAnyfile, sr);
   while ISearch=0 do begin
         if ((sr.Attr and FaDirectory)=Fadirectory) and 
         (sr.Name[1]<>'.') then begin
               if not  DirectoryExist(KonDir+'\'+sr.Name) then
                    mkDir(PChar(KonDir+'\'+sr.Name));
               CopyDir(ScanDir+'\'+sr.Name+'', KonDir+'\'+sr.Name);
         end else
      CopyFile(Pchar(scandir+'\'+sr.Name),pchar(nazn+'\'+sr.Name),false);
        ISearch:=FindNext(sr);
   end;
   FindClose(sr);
end;
Если так и не получится, завтра с утра помогу.
FaTaL вне форума Ответить с цитированием
Старый 20.11.2012, 21:47   #10
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Самому сейчас не охото под вас подстраивать, спать пора. Вот нашёл в одном из своих проектов копирование папки с подпапками и всеми файлами, переделайте просто под себя
Код:
procedure CopyDir(ist, nazn: String);
var sr:TSearchRec;
      ScanDir, KonDir: String;
      ISearch:Integer;
begin
   ScanDir:=ist; 
   KonDir:=nazn;
   ISearch:=FindFirst(ScanDir+'\*.*', faAnyfile, sr);
   while ISearch=0 do begin
         if ((sr.Attr and FaDirectory)=Fadirectory) and 
         (sr.Name[1]<>'.') then begin
               if not  DirectoryExist(KonDir+'\'+sr.Name) then
                    mkDir(PChar(KonDir+'\'+sr.Name));
               CopyDir(ScanDir+'\'+sr.Name+'', KonDir+'\'+sr.Name);
         end else
      CopyFile(Pchar(scandir+'\'+sr.Name),pchar(nazn+'\'+sr.Name),false);
        ISearch:=FindNext(sr);
   end;
   FindClose(sr);
end;
Если так и не получится, завтра с утра помогу.
scandir + '\' + sr.Name- это и есть путь к файлу из деректории?
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Файлы и папки X@OC Общие вопросы Delphi 2 13.09.2011 21:18
Поиск папки по имени в директории artemavd Общие вопросы Delphi 4 06.08.2010 08:18
Прога не очет искать директории. А вот файлы нрмально ищет. TwiX Общие вопросы C/C++ 3 18.03.2010 04:17
Как узнать все папки в указаной директории? blackstersl Общие вопросы Delphi 4 17.06.2009 13:23
Выбрать имя папки из директории Македонский Общие вопросы Delphi 15 29.08.2007 10:48