Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Вниз

Маска папки   Найти похожие ветки 

 
©   (2004-07-28 08:12) [0]

Если производить поиск файлов то тут все понятно,
для индентификации соответствия имени файла указанной
маске сообразуясь с правилами(*,? ...) можно использовать функцию MatchesMask или IsWild(RxLib)...,
но как быть с папками, какую функцию можно использовать?


 
Fay ©   (2004-07-28 09:07) [1]

FindFirstFile/FindNextFile/FindClose

И сразу будет счастье.


 
Anatoly Podgoretsky ©   (2004-07-28 09:16) [2]

Нет ни каких папок - это все файлы


 
©   (2004-07-28 13:51) [3]

>Fay ©   (28.07.04 09:07) [1]
FindFirstFile/FindNextFile/FindClose

Нет не будет счастья.

>Anatoly Podgoretsky ©   (28.07.04 09:16) [2]
Нет ни каких папок - это все файлы

Это то понятно, но те функции которые я перечислил
не будут отрабатывать при поиске именно папки, точнее
не так как надо.

Приведите пример не функции поиска, а именно определения
соответствия масски введенной пользователем имени папки.
Ну допустим надо найти Program Files , а маска такова ?rogram*


 
Fay ©   (2004-07-28 14:03) [4]

Пережуёшь сам.

var
 fd : _WIN32_FIND_DATA;
 fh : DWORD;
