Форум » [x]Harbour » Пара простых вопросов ;) » Ответить

Пара простых вопросов ;)

Dima: 1. Как узнать что путь к папке из которой запускается программа имеет символы кирилицы ? На ум приходит такой способ [pre2] proc main() local a REQUEST HB_LANG_RU866 HB_LANGSELECT("RU866") REQUEST HB_CODEPAGE_RU866 hb_cdpSelect( "RU866" ) a:=curdir() ? a if hb_oemtoansi(a)#a ? "Есть кирилица" endif wait RETURN NIL [/pre2] Есть еще метода ? 2. Как узнать что путь к папке из которой запускается программа имеет длинные имена ? На вскидку приходит вариант разбить на токены с разделителем "\" и затем чекать длины всех токенов. Есть еще метода ?

Ответов - 85, стр: 1 2 3 4 5 All

Dima: up

Haz: Dima пишет: up 1 проверить на ASC коды весь путь , если есть ASC кроме латинских то... 2 не помню на вскидку фенкцию ((( но есть точно - та что получает короткое имя и если есть в пути длинные - тто длинна будет разной и в короткой версии будет знак тильда

Dima: понял , затестю завтра. спасибо !


Haz: Dima пишет: не помню на вскидку фенкцию cShot := GETSHORTFILENAME( cLongName ) ============================================= #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HB_FUNC( GETSHORTFILENAME ) { char pszReturn[ MAX_PATH ] ; pszReturn[0]= '\0' ; GetShortPathName( hb_parcx( 1 ), pszReturn, MAX_PATH - 1 ) ; hb_retc( pszReturn ) ;

Haz: проверить на ASC коды весь пут Примерно так #require "hbxpp" #include "hbxpp.ch" FUNC Main( ... ) local n := 0 local cParh := "" local lFound := .F. REQUEST HB_CODEPAGE_RU1251 hb_cdpSelect( "RU1251" ) ? cPath := hb_argV(1) ? FOR n := 1 TO LEN(cPath) IF ASC(cPath[n]) > 127 lFound := .T. ? cPath[n] EXIT END END RETURN NIL

Dima: Игорь спасибо ! А такая проверка думаешь будет не правильной ? [pre2] a:=curdir() ? a if hb_oemtoansi(a)#a ? "Есть кирилица" endif [/pre2]

Dima: Haz пишет: cShot := GETSHORTFILENAME( cLongName ) что то она пустую строку выдает [pre2] proc main() ? GETSHORTFILENAME(curdir()) // пусто ? GETSHORTFILENAME() // пусто ? GETSHORTFILENAME("bla bla bla bla bla bla bla bla bla bla ") // пусто wait RETURN NIL *cShot := GETSHORTFILENAME( cLongName ) *============================================= #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HB_FUNC( GETSHORTFILENAME ) { char pszReturn[ MAX_PATH ] ; pszReturn[0]= '\0' ; GetShortPathName( hb_parcx( 1 ), pszReturn, MAX_PATH - 1 ) ; hb_retc( pszReturn ) ; } #pragma ENDDUMP [/pre2]

Haz: Dima пишет: А такая проверка думаешь будет не правильной ? не проверял , но должна работать , возможно дольше на пару микросекунд из-за преобразования

Haz: Dima пишет: что то она пустую строку выдает у меня работает проверял так ? GetShotFilename( Exename() ) CurDir() - возвращаяет не имя файла попробуй Directory()[1][1] вот это точно ничего не покажет т.к. файла нет GETSHORTFILENAME("bla bla bla bla bla bla bla bla bla bla ")

Dima: Haz пишет: ? GetShotFilename( Exename() ) OK. Понял. Если запустить из папки в имени которой есть кирилица то вернет пустую строку

Haz: Dima пишет: Если запустить из папки в имени которой есть кирилица то вернет пустую строку GetShotFilename( Exename() ) проверил - с кирилицей тож работает нормально отсюда запустил C:\Командировки\Документация>Ais_Zpto.exe во что выдало C:\C7BA~1\F63B~1\Ais_Zpto.exe

Dima: Ага. Это я кодовую страницу не указал. Если указать RU1251 - то все нормально Если указать RU866 - то тоже пусто Получается что обе проверки можно свести к одному условию. Если GetShortFilename( Exename() ) не равно Exename() то с путем что то не то.

Dima: Остановился на такой проверке [pre2] Func TestPath(cpath) local ret:=.t. local n FOR n=1 TO LEN(cPath) IF ASC(substr(cPath,n,1)) > 127 .or. ASC(substr(cPath,n,1))==32 ret:= .f. EXIT END next return ret [/pre2]

Haz: Dima пишет: Остановился на такой проверке Этот вариант проверяет наличие расширенных ASC кодов ( русские буквы ) , а зачем там == 32 ? Если для проверки длинного имени, то оно мжет быть и без пробелов Dima пишет: ASC(substr(cPath,n,1) можно заменить на ASCPOS( cPath. n), хотя мне больше нравится вариант работы со строкой как с массивом cPath[n] а в чем вообще суть проблемы , чем тебе помешали русские буквы и длинные пути ?

Dima: Haz пишет: а в чем вообще суть проблемы , чем тебе помешали русские буквы и длинные пути ? а косяки возникают при приеме / передаче файлов на фтп из проги.

Dima: Haz пишет: со строкой как с массивом cPath[n] этот вариант у меня ошибку бьет. local a:="12345" ? a[3] //Error BASE/1068 Argument error: array access wait

Haz: Dima пишет: тот вариант у меня ошибку бьет. нужно это #require "hbxpp" #include "hbxpp.ch" и это hbxpp.lib

Dima: Haz пишет: нужно это #require "hbxpp" #include "hbxpp.ch" Упс. Заработало.

Dima: еще простой вопрос ;) Есть ли такая функция , что бы вернула подстроку из строки , находящуюся между 2 - мя подстроками ? Например есть строка MN_20.3456.ZIP Нужно что типа вот такой фунции xxx("MN_20.3456.ZIP","MN_",".ZIP") // должна вернуть 20.3456 Понятно что можно сделать с помощью Substr,At,Rat.

Haz: Dima пишет: Понятно что можно сделать с помощью Substr,At,Rat. может так ? cString := MN_20.3456.ZIP cRegExp := "MN_|\.ZIP" ? hb_RegExSplit( cRegExp , cString)[2]



полная версия страницы