|
7 / 7 / 0
Регистрация: 21.12.2016
Сообщений: 152
|
||||||
FindFirstFile не корректно определяет имена файлов с диакритическими знаками18.04.2023, 21:49. Показов 4911. Ответов 88
Метки нет (Все метки)
Доброго времени суток.
Делаю програмку, необходимо получить содержимое папки (список папок и файлов) и после определить ФАЙЛ или ПАПКА и другие атрибуты. Как всегда делал раньше, через API "FindFirstFile", привык, удобно и есть заготовки кода. И вот, выясняется такая неприятная ситуация. На компьютере есть несколько видео файлов с испанскими названиями. В них содержатся слова с Диакритическими знаками. например: "Niño cristiano GANA! concurso secular YouTube.flv español.mp4" Как выяснилось, "FindFirstFile" возвращая имя этого файла, возвращает его как: "Nino cristiano GANA! concurso secular YouTube.flv espanol.mp4" - ну и в дальнейшем соответственно вся обработка рушится. Вот код, давно когда-то нашёл на просторах интернета и всегда использовал:
Облазил весь интернет, так и не понял, как можно исправить данную ситуацию. Читал на каком-то зарубежном С++ форуме, что используют FindFirstFileW и WIN32_FIND_DATAW Но как это оформить и поможет ли это в моём случае, до конца так и не понял. Даже не понял, как объявить правильно на vb6. Если не затруднит, подскажите кто знает, решение. А лучше готовый кусок кода. Буду очень признателен.
0
|
||||||
| 18.04.2023, 21:49 | |
|
Ответы с готовыми решениями:
88
Работа с файлами поиск файлов FindFirstFile,FindNextFile |
|
Модератор
|
|
| 23.04.2023, 17:15 | |
|
ANSI строки - это многобайтовые строки. Я уже сказал как нужно делать - последний параметр WideCharToMultibyte говорит если при трансляции из UNICODE в ANSI возникают проблемы с представлением символа в нужной кодировке. Один раз вызвали - проверили последний параметр. Китайские символы точно также могут быть в ANSI кодировке, просто кодируются они не 1 байтом, а несколькими. 1-байтовые кодировки - это ASCII (ну и другие типа КОИ-8).
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||
| 23.04.2023, 18:41 | ||
|
0
|
||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||
| 23.04.2023, 18:54 | ||
|
Ты меня ни разу не попровил когда мы работали с ANSI файлами с поиском например, ты ни разу не сказал, что это файл не ANSI а ASCII мало того ты сам называл это ANSI хотя по факту там ОДИН байт на один символ! Даже в том файле что я тебе присылал 40МБ большой помнишь
Добавлено через 40 секунд Поэтому я тебя не понимаю теперь уже вообще Добавлено через 1 минуту
0
|
||
|
Модератор
|
|||
| 23.04.2023, 19:21 | |||
|
0
|
|||
|
Модератор
|
||
| 23.04.2023, 19:37 | ||
|
0
|
||
|
7 / 7 / 0
Регистрация: 21.12.2016
Сообщений: 152
|
|
| 27.04.2023, 05:16 [ТС] | |
|
Доброго времени суток, ещё раз..
Вобщем как отловить это дело, я разобрался. Спасибо за советы!) Теперь вот озадачился, как дать всем файлам не повторяющиеся имена. Дело в том, что если я китайские иероглифы буду заменять просто на "_", то у меня все файлы будут получаться типа: "_____.png" - только с разным количеством символов. Повторы неизбежны. И вот я думаю, может сделать какой-то счётчик. Типа 0000001 и в каждой новой папке его запускать с нуля, наверное так. Пишу вот сейчас и мысль пришла)) пошёл пробовать.
0
|
|
|
Модератор
|
|
| 27.04.2023, 06:59 | |
|
1
|
|
|
7 / 7 / 0
Регистрация: 21.12.2016
Сообщений: 152
|
|
| 27.04.2023, 09:14 [ТС] | |
|
The trick, Спасибо, это лучшее решение.
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 27.04.2023, 12:07 | |
|
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||||||||||||
| 29.04.2023, 22:30 | ||||||||||||
|
В программе Vector06C у The Trick, в классе CTextFile.cls, есть функция IsInputTextUnicode, которая обращается к API-функции IsTextUnicode из библиотеки advapi32.dll. Так вот эта функция должна бы определять есть ли в строке уникод, но по факту получается, что если строка содержит русские символы то функция считает, что это уникод. Только если все английские то считает что это не уникод...
Вот нашёл у иностранцев код:
0
|
||||||||||||
| 30.09.2023, 08:22 | |||||||
|
Кликните здесь для просмотра всего текста
Добавлено через 5 минут Вместо lstrlen(lpStr) * 2 можно просто искать, нуль в wfd.cFileName(), но, скорее всего, lstrlen будет бытрее Добавлено через 16 минут В идеале я вижу, так, что нужно писать строки в один общий буфер (как в StringBuilder-е), периодически расширяя его большими порциями с помощью HeapReAlloc. Параллельно можно писать в строковый массив указатели с этого буфера, если нужен именно массив.
1
|
|||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||
| 30.09.2023, 08:48 | ||
|
testuser2, поковырялся в этой функции и хорошо, я рад, что тебе она понравилась, конечно же я не делал упор на оптимизацию скорости тут, что касательно массивов то для XP нужно выделять буфер скажем ну сразу на 1000 строк. Итак каждую 1000 строк например подкачивать, для семёрки это не критично, так как ReDim Preserve StrArray(cnt) каждую интерацию работает быстро в семёрке. Пропускать первые две интерации это ты конечно интересно придумал, но вдруг в первой и второй интерации не будут позиции "." и ".." с точки зрения производительности ты хоть одну миллисекунду выиграл вообще? Я считаю что If DirName <> "." And DirName <> ".." Then будет лучше.
Добавлено через 1 минуту Добавлено через 2 минуты testuser2, например, в корне диска, первые две позиции могут быть уже другими, а не "." и ".."
0
|
||
| 30.09.2023, 08:54 | ||
|
0
|
||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||||||
| 30.09.2023, 08:56 | ||||||
|
Кстати эта функция я знаю что она не совершенна, например она не позволяет добавлять файлы БЕЗ КАТАЛОГОВ а мне это недавно понадобилось и пришлось переписать функцию. Плюс со всеми вложенными подпапками. Плюс добавил рекурсию. Для бесконечного поиска папок и файлов ровно до тех пор пока они будут найдены.
Это мой новый шедевр гениальности моей (можешь посмотреть если интересно), тут ещё плюс даты и время файлов и их размер, недавно написал как раз новый модуль:
1
|
||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||
| 30.09.2023, 09:13 | ||
|
0
|
||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 30.09.2023, 10:12 | |
|
testuser2, ты с этими указателями не мудри
0
|
|
| 30.09.2023, 10:12 | |
|
Переименование PDF-файлов в имена, берущиеся из содержимого этих файлов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал.
Оно само - говорит.
Кто слышит тот слышит.
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|