Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
 Результат метода %Exists класса %File  [new]
П.С.М.
Member

Откуда: Из СССР
Сообщений: 448
В Cache под линуксом метод ##class(%File).Exists() возвращает 1 для имен с русскими буквами. Не зависимо от того, есть ли файл или нет.
Есть три версии Cache, на них и попробовал.
Cache for UNIX (SUSE Linux Enterprise Server for x86-64) 2016.2.1 (Build 803U) Wed Oct 26 2016 12:35:00 EDT
USER>w ##class(%File).Exists("a")
0
USER>w ##class(%File).Exists("b")
0
USER>w ##class(%File).Exists("c")
0
USER>w ##class(%File).Exists("а")
1
USER>w ##class(%File).Exists("б")
1
USER>w ##class(%File).Exists("в")
1


Cache for UNIX (SUSE Enterprise Server for x86-64) 2010.2.8 (Build 1104U) Sat Feb 11 2012 13:08:18 EST
USER>w ##class(%File).Exists("a")
0
USER>w ##class(%File).Exists("b")
0
USER>w ##class(%File).Exists("c")
0
USER>w ##class(%File).Exists("а")
1
USER>w ##class(%File).Exists("б")
1
USER>w ##class(%File).Exists("в")
1

А вот с виндовс всё норм.
Cache for Windows (x86-64) 2017.1 (Build 792U) Mon Mar 20 2017 19:13:14 EDT
USER>w ##class(%File).Exists("a")
0
USER>w ##class(%File).Exists("b")
0
USER>w ##class(%File).Exists("c")
0
USER>w ##class(%File).Exists("а")
0
USER>w ##class(%File).Exists("б")
0
USER>w ##class(%File).Exists("в")
0

Такое нормально для *nix версии?
13 дек 17, 15:22    [21030963]     Ответить | Цитировать Сообщить модератору
 Re: Результат метод %Exists класса %File.  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13021
П.С.М., вариант для Линукса

	;;; Существует файл File? Если да - вернет 1
	;;; [Параметр]
	;;; File* - полное имя файла
exFile(File)
	n ok
	s ok=$$com("find",File)
	q:$q $s(ok["No such file or directory":0,1:1)
	q
	;;; Выполнить линуксовую команду
	;;; [Параметр]
	;;; Com* - команда
	;;; Prm - параметры и опции
com(Com,Prm)
	n p,str
	s p="runCommand"
	s Com=$$At^zfunc(Com)
	s:$g(Prm)'="" Com=Com_" "_Prm
	i $l(Com)>250 q:$q 0 q
	o p:(COMMAND=Com:READONLY)::"PIPE"
	u p
	r str
	c p
	q:$q $s(str="":1,1:str)
	q
13 дек 17, 15:28    [21031002]     Ответить | Цитировать Сообщить модератору
 Re: Результат метод %Exists класса %File.  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13021
Хотя это же у нас ГТ.М...

Т.ч. тебе не подойдет.
13 дек 17, 15:29    [21031016]     Ответить | Цитировать Сообщить модератору
 Re: Результат метод %Exists класса %File.  [new]
П.С.М.
Member

Откуда: Из СССР
Сообщений: 448
krvsa,

Спасибо конечно, но через линуксовую команду я тоже могу))
Через $zf(-1), например:
$zf(-1,"test -f "_filename)

0 - найден
1 - не найден

Хотелось бы понять на кой меня метод проверки файла в заблуждение вводит)))
13 дек 17, 15:49    [21031091]     Ответить | Цитировать Сообщить модератору
 Re: Результат метод %Exists класса %File.  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno
Сообщений: 2536
Полагаю, есть какая то проблема с кодировкой
USER>!
sh-4.1# touch тест
sh-4.1# ls -la
total 312
drwxrwxr-x 3 root cacheusr 4096 Dec 13 13:02 .
drwxrwxr-x 21 root cacheusr 4096 Dec 13 13:00 ..
-rw-rw---- 1 root cacheusr 1048576 Dec 13 13:00 CACHE.DAT
-rw-rw---- 1 root cacheusr 33 Dec 13 12:57 cache.lck
drwxrwxr-x 2 root cacheusr 4096 Oct 28 21:23 stream
-rw-r--r-- 1 root cacheusr 0 Dec 13 13:02 ????????
sh-4.1# exit

USER>w ##class(%File).Exists($zcvt("тест","O","UTF8"))
1
USER>w ##class(%File).Exists($zcvt("тест1","O","UTF8"))
0
USER>w $zv
Cache for UNIX (Red Hat Enterprise Linux for x86-64) 2017.2 (Build 744U) Fri Sep 29 2017 11:06:08 EDT
13 дек 17, 16:04    [21031144]     Ответить | Цитировать Сообщить модератору
 Re: Результат метода %Exists класса %File  [new]
П.С.М.
Member

Откуда: Из СССР
Сообщений: 448
DAiMor
Полагаю, есть какая то проблема с кодировкой

Ага, похоже на правду. С $zcvt работает.
Спасибо)
13 дек 17, 16:18    [21031194]     Ответить | Цитировать Сообщить модератору
 Re: Результат метода %Exists класса %File  [new]
eduard93
Member

