Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 42 43 44 45 46 47 48 49 50 [51]
 Re: Топик "как я лажанулся"  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4339
FindFirstFile и знаки "?" в маске.

Понадобилась такая маска: yyyymmdd??.log

Я (по наивности) всю жизнь полагал, что если в маске ? - то в результат попадут только файлы, в которых на этом месте именно один символ (ни больше, ни меньше). Если ?? - то именно два символа и т.д.

А оказывается, это не совсем так.

если написать маску a?.txt, то в результат не попадет файл a12.txt.
Но, зато, если написать маску a???.txt, то, как сегодня внезапно оказалось, в результат попадут и
и a123.txt, и a12.txt, и a1.txt.

Пол дня убил. В msdn не нашёл ничего полезного, на стэковерфло только похожий случай нашел.
Эта фича - еще со времен доса, оказывается

Единственный выход - после выборки еще раз самому "фильтровать" результат.

Сообщение было отредактировано: 16 ноя 20, 18:32
16 ноя 20, 18:36    [22233220]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12319
YuRock
А оказывается, это не совсем так.
Похоже, что ?, который находится в конце имени или расширения, подразумевает, что символ может отсутствовать вообще. Если же ? находится в начале или середине имени, то это таки ровно 1 символ
16 ноя 20, 19:00    [22233245]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4339
_Vasilisk_
YuRock
А оказывается, это не совсем так.
Похоже, что ?, который находится в конце имени или расширения, подразумевает, что символ может отсутствовать вообще. Если же ? находится в начале или середине имени, то это таки ровно 1 символ
Если есть хоть 1 символ в конце - то всё равно, сколько вопросиков (главное, чтобы символов было не больше, чем вопросиков). Вот так.
Так и dir работает (и сейчас), я проверил навсякий)
16 ноя 20, 19:39    [22233297]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4339
И то, что именно в конце такой эффект - не факт.
16 ноя 20, 19:40    [22233300]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4339
YuRock
И то, что именно в конце такой эффект - не факт.
Хотя я проверил, вроде да.
Но я уже ни в чем не уверен.
Больше всего меня поражает, что в мсдн об этом ни слова нет.
16 ноя 20, 19:43    [22233302]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4339
_Vasilisk_
Похоже, что ?, который находится в конце имени или расширения, подразумевает, что символ может отсутствовать вообще
Да, так, наверно, наиболее точно. Не важно, есть ли там символы вообще.
16 ноя 20, 19:47    [22233305]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1350
YuRock
Единственный выход - после выборки еще раз самому "фильтровать" результат.

Вот беда... :)
Используй TMask, если лень кодить.
16 ноя 20, 19:48    [22233306]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4339
ъъъъъ
YuRock
Единственный выход - после выборки еще раз самому "фильтровать" результат.

Вот беда... :)
Используй TMask, если лень кодить.
Обижаешь, у меня всё такое со строками давно накод(ж)ено.
Тут дело в принципе. Написал код, а он не работает, как я ожидал. Не люблю такое, даже не вспомню, когда предыдущий раз был такой облом с функциями винапи.
16 ноя 20, 20:24    [22233324]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 459
В масках много таких косяков. Натыкался на подобное, когда маска *.txt радостно гребла foo.txt_
17 ноя 20, 00:43    [22233418]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 760
YuRock,

так еще в МS_DOS работало. Вы не нашли в МСДН?

Вот, нашел по-русски: https://docs.microsoft.com/ru-ru/windows-server/administration/windows-commands/dir

Там описаны и другие грабли, которые вы еще не открыли.
17 ноя 20, 02:56    [22233457]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4339
НеофитSQL
Вы не нашли в МСДН?

Вот, нашел по-русски
Это не описание winapi. Это описание операционки для пользователя.
17 ноя 20, 08:50    [22233494]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4339
НеофитSQL,

Но так-то да, спасибо. Вообще бред написан, бессмыслица:

автор
Можно использовать вопросительный знак (?) в качестве замены для одного символа в имени. Например, введите dir read???.txt список всех файлов в текущем каталоге с расширением txt, которые начинаются с Read и следуют до трех символов. Сюда входят Read.txt, Read1.txt, Read12.txt, Read123.txt и Readme1.txt, но не Readme12.txt.
17 ноя 20, 08:54    [22233495]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 760
YuRock
НеофитSQL
Вы не нашли в МСДН?

Вот, нашел по-русски
Это не описание winapi. Это описание операционки для пользователя.


Программист Винды считается способным пользователем команды dir, и нескольких других.
В руководствах для механиков не объясняют как включать дворники, считается что механики компетентные пользователи.

FindFileFirst(Ex) упоминает два wildcard characters, * и ?, плюс специальные методы использования '?', некоторые грабли и ограничения возможностей функции.

Звездочка в Винде работает не так, и не там, как в юниксе/линуксе, если что.
17 ноя 20, 13:49    [22233709]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
alekcvp
Member

Откуда:
Сообщений: 2494
НеофитSQL,

Меня больше радует, что под маску 'dru??.zip' может попасть файл 'beach.rar', если у него короткое dos-имя 'drunk.zip'.
Это вообще шедеврально.
17 ноя 20, 14:10    [22233731]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 760
alekcvp
НеофитSQL,

Меня больше радует, что под маску 'dru??.zip' может попасть файл 'beach.rar', если у него короткое dos-имя 'drunk.zip'.
Это вообще шедеврально.


Надеюсь, скоро формирование 8.3 будет отключено по умолчанию, и об этом можно будет забыть.

В вашем примере такого не должно случиться. Формирование коротких имен обычно происходит из 6 букв длинного имени, уникального счетчика начинающегося с ~1, и первых трех букв расширения.

