Показать полную графическую версию : [решено] кириллические имена файлов и маска ~*.*
Господа, такая проблема:
при отборе файлов в циклах for или подпрограмме forfiles с именами латиницей всё хорошо, а вот кириллические отбираются с тильдой на любом месте (например, ПСКОВСК~1.DOC считается соответствующим маске). Кто-нибудь сталкивался с такой проблемой? Поиск не помог.
Все сталкивались. Это короткие имена файлов и папок:
dir /x
Таковы особенности работы функций WinAPI, насколько я понимаю — поиск ведётся не только по длинным, но и по коротким именам.
P.S. Маска, всё же, наверное «*~*.*»?!
Маска именно ~*.*
Суть именно в том, чтобы отобрать файлы, у которых первым (а не любым) символом является тильда.
ffs2001, приведите длинное имя файла «ПСКОВСК~1.DOC».
Приведите Ваш код для «в циклах for или подпрограмме forfiles», приводящий к вышеуказанному эффекту.
Имя файла (например):
ПСКОВС~1.doc (т.е. это и есть полное имя, и тильда там есть в любом отображении)
код для for
FOR /R "D:\" %%I in (*.tmp ~*.*) do (del "%%~fI")
код для forfiles
forfiles -pD:\ -s -m~*.* -d-7 -c"CMD /C del /AR /AH /A /p ""@FILE"""
Имя файла (например):
ПСКОВС~1.doc (т.е. это и есть полное имя, и тильда там есть в любом отображении) »
Уверены?
C:\Песочница\0003>dir /x
…
13.03.2012 17:24 0 ~10E37~1.DOC ПСКОВС~1.doc
…
Отсюда — и попадание под Вашу маску.
Ага. Спасибо.
Однако в папке с этим файлом ещё масса таких же, "неявно" начинающихся с тильды. При этом в результаты поиска обоих циклов они не попадают (есть, например, файл с коротким именем ~301~.doc и длинным - очень длинным, с пробелами - кириллическим именем; условиям циклов он соответствует, а в результаты не попадает). С чем это связано?
Foreigner
13-03-2012, 18:55
ffs2001,
отобрать файлы, у которых первым (а не любым) символом является тильда.
Пропускай через findstr
for /f "tokens=*" %%i in (' "dir /b | findstr "^^~.*"" ') do echo %%i
…и длинным - очень длинным, с пробелами - кириллическим именем; »
Приведите здесь это имя.
А, прошу прощения. Там не тильды, там дефисы. C тильдами всё попадает.
То есть с тильды начинаются когда-то побитые имена.
Foreigner,
спасибо за подсказку. Правда, хотел делать через forfiles, т.к. через них проще работать с датой.
Жаль, спутали мне все карты эти короткие и битые имена...
…с тильды начинаются когда-то побитые имена. »
Iska начинает биться головой об стену…
Из письма в PM:
Где можно прочесть об алгоритмах присвоения windows коротких имён? Нашёл только сведения о тильде в конце, и больше никакой конкретики.
В Базе Знаний: How Windows Generates 8.3 File Names from Long File Names (http://support.microsoft.com/kb/142982/en-us). Информации по алгоритму генерации короткого имени по длинному кириллическому имени я не нашёл. Буду рад, если сие кому известно.
P.S. Кое-что на тему поиска и масок есть здесь: CMD/BAT - [решено] Пакетный файл для выборки из спика файлов текстовый(название и описание) (http://forum.oszone.net/post-1415220.html#post1415220) (с чего сие для меня и началось — «Журден внезапно прозрел») и здесь: ANY: некоторые документированные особенности использования масок (http://forum.script-coding.com/viewtopic.php?id=4491). Проблема, на самом деле, весьма серьёзная.
К чему было битие головой о стену?
El Sanchez
16-03-2012, 18:49
Информации по алгоритму генерации короткого имени по длинному кириллическому имени я не нашёл »
Iska, функция WINAPI GetShortPathName генерит короткие имена. Кириллические имена файлов возвращает в том виде, в котором возвращает их команда dir /x. Но в cmd.exe ее я не нашел, скорее всего используются FindFirstFileW/FindNextFileW со структурой _WIN32_FIND_DATA, одним из членов которой является переменная cAlternateFileName с коротким именем.
Iska, функция WINAPI GetShortPathName генерит короткие имена. »
El Sanchez, насколько я понимаю, функция GetShortPathName (http://msdn.microsoft.com/en-us/library/windows/desktop/aa364989(v=vs.85).aspx) не генерирует, а читает и возвращает уже существующее в каталоге короткое имя для заданного файла. Что скажете?
скорее всего используются FindFirstFileW/FindNextFileW… »
Угу, я и писал (http://forum.script-coding.com/viewtopic.php?id=4491) об этом:
В данном случае (да и в прочих, о коих речь пойдёт ниже, тоже), похоже, следует винить функцию FindFirstFile Function (Windows) (http://msdn.microsoft.com/en-us/library/aa364418(VS.85).aspx):
Remarks
…
The following list identifies some other search characteristics:
…
* The search includes the long and short file names.
…
То бишь, в поиск включаются как длинные, так и короткие имена файлов.
Сие, в первую очередь, критично для нас и практически незаметно для пользователей, чей язык укладывается в первую половину кодовой таблицы ASCII.
El Sanchez
16-03-2012, 21:24
насколько я понимаю, функция GetShortPathName не генерирует, а читает и возвращает уже существующее в каталоге короткое имя для заданного файла »
Iska, да, вы правы, проверил.
Собственно, та задача, из-за которой всё затевалось, решилась банально: более актуальной маской для задачи оказалась ~$*.* , а под неё ничего лишнего не попадает.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.