powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Результат метода %Exists класса %File
13 сообщений из 13, страница 1 из 1
Результат метода %Exists класса %File
    #39569065
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 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
Результат метода %Exists класса %File
    #39569072
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П.С.М. , вариант для Линукса

Код: 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
Результат метода %Exists класса %File
    #39569074
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя это же у нас ГТ.М...

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

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


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

Хотелось бы понять на кой меня метод проверки файла в заблуждение вводит)))
...
Рейтинг: 0 / 0
Результат метода %Exists класса %File
    #39569113
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полагаю, есть какая то проблема с кодировкой
Код: 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
Результат метода %Exists класса %File
    #39569127
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMorПолагаю, есть какая то проблема с кодировкой
Ага, похоже на правду. С $zcvt работает.
Спасибо)
...
Рейтинг: 0 / 0
Результат метода %Exists класса %File
    #39569314
eduard93
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаю проверить умолчания кодировок: 20593315
...
Рейтинг: 0 / 0
Результат метода %Exists класса %File
    #39569362
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П.С.М.,

Скорее всего нужно выправить кодировку для системных вызовов, она должна быть 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
Результат метода %Exists класса %File
    #39570121
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Результат метода %Exists класса %File
    #39570132
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и стоит ли вообще менять?
Если $zcvt в принципе хватает для решения проблемы (главное не забыть потом перед вызовом конвертировать в нужную кодировку) )))
...
Рейтинг: 0 / 0
Результат метода %Exists класса %File
    #39570141
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П.С.М.Если $zcvt в принципе хватает для решения проблемы
Дополню: код используется на одном боевом сервере и на паре тестовых, никуда более не распространяется, сервер работает. Также, вспомнил, что в некоторых местах еще используется $zcvt для имен файлов/папок. Т.е. изменение кодировки системных вызовов с RAW на UTF8 приведет к необходимости изменения кода уже использующего $zcvt для обращения к файлам. Т.ч. моем случае, наверное, менять и не стоит.
...
Рейтинг: 0 / 0
Результат метода %Exists класса %File
    #39570210
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П.С.М....на одном боевом сервере и на паре тестовых, никуда более не распространяется, сервер работает...У нас ситуация несколько иная: код работает на десятках рабочих серверов. Локализацию я контролирую полностью, но как раз этот параметр - System сall I/O table - менять бы не стал, ибо в системный вызов вполне могут передаваться уже закодированные (и не обязательно в UTF8) данные. Пусть лучше программист сам вызывает $zcvt(), когда надо.

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

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


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