Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] кириллические имена файлов и маска ~*.* (http://forum.oszone.net/showthread.php?t=230218)

ffs2001 13-03-2012 14:26 1878305

кириллические имена файлов и маска ~*.*
 
Господа, такая проблема:

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

Iska 13-03-2012 15:03 1878334

Все сталкивались. Это короткие имена файлов и папок:
Код:

dir /x
Таковы особенности работы функций WinAPI, насколько я понимаю — поиск ведётся не только по длинным, но и по коротким именам.

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

ffs2001 13-03-2012 15:09 1878338

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

Iska 13-03-2012 16:05 1878370

ffs2001, приведите длинное имя файла «ПСКОВСК~1.DOC».

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

ffs2001 13-03-2012 17:17 1878421

Имя файла (например):
ПСКОВС~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 1878424

Цитата:

Цитата ffs2001
Имя файла (например):
ПСКОВС~1.doc (т.е. это и есть полное имя, и тильда там есть в любом отображении) »

Уверены?

Код:

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

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

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

ffs2001 13-03-2012 17:33 1878431

Ага. Спасибо.

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

Foreigner 13-03-2012 18:55 1878481

ffs2001,
Цитата:

отобрать файлы, у которых первым (а не любым) символом является тильда.
Пропускай через findstr
Код:

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

Iska 13-03-2012 19:52 1878529

Цитата:

Цитата ffs2001
…и длинным - очень длинным, с пробелами - кириллическим именем; »

Приведите здесь это имя.

ffs2001 13-03-2012 22:31 1878663

А, прошу прощения. Там не тильды, там дефисы. C тильдами всё попадает.

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

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

Iska 14-03-2012 07:39 1878817

Цитата:

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

Iska начинает биться головой об стену…

ffs2001 14-03-2012 11:42 1878940

Что не так?

Iska 16-03-2012 03:15 1880399

Из письма в PM:
Цитата:

Цитата ffs2001
Где можно прочесть об алгоритмах присвоения windows коротких имён? Нашёл только сведения о тильде в конце, и больше никакой конкретики.

В Базе Знаний: How Windows Generates 8.3 File Names from Long File Names. Информации по алгоритму генерации короткого имени по длинному кириллическому имени я не нашёл. Буду рад, если сие кому известно.

P.S. Кое-что на тему поиска и масок есть здесь: CMD/BAT - [решено] Пакетный файл для выборки из спика файлов текстовый(название и описание) (с чего сие для меня и началось — «Журден внезапно прозрел») и здесь: ANY: некоторые документированные особенности использования масок. Проблема, на самом деле, весьма серьёзная.

ffs2001 16-03-2012 14:48 1880672

К чему было битие головой о стену?

Iska 16-03-2012 15:34 1880696

ffs2001, от бессилия.

El Sanchez 16-03-2012 18:49 1880843


Цитата:

Цитата Iska
Информации по алгоритму генерации короткого имени по длинному кириллическому имени я не нашёл »

Iska, функция WINAPI GetShortPathName генерит короткие имена. Кириллические имена файлов возвращает в том виде, в котором возвращает их команда dir /x. Но в cmd.exe ее я не нашел, скорее всего используются FindFirstFileW/FindNextFileW со структурой _WIN32_FIND_DATA, одним из членов которой является переменная cAlternateFileName с коротким именем.

Iska 16-03-2012 20:12 1880871

Цитата:

Цитата El Sanchez
Iska, функция WINAPI GetShortPathName генерит короткие имена. »

El Sanchez, насколько я понимаю, функция GetShortPathName не генерирует, а читает и возвращает уже существующее в каталоге короткое имя для заданного файла. Что скажете?

Цитата:

Цитата El Sanchez
скорее всего используются FindFirstFileW/FindNextFileW… »

Угу, я и писал об этом:
читать дальше »
Цитата:

Цитата alexii
В данном случае (да и в прочих, о коих речь пойдёт ниже, тоже), похоже, следует винить функцию FindFirstFile Function (Windows):
Цитата:

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 1880918

Цитата:

Цитата Iska
насколько я понимаю, функция GetShortPathName не генерирует, а читает и возвращает уже существующее в каталоге короткое имя для заданного файла »

Iska, да, вы правы, проверил.

ffs2001 04-04-2012 02:05 1893015

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


Время: 19:48.

Время: 19:48.
© OSzone.net 2001-