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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2017, 23:04   #1
ilya4743
 
Регистрация: 30.12.2016
Сообщений: 8
По умолчанию Поиск файла или папки

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

Задача состоит в том, что у меня есть приблизительный адрес того или иного файла(папки) и мне нужно получить полный адрес этого элемента, чтобы в последствии использовать его в проекте.
Допустим вот приблизительный адрес 'Archiv\V1\val.exe' и мне нужно получить его полный путь(val.exe), длина которого мне неизвестна.

Я пытался решить данную проблему при помощи FileSearch, но результат не дал ожидаемых результатов или я что-то не так делаю.

FileSearch('val.exe', '*:\Archiv\V1\);

Просто у меня даже с масками файлов ничего не получается, ведь бог его знает сколько директорий до этого приблизительного адреса и на каком диске все будет.

Подскажите пожалуйста как решить эту проблему. Заранее спасибо.

Последний раз редактировалось Alex11223; 14.03.2017 в 09:57.
ilya4743 вне форума Ответить с цитированием
Старый 14.03.2017, 04:41   #2
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Код:
procedure FileSystem(papka, fajl: string);
 const FileAttr: array[0..37] of integer = (1, 2, 3, 4, 5, 6, 7, 32, 33, 34, 35,
          36, 37, 38, 39, 128, 288, 289, 290, 2048, 2080, 2081, 2082, 2083, 2084,
          2085, 2086, 8198, 8224, 8225, 8226, 8227, 8228, 8229, 8230, 10272,
          10273, 10274); // всевозможные атрибуты файлов
          { faReadOnly = $00000001 (1) }
          { faHidden = $00000002 (2) }
          { faSysFile = $00000004 (4) }
          { faVolumeID = $00000008 (8) }
          { faArchive = $00000020 (32) }
          { faAnyFile = $0000003F (63) }
       PapkaAttr: array[0..25] of integer = (16, 17, 18, 19, 20, 21, 22, 48, 49,
          50, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 8208, 8209, 8210,
          8211, 8212, 8213, 8214, 10256); // всевозможные атрибуты папок
          { faDirectory = $00000010 (16) }
 var poisk: TSearchRec;
     ds: string;

   function PrinadlezhitI(n: integer; p: array of integer): boolean;
    var i: integer;
    begin
       Result:=false;
       For i:=Low(p) to High(p) do
          If n=p[i] then
             Result:=true;
    end;

 begin
    ChDir(papka);
    If IOResult<>0 then
       Exit;
    If papka[Length(papka)]<>'\' then
       papka:=papka+'\';
    If FindFirst(fajl, faAnyFile, poisk)=0 then
    Repeat
       If PrinadlezhitI(poisk.Attr, FileAttr) then
       begin
          ds:=FormatDateTime('dd.mm.yyyy hh:nn:ss', FileDateToDateTime(poisk.Time));
          Form1.Memo1.Lines.Add(Format('%s%s: размер - %d, дата изменения - %s',
             [papka, poisk.Name, poisk.Size, ds]));
       end;
    Until FindNext(poisk)<>0;
    ChDir(papka);
    If FindFirst('*', faAnyFile, poisk)=0 then
    Repeat
       If PrinadlezhitI(poisk.Attr, PapkaAttr) then
          If not (poisk.Name='.') and not (poisk.Name='..') then
          begin
             FileSystem(papka+poisk.Name, fajl);
             ChDir(papka);
          end;
    Until FindNext(poisk)<>0;
    FindClose(poisk);
 end;

http://newerow1989.narod.ru/publ/poisk_fajlov/3-1-0-49
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 14.03.2017, 05:39   #3
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 272
По умолчанию

Цитата:
Сообщение от ilya4743 Посмотреть сообщение
ведь бог его знает сколько директорий до этого приблизительного адреса и на каком диске все будет
Типа такого?
С:\Archiv\V1\val.exe
С:\BlaBla\BlaBla\Archiv\V1\val.exe
D:\Archiv\Archiv\V1\val.exe
D:\BlaBla\Archiv\Archiv\Archiv\V1\v al.exe
Filka вне форума Ответить с цитированием
Старый 14.03.2017, 09:37   #4
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,792
По умолчанию

для начала найди все папки на компе, а потом уж по маскам ищи в каждой или по части имён.
во вложении программа, которая ищет все папки на компьютере. подожди немного и увидишь все свои папки.
код позже могу скинуть.
результат будет таким: номер - размер файлов в папке - имя папки
Код:
1	1992634841	C:\
2	0	C:\$Recycle.Bin\
3	0	C:\Documents and Settings\
4	174	C:\Program Files\
5	0	C:\ProgramData\
6	0	C:\System Volume Information\
7	174	C:\Users\
8	7707189	C:\Windows\
9	129	C:\$Recycle.Bin\S-1-5-18\
10	129	C:\$Recycle.Bin\S-1-5-21-2685404960-2732411423-3120739767-1000\
11	7990	C:\Program Files\ACD Systems\
12	0	C:\Program Files\Adobe\
13	0	C:\Program Files\AMD\
14	0	C:\Program Files\AMD AVT\
15	3306137	C:\Program Files\Anketa9\
16	0	C:\Program Files\ATI\
17	28	C:\Program Files\ATI Technologies\
18	14851985	C:\Program Files\BASIC256\
19	0	C:\Program Files\Brother\
20	1585296	C:\Program Files\BSplayerPro\
21	0	C:\Program Files\Common Files\
22	0	C:\Program Files\CyberLink\
23	3035992	C:\Program Files\Defraggler\
24	19329020	C:\Program Files\DVD Maker\
25	6940781	C:\Program Files\FlashGet\
26	0	C:\Program Files\GIMP 2\
27	0	C:\Program Files\Hewlett-Packard\
28	0	C:\Program Files\InstallShield Installation Information\
29	4418789	C:\Program Files\Internet Explorer\
30	2665398	C:\Program Files\K-Lite Codec Pack\
31	0	C:\Program Files\Microsoft Office\
32	0	C:\Program Files\Microsoft Visual Studio\
33	0	C:\Program Files\Microsoft Visual Studio 8\
...итд...
Вложения
Тип файла: rar SizeFolder.rar (165.8 Кб, 25 просмотров)
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 14.03.2017 в 09:44.
NetSpace вне форума Ответить с цитированием
Старый 14.03.2017, 16:52   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Какой-то оригинальный способ проверки атрибутов
Вместо
Код:
If PrinadlezhitI(poisk.Attr, FileAttr)
для фильтрации каталогов лучше
Код:
if (poisk.Attr and faDirectory) = faDirectory
, а для не каталогов <> faDirectory
Соответственно все определённые константы с перебором комбинаций атрибутов и функция PrinadlezhitI не нужны
eoln вне форума Ответить с цитированием
Старый 14.03.2017, 18:18   #6
ilya4743
 
Регистрация: 30.12.2016
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Filka Посмотреть сообщение
Типа такого?
С:\Archiv\V1\val.exe
С:\BlaBla\BlaBla\Archiv\V1\val.exe
D:\Archiv\Archiv\V1\val.exe
D:\BlaBla\Archiv\Archiv\Archiv\V1\v al.exe
Да что-то типо такого
ilya4743 вне форума Ответить с цитированием
Старый 14.03.2017, 18:38   #7
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 272
По умолчанию

Думаю, что нужно копать в сторону Recursive patterned File Globbing.
Или myglob.c из Jhead.
Filka вне форума Ответить с цитированием
Старый 14.03.2017, 20:56   #8
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

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

Процедура производит файлов по маске в указанном и во всех его вложенных каталогах.
Параметр StartFolder указывает на начальный каталог поиска, параметр Mask указывает маску поиска (например '*.pas'), параметр List указывает на список строк, в которых будут записаны результаты поиска,
Параметр ScanSubFolders указывает на необходимость поиска во вложенных подкаталогах.
Код:
procedure FindFiles(StartFolder, Mask: String; List: TStrings; 
ScanSubFolders: Boolean = True); 
var 
SearchRec: TSearchRec; 
FindResult: Integer; 
begin 
List.BeginUpdate; 
try 
StartFolder:=IncludeTrailingBackslash(StartFolder); 
FindResult:=FindFirst(StartFolder+'*.*', faAnyFile, SearchRec); 
try 
while FindResult = 0 do with SearchRec do begin 
if (Attr and faDirectory)0 then begin 
if ScanSubFolders and (Name<>'.') and (Name<>'..') then 
FindFiles(StartFolder+Name, Mask, List, ScanSubFolders); 
end else begin 
if MatchesMask(Name, Mask) then List.Add(StartFolder+Name); 
end; 
FindResult:=FindNext(SearchRec); 
end; 
finally 
FindClose(SearchRec); 
end; 
finally 
List.EndUpdate; 
end; 
end;
Пример использования:
Код:
procedure TForm1.Button1Click(Sender: TObject); 
begin 
FindFiles('C:Program Files', '*1a*.exe', memo1.Lines, true); 
end;
kropotkina-alice вне форума Ответить с цитированием
Старый 14.03.2017, 22:38   #9
ilya4743
 
Регистрация: 30.12.2016
Сообщений: 8
По умолчанию

Отлично, все работает, спасибо большое. Жаль лишь, что ускорить этот процесс не особо получится. Попробую на поток это повесить, может быстрее станет.

Последний раз редактировалось Alex11223; 14.03.2017 в 22:43.
ilya4743 вне форума Ответить с цитированием
Старый 15.03.2017, 07:45   #10
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 272
По умолчанию

http://torry.net/pages.php?id=256
Filka вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить адрес файла или папки bigory Visual C++ 2 11.12.2012 02:25
Поиск по названиям папки Николай ПН Помощь студентам 2 13.05.2010 21:40
Поиск папки по маске ForzaJuve Общие вопросы Delphi 9 20.06.2009 23:50
Поиск папки Михаил Юрьевич Общие вопросы Delphi 8 04.06.2009 12:52
Поиск папки WOLFak Общие вопросы Delphi 9 21.01.2008 14:49