Откуда:
Сообщений: 152
Предлагаю проверить умолчания кодировок: 20593315
14 дек 17, 00:05    [21032338]     Ответить | Цитировать Сообщить модератору
 Re: Результат метода %Exists класса %File  [new]
Ptn
Guest
П.С.М.,

Скорее всего нужно выправить кодировку для системных вызовов, она должна быть UTF-8

Заходим в область %SYS запускаем программу do ^NLS, затем :

Выбираем 5) Advanced -> 1) Locale definitions

На запрос Select a locale : указываем rusw
После этого выбираем 5) Copy locale и указываем имя yruw, имя неслучайно, вводите именно такое

После создания yruw возвращаемся в прошлое меню (просто Enter без указания пункта),.
затем опять выбираем 1) Locale definitions

На запрос Select a locale : указываем yruw , так как это новая пользовательская локаль, появятся пункты для редактирования.
Выбираем 2) Edit locale -> 6) Defaults for input/output -> 7) System call

По умолчанию System call установлен в режим RAW, а нам нужен UTF8
Указываем его (пункт 2) и выходим Enter-ом из меню I/O Table
На запрос о сохранении изменений 1 changed property. Save? отвечаем yes

Выходим еще на уровень назад и проверяем установки выбрав 1) Display locale
После всех изменений должно быть так System call: UTF8

Выходим обратно до самого первого уровня, и выбираем 3) Change locale на запрос
Would you like to install a new locale? отвечаем yes, а на качестве локали
Select a locale указываем yruw

Проверяем настройки текущей локали 1) Display current locale после чего выходим.
14 дек 17, 07:14    [21032492]     Ответить | Цитировать Сообщить модератору
 Re: Результат метода %Exists класса %File  [new]
П.С.М.
Member

Откуда: Из СССР
Сообщений: 448
Ptn,

Спасибо за инструкцию. А что если просто для текущей локали
Current locale is: rusw (Russian, Russia, Unicode)
поменять для System call значение с RAW на UTF8?
+

NLS option? 2

1) Internal tables
2) I/O tables
3) CSP files
4) Date, time and number formats

Category of defaults? 2

Items marked with (*) represent the locale's original default

I/O table Current default
--------------------- --------------------

1) Process RAW (*)
2) Cache Terminal UTF8 (*)
3) Other terminal UTF8 (*)
4) File UTF8 (*)
5) Magtape UTF8 (*)
6) TCP/IP RAW (*)
7) System call RAW (*)
8) Printer CP1251 (*)

I/O table: 7

1) RAW (*)
2) UTF8
3) UnicodeLittle
4) UnicodeBig
5) CP1250
6) CP1251
7) CP1252
8) CP1253
9) CP1255
10) CP866
11) CP874
12) EBCDIC
13) KOI8R
14) Latin2
15) Latin9
16) LatinC
17) LatinG
18) LatinH
19) LatinT
15 дек 17, 09:38    [21035786]     Ответить | Цитировать Сообщить модератору
 Re: Результат метода %Exists класса %File  [new]
П.С.М.
Member

Откуда: Из СССР
Сообщений: 448
Да и стоит ли вообще менять?
Если $zcvt в принципе хватает для решения проблемы (главное не забыть потом перед вызовом конвертировать в нужную кодировку) )))
15 дек 17, 09:53    [21035832]     Ответить | Цитировать Сообщить модератору
 Re: Результат метода %Exists класса %File  [new]
П.С.М.
Member

Откуда: Из СССР
Сообщений: 448
П.С.М.
Если $zcvt в принципе хватает для решения проблемы

Дополню: код используется на одном боевом сервере и на паре тестовых, никуда более не распространяется, сервер работает. Также, вспомнил, что в некоторых местах еще используется $zcvt для имен файлов/папок. Т.е. изменение кодировки системных вызовов с RAW на UTF8 приведет к необходимости изменения кода уже использующего $zcvt для обращения к файлам. Т.ч. моем случае, наверное, менять и не стоит.
15 дек 17, 10:07    [21035896]     Ответить | Цитировать Сообщить модератору
 Re: Результат метода %Exists класса %File  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1509
П.С.М.
...на одном боевом сервере и на паре тестовых, никуда более не распространяется, сервер работает...
У нас ситуация несколько иная: код работает на десятках рабочих серверов. Локализацию я контролирую полностью, но как раз этот параметр - System сall I/O table - менять бы не стал, ибо в системный вызов вполне могут передаваться уже закодированные (и не обязательно в UTF8) данные. Пусть лучше программист сам вызывает $zcvt(), когда надо.

Сам всё чаще использую $zcvt() в коде, предпочитая иметь на устройстве RAW: чем меньше код зависит от внешних факторов, тем спокойнее мой сон :) Выставить RAW на TCP/IP и File легко: всегда можно докопаться до параметров команды Open , а с System Calls сложнее, т.к. не очевидно, как здесь (временно) поменять таблицу на уровне процесса. Пусть лучше остаётся RAW forever.
15 дек 17, 11:25    [21036175]     Ответить | Цитировать Сообщить модератору
 Re: Результат метода %Exists класса %File  [new]
П.С.М.
Member

Откуда: Из СССР
Сообщений: 448
Alexey Maslov,

Спасибо, приму к сведению Ваш подход.
15 дек 17, 14:45    [21037024]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить