Войти

Показать полную графическую версию : [решено] кириллические имена файлов и маска ~*.*


ffs2001
13-03-2012, 14:26
Господа, такая проблема:

при отборе файлов в циклах for или подпрограмме forfiles с именами латиницей всё хорошо, а вот кириллические отбираются с тильдой на любом месте (например, ПСКОВСК~1.DOC считается соответствующим маске). Кто-нибудь сталкивался с такой проблемой? Поиск не помог.

Iska
13-03-2012, 15:03
Все сталкивались. Это короткие имена файлов и папок:
dir /x
Таковы особенности работы функций WinAPI, насколько я понимаю — поиск ведётся не только по длинным, но и по коротким именам.

P.S. Маска, всё же, наверное «*~*.*»?!

ffs2001
13-03-2012, 15:09
Маска именно ~*.*
Суть именно в том, чтобы отобрать файлы, у которых первым (а не любым) символом является тильда.

Iska
13-03-2012, 16:05
ffs2001, приведите длинное имя файла «ПСКОВСК~1.DOC».

Приведите Ваш код для «в циклах for или подпрограмме forfiles», приводящий к вышеуказанному эффекту.

ffs2001
13-03-2012, 17:17
Имя файла (например):
ПСКОВС~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"""

Iska
13-03-2012, 17:22
Имя файла (например):
ПСКОВС~1.doc (т.е. это и есть полное имя, и тильда там есть в любом отображении) »
Уверены?

C:\Песочница\0003>dir /x

13.03.2012 17:24 0 ~10E37~1.DOC ПСКОВС~1.doc

Отсюда — и попадание под Вашу маску.

ffs2001
13-03-2012, 17:33
Ага. Спасибо.

Однако в папке с этим файлом ещё масса таких же, "неявно" начинающихся с тильды. При этом в результаты поиска обоих циклов они не попадают (есть, например, файл с коротким именем ~301~.doc и длинным - очень длинным, с пробелами - кириллическим именем; условиям циклов он соответствует, а в результаты не попадает). С чем это связано?

Foreigner
13-03-2012, 18:55
ffs2001,
отобрать файлы, у которых первым (а не любым) символом является тильда.
Пропускай через findstr

for /f "tokens=*" %%i in (' "dir /b | findstr "^^~.*"" ') do echo %%i

Iska
13-03-2012, 19:52
…и длинным - очень длинным, с пробелами - кириллическим именем; »
Приведите здесь это имя.

ffs2001
13-03-2012, 22:31
А, прошу прощения. Там не тильды, там дефисы. C тильдами всё попадает.

То есть с тильды начинаются когда-то побитые имена.

Foreigner,
спасибо за подсказку. Правда, хотел делать через forfiles, т.к. через них проще работать с датой.
Жаль, спутали мне все карты эти короткие и битые имена...

Iska
14-03-2012, 07:39
…с тильды начинаются когда-то побитые имена. »
Iska начинает биться головой об стену…

ffs2001
14-03-2012, 11:42
Что не так?

Iska
16-03-2012, 03:15
Из письма в 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). Проблема, на самом деле, весьма серьёзная.

ffs2001
16-03-2012, 14:48
К чему было битие головой о стену?

Iska
16-03-2012, 15:34
ffs2001, от бессилия.

El Sanchez
16-03-2012, 18:49
Информации по алгоритму генерации короткого имени по длинному кириллическому имени я не нашёл »
Iska, функция WINAPI GetShortPathName генерит короткие имена. Кириллические имена файлов возвращает в том виде, в котором возвращает их команда dir /x. Но в cmd.exe ее я не нашел, скорее всего используются FindFirstFileW/FindNextFileW со структурой _WIN32_FIND_DATA, одним из членов которой является переменная cAlternateFileName с коротким именем.

Iska
16-03-2012, 20:12
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, да, вы правы, проверил.

ffs2001
04-04-2012, 02:05
Собственно, та задача, из-за которой всё затевалось, решилась банально: более актуальной маской для задачи оказалась ~$*.* , а под неё ничего лишнего не попадает.




© OSzone.net 2001-2012