Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Результат метода %Exists класса %File / 13 сообщений из 13, страница 1 из 1
13.12.2017, 15:22
    #39569065
П.С.М.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат метода %Exists класса %File
В 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 EDTUSER>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 ESTUSER>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 EDTUSER>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 версии?
...
Рейтинг: 0 / 0
13.12.2017, 15:28
    #39569072
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат метода %Exists класса %File
П.С.М. , вариант для Линукса

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
	;;; Существует файл 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
...
Рейтинг: 0 / 0
13.12.2017, 15:29
    #39569074
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат метода %Exists класса %File
Хотя это же у нас ГТ.М...

Т.ч. тебе не подойдет.
...
Рейтинг: 0 / 0
13.12.2017, 15:49
    #39569100
П.С.М.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат метода %Exists класса %File
krvsa,

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


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

Хотелось бы понять на кой меня метод проверки файла в заблуждение вводит)))
...
Рейтинг: 0 / 0
13.12.2017, 16:04
    #39569113
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат метода %Exists класса %File
Полагаю, есть какая то проблема с кодировкой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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
...
Рейтинг: 0 / 0
13.12.2017, 16:18
    #39569127
П.С.М.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат метода %Exists класса %File
DAiMorПолагаю, есть какая то проблема с кодировкой
Ага, похоже на правду. С $zcvt работает.
Спасибо)
...
Рейтинг: 0 / 0
14.12.2017, 00:05
    #39569314
eduard93
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат метода %Exists класса %File
Предлагаю проверить умолчания кодировок: 20593315
...
Рейтинг: 0 / 0
14.12.2017, 07:14
    #39569362
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат метода %Exists класса %File
П.С.М.,

Скорее всего нужно выправить кодировку для системных вызовов, она должна быть 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 после чего выходим.
...
Рейтинг: 0 / 0
15.12.2017, 09:38
    #39570121
П.С.М.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат метода %Exists класса %File
Ptn,

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
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
...
Рейтинг: 0 / 0
15.12.2017, 09:53
    #39570132
П.С.М.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат метода %Exists класса %File
Да и стоит ли вообще менять?
Если $zcvt в принципе хватает для решения проблемы (главное не забыть потом перед вызовом конвертировать в нужную кодировку) )))
...
Рейтинг: 0 / 0
15.12.2017, 10:07
    #39570141
П.С.М.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат метода %Exists класса %File
П.С.М.Если $zcvt в принципе хватает для решения проблемы
Дополню: код используется на одном боевом сервере и на паре тестовых, никуда более не распространяется, сервер работает. Также, вспомнил, что в некоторых местах еще используется $zcvt для имен файлов/папок. Т.е. изменение кодировки системных вызовов с RAW на UTF8 приведет к необходимости изменения кода уже использующего $zcvt для обращения к файлам. Т.ч. моем случае, наверное, менять и не стоит.
...
Рейтинг: 0 / 0
15.12.2017, 11:25
    #39570210
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат метода %Exists класса %File
П.С.М....на одном боевом сервере и на паре тестовых, никуда более не распространяется, сервер работает...У нас ситуация несколько иная: код работает на десятках рабочих серверов. Локализацию я контролирую полностью, но как раз этот параметр - System сall I/O table - менять бы не стал, ибо в системный вызов вполне могут передаваться уже закодированные (и не обязательно в UTF8) данные. Пусть лучше программист сам вызывает $zcvt(), когда надо.

Сам всё чаще использую $zcvt() в коде, предпочитая иметь на устройстве RAW: чем меньше код зависит от внешних факторов, тем спокойнее мой сон :) Выставить RAW на TCP/IP и File легко: всегда можно докопаться до параметров команды Open , а с System Calls сложнее, т.к. не очевидно, как здесь (временно) поменять таблицу на уровне процесса. Пусть лучше остаётся RAW forever.
...
Рейтинг: 0 / 0
15.12.2017, 14:45
    #39570356
П.С.М.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат метода %Exists класса %File
Alexey Maslov,

Спасибо, приму к сведению Ваш подход.
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Результат метода %Exists класса %File / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]