begin
 FillChar(fd, SizeOf(fd), 0);
 fh := FindFirstFile("c:\?rog*", fd);
 if fh = INVALID_HANDLE_VALUE then RaiseLastOSError;
 try
   repeat
     if (fd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0 then
       ShowMessage(fd.cFileName);
   until not FindNextFile(fh, fd);
 finally
   Windows.FindClose(fh);
 end;


 
olookin ©   (2004-07-28 20:53) [5]

Ту же самую, но папка имеет идентификатор "*" или "*."

Вот пример

procedure TForm1.Scan(Path: Ansistring);
var SearchRec: TSearchRec;
   s: string;
   r,a: Ansistring;
begin
 FindFirst(Path+"\*.*",faAnyFile,SearchRec);
 while FindNext(SearchRec)=0 do begin
 s:="*"+LowerCase(ExtractFileExt(Path+"\"+SearchRec.Name));
 if (s<>"*") and (s<>"*.") and (s="*.mp3") then begin
 r:=ExtractFilePath(Path+"\"+SearchRec.Name);
 a:=ExtractFileName(Path+"\"+SearchRec.Name);
 a:=StringReplace(a," ","_",[rfReplaceAll]);
 RenameFile(Path+"\"+SearchRec.Name,r+a); end;
 if (SearchRec.Attr and faDirectory=faDirectory) and
 (SearchRec.Name[1]<>".") then Scan(Path+"\"+SearchRec.Name); end;
 FindClose(SearchRec);
end;


 
Fay ©   (2004-07-28 20:57) [6]

2olookin ©   (28.07.04 20:53) [5]
Ужасно.


 
olookin ©   (2004-07-28 21:00) [7]

[6] Fay ©   (28.07.04 20:57)

А что именно?


 
Fay ©   (2004-07-28 21:06) [8]

2olookin ©   (28.07.04 21:00) [7]
Да хотя бы это

>  FindFirst(Path+"\*.*",faAnyFile,SearchRec);
>  while FindNext(SearchRec)=0 do begin


 
olookin ©   (2004-07-28 21:12) [9]

[8] Fay ©   (28.07.04 21:06)

Так ты поясни что-ли


 
Fay ©   (2004-07-28 21:17) [10]

Первый найденый файл/каталог ты игнорируешь. А вв остальной шаманский код я вАщЕ не въехал - не каждый день так везёт.


 
olookin ©   (2004-07-28 21:25) [11]

[10] Fay ©   (28.07.04 21:17)
Ты перво-наперво попробуй код - а потом говори


 
Fay ©   (2004-07-28 21:36) [12]

2olookin ©   (28.07.04 21:25) [11]


> Ты перво-наперво попробуй код - а потом говори

Вот и я так думаю...

{$DEFINE FAY_RULEZ}

procedure FYVM2;
var
 SearchRec : TSearchRec;
begin
{$IFNDEF FAY_RULEZ}
 FindFirst("c:\?rog*", faAnyFile, SearchRec);
 while FindNext(SearchRec) = 0 do
   begin
     ShowMessage(SearchRec.Name);
   end;
 FindClose(SearchRec);
{$ELSE}

 FindFirst("c:\?rog*", faAnyFile, SearchRec);
 repeat
   ShowMessage(SearchRec.Name);
 until FindNext(SearchRec) <> 0;
 FindClose(SearchRec);
{$ENDIF}
end;


 
Юрий Зотов ©   (2004-07-28 21:38) [13]

> R ©   (28.07.04 13:51) [3]

> Приведите пример не функции поиска, а именно определения
> соответствия масски введенной пользователем имени папки.

Пожалуйста - MatchesMask. Вы просто не очень внимательно посмотрели справку - а там внизу есть приписка:

Note: The Filename parameter does not need to be a file name. MatchesMask can be used to check strings against any syntactically correct mask.

Это означает, что MatchesMask просто проверяет строку на соответствие маске. И эта строка совершенно не обязана быть именем реального файла или папки.

Только все это это не обязательно. Маску поиска можно задавать прямо в FindFirst.


 
Fay ©   (2004-07-28 21:40) [14]

Так, Отцы проснулись... 8)


 
olookin ©   (2004-07-28 21:57) [15]

[12] Fay ©   (28.07.04 21:36)
2olookin ©   (28.07.04 21:25) [11]

Ну и ?


 
Fay ©   (2004-07-28 22:03) [16]

Иди спать. Завтра перечитай. Не думаю, что человек, для которого проявление такой тупизны является нормой, смог бы сам завести анкету на форуме. Мне кажется, ты просто устал.
Или я... 8)
Спокойной ночи.


 
olookin ©   (2004-07-28 22:04) [17]

[16] Fay ©   (28.07.04 22:03)

Мне кажется ты просто разглагольствуешь. Проверил специально сам - никаких пропусков. Вывод: или я малые детали упускаю, или ты - гонщик...


 
olookin ©   (2004-07-28 22:08) [18]

[10] Fay ©   (28.07.04 21:17)
Первый найденый файл/каталог ты игнорируешь. А вв остальной шаманский код я вАщЕ не въехал - не каждый день так везёт.

Так что батенька - прежде чем критиковать - надо пробовать пробовать и еще раз пробовать... Ведь невозможна ситуация, когда у меня все ОК, а у тебя все NotOk...


 
olookin ©   (2004-07-28 22:09) [19]

До кучи. Учитывай, что символ _ считается поздним по отношению к альфанумерикальным... Я тоже сначала посчитал что ты прав - но потом посчитал уже просто число найденных файлов - соответствует реалиям...


 
Anatoly Podgoretsky ©   (2004-07-28 22:46) [20]

olookin ©   (28.07.04 22:08) [18]
Модешь не сомневаться, один файл у тебя потерян


 
olookin ©   (2004-07-29 03:26) [21]

[20] Anatoly Podgoretsky ©   (28.07.04 22:46)

Сомневаюсь ибо проверил - ничего не потеряно


 
Anatoly Podgoretsky ©   (2004-07-29 10:08) [22]

FindFirst(Path+"\*.*",faAnyFile,SearchRec);
while FindNext(SearchRec)=0 do begin


 
Fay ©   (2004-07-29 16:56) [23]

2olookin ©   (28.07.04 20:53) [5]
Ты можешь привести документ, регламентирующий порядок нахождения файлов с помощью FindFirst/FindNext?


 
ЮрийК ©   (2004-07-29 17:04) [24]

Маски "*.*" и "*" одно и то же при поиске файлов/папок?
Или всё же результаты поиска будут различаться?


 
Юрий Зотов ©   (2004-07-29 17:07) [25]

"Альфанумерикальным"...
Тоже красиво...


 
olookin ©   (2004-07-30 12:00) [26]

[23] Fay ©   (29.07.04 16:56)
2olookin ©   (28.07.04 20:53) [5]
Ты можешь привести документ, регламентирующий порядок нахождения файлов с помощью FindFirst/FindNext?

Я не совсем понял вопрос. Применительно к моему примеру скажу, что атрибут faAnyFile включает "указатель" (вольная интерпретация наблюдаемого) на текущую папку. Т.е. когда я задал каталог для поиска, сначала (первый раз, т.е. при вызове FindFirst) находится этот указатель ("."). Поэтому мне и не нужно вставлять FindNext в FindFirst, потому что FindFirst все равно не возвратит никогда нужного значения.

Иное дело если в атрибуте я уберу faAnyFile. Тогда действительно первый файл улетит.


 
panov ©   (2004-07-30 12:07) [27]

>olookin ©   (30.07.04 12:00) [26]
А ты свою программу запиши в корень диска.


 
olookin ©   (2004-07-30 12:20) [28]

[27] panov ©   (30.07.04 12:07)
>olookin ©   (30.07.04 12:00) [26]

Записал. Попробовал. Работает. Если в корне диска не было бы папок - тогда возможно и не сработало бы.


 
Fay ©   (2004-07-30 14:41) [29]


> Я не совсем понял вопрос. Применительно к моему примеру
> скажу, что атрибут faAnyFile включает "указатель" (вольная
> интерпретация наблюдаемого) на текущую папку. Т.е. когда
> я задал каталог для поиска, сначала (первый раз, т.е. при
> вызове FindFirst) находится этот указатель (".").
Поэтому
> мне и не нужно вставлять FindNext в FindFirst, потому что
> FindFirst все равно не возвратит никогда нужного значения.

не гарантируется


 
olookin ©   (2004-07-30 14:44) [30]

[29] Fay ©   (30.07.04 14:41)

Не гарантируется, как и сказано в 27


 
GrayFace   (2004-07-30 16:34) [31]

Остальное шаманство в olookin[5]. По поводу if (s<>"*") and (s<>"*.") and (s="*.mp3") then цитирую Fay [16]:Не думаю, что человек, для которого проявление такой тупизны является нормой, смог бы сам завести анкету на форуме. Хотя я бы не был столь катигоричен.


 
Fay ©   (2004-07-30 16:40) [32]

2GrayFace   (30.07.04 16:34) [31]
Я просто хотел сказать, что кто-то из нас (меня и olookin) тормозит. И не знаю кто. После этого я пошёл спать.


 
olookin ©   (2004-07-30 17:03) [33]

[31] GrayFace   (30.07.04 16:34)
Остальное шаманство в olookin[5]. По поводу if (s<>"*") and (s<>"*.") and (s="*.mp3") then цитирую Fay [16]:Не думаю, что человек, для которого проявление такой тупизны является нормой, смог бы сам завести анкету на форуме. Хотя я бы не был столь катигоричен.

Хм. Поясню. Ранее было что-то типа

if (s<>"*") and (s<>"*.") then begin
if s="*.tralala" then DoTralala();
if s="*.tratata" then DoTratata();
and so on...
end;

Потом встает малюсенькая локальненькая задачка - убрать пробелы из имен mp3-файлов. Дергаю выше приведенный код и недолго думая (а то даже и вообще не думая) превращаю в:

if (s<>"*") and (s<>"*.") then begin
if s="*.mp3" then DoMp3();
end;

А затем уже совсем не думая:

if (s<>"*") and (s<>"*.") and (s="*.mp3") then DoMp3();

Кажется, никто не может винить меня за то, что я пользуюсь услугами BackSpace чаще, чем собственным чувством "емкости" или "компактности" или "оптимальности" кода. А с точки зрения правоты кода - он прав на 100%. Он всего лишь избыточен по условиям. Но право слово - задача (см. выше) не такова, чтобы заботиться о "достаточности и необходимости".

Шаманство это? Считаете, что шаманство - пожалста!


 
Fay ©   (2004-07-30 17:15) [34]

>> if (s<>"*") and (s<>"*.") and (s="*.mp3") then DoMp3();
А можно было
if ("*.mp3" <> "*.") and ("*.mp3" <> "*") and (s="*.mp3") then DoMp3();
8)


 
ЮрийК ©   (2004-07-30 17:30) [35]

И всё же, кто знает:
маски "*.*" и "*" одно и то же при поиске файлов/папок?


 
panov ©   (2004-07-30 17:44) [36]

>ЮрийК ©   (30.07.04 17:30) [35]
Одно и то же.


 
Anatoly Podgoretsky ©   (2004-07-30 17:48) [37]

ЮрийК ©   (30.07.04 17:30) [35]
В Виндоус в файловой системе нет расширений


 
ЮрийК ©   (2004-07-31 18:24) [38]

Предположение (наверное ошибочное) :
По маске "*." будут находиться директории.


 
GuAV ©   (2004-07-31 19:23) [39]


> В Виндоус в файловой системе нет расширений

Интересный факт. А есть ли они в файловой системе DOS?

> По маске "*." будут находиться директории.

По маске *. будут находится файлы, не содержащие в имени точку.
В том числе и директории, не содержащие в имени точку.


 
Anatoly Podgoretsky ©   (2004-07-31 20:07) [40]

GuAV ©   (31.07.04 19:23) [39]
Интересный факт. А есть ли они в файловой системе DOS?

Да там в позиции имени файла отведено три места ддя расширения. Формат 8.3
Расширение сейчас содержит декоративную функцию как в Юниксе и может использоваться шелом для поддержки ассоциаций.

По маске *. будут находится файлы, не содержащие в имени точку.
Нет в имена в которых только одна точка, при выводе ее не выводят, имя файла без точки по умолчанию содержит завершающую виртуальную точку.



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

Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.036 c
1-1091521163
VVolodia
2004-08-03 12:19
2004.08.15
Tab Control, Как поменять направление текста и цвет закладки


1-1091090587
ksu
2004-07-29 12:43
2004.08.15
библиотека для растрово-векторной графики


1-1091086356
ShiFT
2004-07-29 11:32
2004.08.15
Разбор строки по Формату


6-1087301835
DNS
2004-06-15 16:17
2004.08.15
Работа с Socket


1-1091452271
Veetyok
2004-08-02 17:11
2004.08.15
Сортировка в StringGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский