У меня такая вот небольшая проблема - надо вывести список файлов в папке. Сложность в том, что файлы могут иметь названия на каком угодно языке вплоть до китайского. FindFirst/FindNext возвращают их имена как ascii, про старые "паскальные" функции и говорить нечего. В итоге все специфические символы теряются. Как получить список имен файлов в папке в формате WideString?
Или так - можно ли из виндовского диалога выбора файлов (он все отображает как надо) получить ВСЕ имена?
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
19-07-2004 17:41 | Сообщение от автора вопроса
То есть в вин98 есть, например, русская версия, она понимает русский язык. Есть, скажем, французская, она понимает французский. Можно предположить, что неюникодные варианты функций и компонентов под локализованной виндой и так должны понимать местное наречие? Я под XP пробовал отобразить в ListView название файла на испанском. Поставил испанский язык, испанские региональный настройки и даже выбрал испанский язык для неюникодных программ. Прикрутил к списку диалог шрифта, все перепробовал, но оно так и не отобразилось как надо. Тогда собственно и пришлось переходить на юникод. А в 98 значит должно?
Судя по MSDN'у, в Windows 98 Unicode-вариантов функций FindFirstFile и FindNextFile нет, поэтому ваша программа в Win 98 даже не запуститься. Но, насколько мне известно, ни одна файловая система, поддерживаемая в Win 98, не допускает использования Unicode, а потому и искать там что-то таким образом не стоит.
Дело в том, что есть две FindClose: функция из kernel32.dll, которая импортируется в модуле Windows, и функция, реализующаяся в модуле SysUtils (эта функция закрывает поиск, начатый функциями FindFirst/FindNext, реализованными в этом же модуле). По умолчанию вызывается вторая из них, т.к. в uses модуль SysUtils стоит после Windows, и его объявления перекрывают одноимённые объявления Windows. Чтобы вызвать FindClose из Windows, надо явно указать имя модуля: Windows.FindClose(...);
Единственный вопрос - не удается "закрыть" поиск. FindClose(SR) и FindClose(hnd) вылетают, FindCloseW не нашел. Как с закрытием быть, подскажите кто-нибудь, пожалуйста.
Все-таки не выходит... А не знаете ссылку на какой небольшой пример на эту тему? По хэлпу не получается разобраться, в системном программировании я не силен:(
А, пардон... FindNextFileW есть. Спасибо, теперь должно работать. Хотя все равно не понятно, почему было не сделать совершенно такие же функции FindFirstW и FindNextW.
А почему же FindNextW отсутствует в прилагаемом к дельфи7 WindowsSDK? И бумажный справочник по WinAPI смотрел, там такого тоже нету... Пробовал написать - компилятор матерится.
заменяем
FindData: TWin32FindData platform;
на
FindData: TWin32FindDataW platform;
и получаем это все, скажем, в TSearchRecW
все остальное по этому же принципу ...
Это было первое, про что я подумал. Перерыл хэлп и справочники, нашел FindFirstW, но не нашел FindNextW. Не можете ли подсказать более конкретно, какие именно функции имеются в виду?
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.