Как Винда работает когда счетчика не хватает, я не проверял.

...

Стало любопытно, создал тысячу длинных файлов и посмотрел:

C:\code\т>dir /x

17.11.2020 14:39 <DIR> .
17.11.2020 14:39 <DIR> ..
17.11.2020 14:39 7 LONGFI~1.TXT longfilename1000.txtxtxt
17.11.2020 14:39 7 LONGFI~2.TXT longfilename1001.txtxtxt
17.11.2020 14:39 7 LONGFI~3.TXT longfilename1002.txtxtxt
17.11.2020 14:39 7 LONGFI~4.TXT longfilename1003.txtxtxt
==>17.11.2020 14:39 7 LOD42A~1.TXT longfilename1004.txtxtxt
17.11.2020 14:39 7 LO7A8B~1.TXT longfilename1005.txtxtxt
17.11.2020 14:39 7 LO7585~1.TXT longfilename1006.txtxtxt
17.11.2020 14:39 7 LOD920~1.TXT longfilename1007.txtxtxt

В моем случае после первых четырех файлов переключилось на формирование 8.3 через первые две буквы длинного имени.
17 ноя 20, 14:43    [22233799]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4339
НеофитSQL
Программист Винды считается способным пользователем команды dir
Ну да, я виноват, что уже забыл (и знал ли - не факт) этот нюанс работы dir. Я и во времена доса ей не особо пользовался - предпочитал Volkov Commander.

НеофитSQL
FindFileFirst(Ex) упоминает два wildcard characters, * и ?
Конечно упоминается. Потому я их и спользовал.
Но там не написан алгоритм влияния этих wildcard characters на результат. Потому я положился на свой шар, в этот раз он меня подвёл. А идти смотреть доку по команде dir я не догадался - если что, топик называется "Как я лажанулся".

П.С. А в доке по dir, как я уже говорил, тоже написано смутно и двусмысленно. Ну это уже ладно, опять же, мои проблемы.
17 ноя 20, 15:09    [22233840]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
alekcvp
Member

Откуда:
Сообщений: 2494
НеофитSQL

C:\code\т>dir /x

17.11.2020 14:39 <DIR> .
17.11.2020 14:39 <DIR> ..
17.11.2020 14:39 7 LONGFI~1.TXT longfilename1000.txtxtxt
17.11.2020 14:39 7 LONGFI~2.TXT longfilename1001.txtxtxt
17.11.2020 14:39 7 LONGFI~3.TXT longfilename1002.txtxtxt
17.11.2020 14:39 7 LONGFI~4.TXT longfilename1003.txtxtxt
==>17.11.2020 14:39 7 LOD42A~1.TXT longfilename1004.txtxtxt
17.11.2020 14:39 7 LO7A8B~1.TXT longfilename1005.txtxtxt
17.11.2020 14:39 7 LO7585~1.TXT longfilename1006.txtxtxt
17.11.2020 14:39 7 LOD920~1.TXT longfilename1007.txtxtxt
В моем случае после первых четырех файлов переключилось на формирование 8.3 через первые две буквы длинного имени.

А потом вы попытаетесь удалить файлы по маске lod*.txt и будете крайне удивлены...
17 ноя 20, 15:19    [22233853]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
alekcvp
Member

Откуда:
Сообщений: 2494
Есть простенький код:
FSessionID := DateTimeToUnix(Now, False) shl 32 or (Random($1000) shl 16) or Random($1000);

Казалось бы: что может пойти не так?..
19 ноя 20, 16:29    [22235505]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1199
удалено

Сообщение было отредактировано: 19 ноя 20, 16:52
19 ноя 20, 16:56    [22235529]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12319
alekcvp
Казалось бы: что может пойти не так?.
Что-то кастанулось к Integer и DateTimeToUnix не использовался?

Или FSessionID Integer?
19 ноя 20, 18:04    [22235592]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
alekcvp
Member

Откуда:
Сообщений: 2494
_Vasilisk_
alekcvp
Казалось бы: что может пойти не так?.
Что-то кастанулось к Integer и DateTimeToUnix не использовался?
Или FSessionID Integer?

Забыл дописать,
FSessionID: UInt64;

Random() shl 16 расширялся до 64 бит как знаковое целое т.к. Integer. В результате я периодически получал значение: $FFFFFFFFXXXXXXXX.
19 ноя 20, 18:08    [22235596]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12319
alekcvp
Random() shl 16 расширялся до 64 бит как знаковое целое
Как? Random($1000) всегда получится >= 0 и старший бит единицей не станет никогда.

Написал так
var
  FSessionID: Int64;
begin
  repeat
    FSessionID := DateTimeToUnix(Now, False) shl 32 or (Random($1000) shl 16) or Random($1000);
  until FSEssionID < 0;
end;
получил бесконечный цикл
19 ноя 20, 18:18    [22235604]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
alekcvp
Member

Откуда:
Сообщений: 2494
_Vasilisk_
Как?

Блин.
Я опечатался когда сюда писал, там $10000 (чтобы максимальное было $FFFF).

Сообщение было отредактировано: 19 ноя 20, 18:46
19 ноя 20, 18:51    [22235636]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26836
alekcvp
_Vasilisk_
Как?

Блин.
Я опечатался когда сюда писал, там $10000 (чтобы максимальное было $FFFF).

Ну это...
Лажа при описании лажы. :D
19 ноя 20, 19:06    [22235647]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
alekcvp
Member

Откуда:
Сообщений: 2494
wadman
Ну это...
Лажа при описании лажы. :D

Конец рабочего дня, чего ты хочешь 😁
19 ноя 20, 19:39    [22235661]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 42 43 44 45 46 47 48 49 50 [51]
Все форумы / Delphi Ответить