1. Куча / Говнокод #12445

    +129

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    > echo 1 >1.cp
    > echo 1 >1.cpp
    > echo 1 >1.cppp
    > dir /b *.cp
    1.cp
    > dir /b *.cpp
    1.cpp
    1.cppp

    Баг в FindFirstFile/FindNextFile, показан на виндовом dir для простоты демонстрации. Призрак DOS'а жив даже в семерке...

    Запостил: bormand, 18 Января 2013

    Комментарии (38) RSS

    • Причем:
      > echo 1 >1.cpppp
      > dir /b *.cp
      1.cp
      > dir /b *.cpp
      1.cpp
      1.cppp
      1.cpppp
      > dir /b *.cppp
      1.cppp
      Ответить
    • Проблема banana? Знаешь, как писать, но не знаешь, когда нужно остановиться?
      Ответить
      • Не, проблема в том, что если в расширении в маске ровно 3 символа, то ищутся и 4 и 5 и более...
        Ответить
    • > dir /X *.cpp
      ...
      18.01.2013 14:45 4 1.cpp
      18.01.2013 14:45 4 137E2~1.CPP 1.cppp
      ...

      > dir /b 13*.*
      1.cppp

      Генерация коротких имён включена по умолчанию.
      P.S. Вывод последнего dir'а рвёт мозг. Но такая схема работать будет во всех случаях, когда короткое имя не совпадает с длинным, а не только когда в расширении больше трёх символов.
      Ответить
      • А как это отключить в FindFirstFile? ;)
        Ответить
        • Есть мысль попробовать FindFirstFileEx с опцией FIND_FIRST_EX_CASE_SENSITIVE.
          Ответить
          • Попробовал так:
            HANDLE h = FindFirstFileExW(L"*.cpp", FindExInfoStandard, &data, 0, NULL, FIND_FIRST_EX_CASE_SENSITIVE);
            Один хрен багует, что с *.cpp, что с *.CPP. ВиндаГовно.

            P.S. Не ну есть конечно вариант - отключить параметр в реестре, отвечающий за генерацию коротких имен, но это совсем уж радикальный вариант.
            Ответить
            • http://msdn.microsoft.com/en-us/library/windows/desktop/aa364415(v=vs.85).aspx:

              FindExInfoBasic
              The FindFirstFileEx function does not query the short file name, improving overall enumeration speed.
              Ответить
              • P.S. FindExInfoBasic нет в Висте и в XP. Для совместимости придётся тупо сравнивать имя каждого найденного файла с маской.
                Ответить
                • неговно и вот почему:
                  dir *~* > wtf.txt && start wtf.txt
                  Ответить
                  • И ради этого теперь всем прогам, пользующимся FindFirstFile страдать? Имхо эту хуиту надо сделать не то что отключаемой опцией, а даже опцией включаемой. Кому надо - включит. Остальным оно только мешает.

                    P.S. Нахуя зачем нужен этот код? Найти файлы не проходящие по 8.3, и следовательно отображаемые в досе не так (а также до кучи все файлы с тильдами в духе ~1.txt и 1.txt~)? Или есть еще какой-то скрытый смысл, недоступный простым смертным?
                    Ответить
                    • да, давайте сделаем отдельный command.com чтобы можно было работать с короткими именами и запускать gnu make
                      Ответить
                      • Кому в голову сейчас придет работать с именами в формате 8.3 (кроме тех несчастных людей, которым до сих пор приходится работать с foxpro)?

                        В виндосервере 2003+ по дефолту вообще отключена поддержка говна мамонта досовских имен.

                        Не лучше уж отдельный коммандком для тех кому еще нужно работать с досовскими прогами, чем костыли во всех виндовых прогах пользующихся FindFirstFile, включая все шарпейские проги, использующие DirectoryInfo.GetFile.
                        Ответить
                        • религия запрещает отключить генерацию коротких имен для тома, если они действительно так сильно не нужны?

                          каптча 8383
                          Ответить
                          • > отключить генерацию коротких имен для тома
                            У клиентов? Лолшто. Так и представляю себе звонок в техподдержку - "Алло, у меня вместо *.doc ищутся *.docx, что мне сделать?" - "Отключите поддержку коротких имен для тома" - "Да пошли вы нахуй, у меня фокспро до сих пор юзается".

                            P.S. Какие вы там проблемы кстати заметили с gnu make, из-за которых вы так защищаете 8.3 имена?
                            Ответить
                            • пробелы в именах
                              Ответить
                              • > пробелы в именах
                                И причем тут дособлядские 8.3?

                                Если надо найти файлы с пробелами - запускаете
                                dir "* *"
                                Ответить
                                • сразу видно человека который ни разу не пробовал поставить mingw в %ProgramFiles% ни разу не ставил
                                  Ответить
                                  • Mingw работает с именами с пробелами:
                                    ls "C:\Program Files"

                                    А что происходит при установке в %ProgramFiles%?
                                    Ответить
                                    • > А что происходит при установке в %ProgramFiles%?
                                      Не работает. У make $^ сломаются, и еще много что сломается. Она не умеет нормально экранировать пробелы при генерации команд.
                                      Ответить
                                  • > сразу видно человека который ни разу не пробовал поставить mingw в %ProgramFiles% ни разу не ставил
                                    Я так похож на идиота, который поставит мингв в путь с пробелами забив на все предупреждения?
                                    Ответить
                              • P.S. Проблемы с пробелами в именах у gnu make даже в никсах. Начиная с того, что даже $^ нормально не пашет. А вот на длину имен, количество точек, и длину расширений make никаких ограничений не налагает, и вполне их переваривает...

                                Так причем же тут 8.3 имена, guest?
                                Чем же твой dir *~* (требующий поддержки багофичи с поиском 8.3 имен) полезней dir "* *" в плане работы с gnu make, guest?
                                Не толстый ли ты тролль, guest?
                                Ответить
                          • А если уже есть том с короткими именами, забитый под завязку? А если флэшка? Отключить генерацию, перенести все файлы в новую директорию, а потом вернуть обратно?
                            Ответить
                • Вы не поверите, но оно выдает ту же самую хуиту те же самые левые файлы, просто не заполняет поле cAlternateFileName.
                  Ответить
                  • > improving overall enumeration speed

                    В Микрософте всерьёз думают, что заполнение лишнего поля даст заметный прирост тормозов по сравнению с операциями над файловой системой?
                    Ответить
                • Барабанная дробь... c#:
                  DirectoryInfo dir = new DirectoryInfo(@"c:\1\");
                  foreach (FileInfo f in dir.GetFiles("*.cpp"))
                  {
                      Console.WriteLine(f.Name);
                  }
                  Выводит те самые 1.cpp, 1.cppp, 1.cpppp
                  Ответить
    • touch? не слышал...
      Ответить
    • Редмонд, Вашингтон: Неизвестный поджег офис компании Майкрософт и скрылся в неизвестном направлении. Пострадало двое граждан Индии. Очевидцы утверждают, что неизвестный выкрикивал фразу «Долой короткие имена!» и что-то про FoxPro.
      Ответить
    • показать все, что скрытоСпермоклоунада.
      Ответить
    • а я до сих пор использую имена 8.3 и без пробелов
      Ответить
    • Может быть 1.cppp на самом деле имеет имя 1~1.cpp? Вот оно и нашлось.
      Ответить
      • В Windows 4.x так и будет. Хотя какой смысл искать одновременно по LFN и по SFN?

        В Windows NT короткое имя может выглядеть, как адский трэш (перед тильдой будут шестнадцатеричные цифры), а кроме того, оно ещё и опционально.
        Ответить
    • В восьмёрке тоже работает.
      Скриншот http://s002.radikal.ru/i198/1303/41/672be625b131.png
      Ответить
    • В итоге мы простояли десять минут у дома Джейкоба, который даже не пытался поторопиться.
      Ответить

    Добавить комментарий