Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
ВнизМаска папки Найти похожие ветки
← →
R © (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]Нет ни каких папок - это все файлы
← →
R © (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.048 c