кириллические имена файлов и маска ~*.*
Господа, такая проблема:
при отборе файлов в циклах for или подпрограмме forfiles с именами латиницей всё хорошо, а вот кириллические отбираются с тильдой на любом месте (например, ПСКОВСК~1.DOC считается соответствующим маске). Кто-нибудь сталкивался с такой проблемой? Поиск не помог.
|
Все сталкивались. Это короткие имена файлов и папок:
Таковы особенности работы функций 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"""
|
Цитата:
Цитата ffs2001
Имя файла (например):
ПСКОВС~1.doc (т.е. это и есть полное имя, и тильда там есть в любом отображении) »
|
Уверены?
Код:
C:\Песочница\0003>dir /x
…
13.03.2012 17:24 0 ~10E37~1.DOC ПСКОВС~1.doc
…
Отсюда — и попадание под Вашу маску.
|
Ага. Спасибо.
Однако в папке с этим файлом ещё масса таких же, "неявно" начинающихся с тильды. При этом в результаты поиска обоих циклов они не попадают (есть, например, файл с коротким именем ~301~.doc и длинным - очень длинным, с пробелами - кириллическим именем; условиям циклов он соответствует, а в результаты не попадает). С чем это связано?
|
ffs2001,
Цитата:
отобрать файлы, у которых первым (а не любым) символом является тильда.
|
Пропускай через findstr
Код:
for /f "tokens=*" %%i in (' "dir /b | findstr "^^~.*"" ') do echo %%i
|
Цитата:
Цитата ffs2001
…и длинным - очень длинным, с пробелами - кириллическим именем; »
|
Приведите здесь это имя.
|
А, прошу прощения. Там не тильды, там дефисы. C тильдами всё попадает.
То есть с тильды начинаются когда-то побитые имена.
Foreigner,
спасибо за подсказку. Правда, хотел делать через forfiles, т.к. через них проще работать с датой.
Жаль, спутали мне все карты эти короткие и битые имена...
|
Цитата:
Цитата ffs2001
…с тильды начинаются когда-то побитые имена. »
|
Iska начинает биться головой об стену…
|
К чему было битие головой о стену?
|
El Sanchez |
16-03-2012 18:49 1880843 |
Цитата:
Цитата Iska
Информации по алгоритму генерации короткого имени по длинному кириллическому имени я не нашёл »
|
Iska, функция WINAPI GetShortPathName генерит короткие имена. Кириллические имена файлов возвращает в том виде, в котором возвращает их команда dir /x. Но в cmd.exe ее я не нашел, скорее всего используются FindFirstFileW/FindNextFileW со структурой _WIN32_FIND_DATA, одним из членов которой является переменная cAlternateFileName с коротким именем.
|
Цитата:
Цитата 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, да, вы правы, проверил.
|
Собственно, та задача, из-за которой всё затевалось, решилась банально: более актуальной маской для задачи оказалась ~$*.* , а под неё ничего лишнего не попадает.
|
Время: 19:48.
© OSzone.net 2001-