powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как прочитать список файлов в COS
23 сообщений из 23, страница 1 из 1
Как прочитать список файлов в COS
    #37241306
Станислав Вл.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть задача приделать web интерфейс к куче файлов в отдельном каталоге.
Хотелось бы получить список относительных или абсолютных путей для всех файлов в папке и подпапках.

Нашёл вот такой кусок кода в примерах

// get list of files via result set
Set rs=##class(%ResultSet).%New("%File.FileSet")
Do rs.Execute(dir,"*.csp")

Но отсутствие документации на %File.FileSet не очень вдохновляет.
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37241381
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FileSet - это запрос, а не метод, поэтому правильно так:

set rs=##class(%ResultSet).%New("%File:FileSet")

Также Вам могут пригодиться готовые ZEN-компоненты:
%ZEN.Dialog.fileSelect

%ZEN.Component.fileUpload
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37241686
Станислав Вл.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,

Спасибо, разобрался.
Что странно, если выгружать имена файлов в %ResultSet то всё нормально. А если в %SQL.Statement ошибка. Дескать юзер не имеет прав доступа.

Может заодно подскажете как относительный путь до файла превратить в гиперссылку?
Чтобы не было проблем с русскими буквами и пробелами в путях.
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37241721
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня никаких ошибок не возникает (2011.1.FT2):

ClassMethod Test() As %Status [ ZenMethod ]
{
  #dim ex As %Exception.AbstractException
  
  try{
    set st = ##class(%SQL.Statement).%New()
    $$$ThrowOnError(st.%PrepareClassQuery("%File","FileSet"))
    set rs = st.%Execute(,"*.txt")
    while rs.%Next() {
      do rs.%Print()
    } 
  }catch ex{
    write $system.Status.GetErrorText(ex.AsStatus(),"ru"),!
  }
  quit $$$OK
}

}

Для обработки имени файла используйте методы:
%File :
NormalizeDirectory
NormalizeFilename
NormalizeFilenameWithSpaces
...

%CSP.Page :
EscapeURL
Link
...
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37246610
Станислав Вл.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,

Спасибо за помощь.
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37248002
Станислав Вл.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,

Попытал я перечисленные методы.
И нарисовалась вот какая проблема.
У меня win машина и она генерит пути со слешем наклоненным в другую сторону. Методы EscapeURL и Link тупо кодируют обратные слеши хотя между ними имена папок которые очень даже нужно сохранить.

Допустим есть путь \Icons\IISS.52\table_properties_zoom_128.png
EscapeURL делает из него %5CIcons%5CIISS.52%5Ctable_properties_zoom_128.png
Когда мне по идее надо только слеши в обратную сторону повернуть чтоб можно было сгенерить ссылку на указанный файл.
Получается надо парсить путь к файлу менять там слеши и потом подавать это на EscapeURL?
Есть вариант проще? Типа скормил данный путь методу, а он выдаёт URL до папки или кусок URL?
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37248082
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте вместо escapeurl сделать EscapeHTML или $zcvt(text,"O","HTML")
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37248153
gr_vl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может єто и не спортивно, но однозначно проще :)
s url=$tr(url,"\","/")
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37248167
Станислав Вл.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.,

В обоих случаях возвращается путь который вводил.
Ещё будут варианты?
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37248172
gr_vl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя везде сам использую
s fn=..EscapeURL(fn)
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37248176
Станислав Вл.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gr_vl,

По тупому перевернуть слеши :)
Попробую так. Наверное получиться.
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37248359
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав Вл.В обоих случаях возвращается путь который вводил.
Ещё будут варианты?
Ну видимо я неправильно понял вашу цель.
Мне непонятна проблема, по-моему, логично хотеть увидеть тот путь, который вводили.
Если вам нужно передать путь через парамерт url, то вам нужно делать через EscapeURL/UnescapeURL.
Если вам нужно перевернуть слеши, то нужно использовать $tr.
А если вам нужно в html отобразить пути без ошибок, то нужно использовать EscapeHTML.
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37249126
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
посмотрите в %File
есть методы
NormalizeFilename()
NormalizeDirectory()
NormalizeFilenameWithSpaces()

может оно поможет
в кодах можно посмотреть параметры и т.д.
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37250244
Станислав Вл.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.,

Мне надо было сгенерить правый кусок URL с именами папок из полного пути.
Того что сказано хватило. Спс.

Есть новый вопрос.
Как в embedded sql обозначить условие where при котором левый операнд может включать часть правого(строку).

&sql(DECLARE Count CURSOR FOR SELECT COUNT (ID) INTO :count FROM "Contacts" WHERE Name %CONTAINS(:str)

Т.е. нужны все контакты у которых поле Nаme включает значение переменной str

При компиляции вылазит ошибка -472 "Ожидалось свойство коллекции".
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37250271
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав Вл.Как в embedded sql обозначить условие where при котором левый операнд может включать часть правого(строку).
&sql(DECLARE Count CURSOR FOR SELECT COUNT (ID) INTO :count FROM "Contacts" WHERE Name %CONTAINS(:str)

попробуйте (не проверял)
Код: plaintext
&sql(DECLARE Count CURSOR FOR SELECT COUNT (ID) INTO :count FROM "Contacts" WHERE Name [ :str)
Код: plaintext
1.
s str="%"_str_"%"
&sql(DECLARE Count CURSOR FOR SELECT COUNT (ID) INTO :count FROM "Contacts" WHERE Name like :str)
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37255268
Станислав Вл.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.,

Работают оба варианта, но первый в 3-и раза быстрее второго.

Такой вопрос. Надо выводить постранично контент в html.
Типа как в поисковиках обозначаются множество страничек с результатом запроса.

Вопрос в том как мне узнать с какого ID начинаются вторые 100 строк датасета, третьи и т.д?
Чтобы извлекать вторые и третьи странички результатов.
Желательно так чтобы такое можно было описать встроенным sql, а не динамическим.
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37255408
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тут я вижу два варианта.

Первый - пройтись по всем страницам и результат сохранить куда-нибудь, а потом при выборе страницы выбирать данные выбраной страницы.

Второй(условие - обязательно должна быть сортировка однозначная сортировка) - запоминать последнюю запись, вернее, ее параметры для сортировки, и следующую страницу выбирать, используя дополнительные условия, которые исключат попадание предыдущих страниц. При этом варианте мы не сможем определить, сколько у нас всего страниц, но он значительно менее затратный, чем первый.
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37256371
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Развитие второго варианта - при одинаковой сортировке запоминать количество ранее выгруженных записей или номер страницы
Что-то вроде такого:
Код: 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.
///Вывести <var>page</var> порцию из <var>rpp</var> (row per page) записей 
ClassMethod WritePage(page as %Integer= 1 , rpp as %Integer= 100 ) {
 &sql(Select Count(*) Into :rows From My.TestData)
 s pages=rows\rpp ;полных страниц по rpp записей
 if ((rows#rpp)> 0 ) pages=pages+ 1  ;учитываем неполную страницу 
 
 ;Теперь проверки 
 ;if page>page и т.д.

 s stop=(page+ 1 )*rpp, start=stop-rpp ;начало и конец выгружаемой порции 
 
 ;Собственно выгрузка 
 &sql(Declare rs Cursor For 
  Select ID Into :id From My.TestData Order By ID
 ) &sql(Open rs)

 for { &sql(Fetch rs) Quit:SQLCODE
    if %ROWCOUNT<start continue   ;еще нет
    if %ROWCOUNT>stop Quit   ;уже нет
    
    d ..WriteRecord(id) ;само то
   
 } &sql(Close rs)

}
///Вывод одной записи по id
ClassMethod WriteRecord(id as %String)  as %String{
  &html<<div id='id'>Запись ID:#(id)#</div>>  Q ""
}


...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37259252
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно воспользоваться компонентами <tableNavigatorBar> и <tablePane> с включённым режимом Snapshot .
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37264086
Станислав Вл.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefint,

Спасибо за подробные ответы. Буду пробовать.
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37347136
Фотография Аленочка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вот интересно. можно ли использовать запрос FileSet в tablePane..?
я вот тут что-то типа такого накидала, ошибки нет, но и записей не возвращает:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<tablePane id="table" 
showQuery="true" 
bodyHeight="10em" 
fixedHeaders="true" 
maxRows="50" 
queryClass="%File" 
queryName="FileSet"
dataSource="columns"
>
<parameter value="C:\UPLOAD\"/>
<parameter value="*.jpg"/>
<column header="Файл" colExpression="Name" />
<column header="Тип" colExpression="Type" />  
</tablePane>

при всем при этом, вот такой зен-метод правильно считает кол-во файлов в той же директории

Код: plaintext
1.
2.
3.
4.
5.
ClassMethod sGetFilesCountInDirectory(directory As %String, blId As %String) As %Integer [ ZenMethod ]
{
	set rs = ## class (%ScrollableResultSet).% New ("%File:FileSet")
	 do  rs.Execute(directory,"*.jpg")
	quit rs.Count()
}
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37347191
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аленочка ,

Следующий пример у меня работает (2011.1.RC1):

Class sql.ru Extends %ZEN.Component.page
{

/// Имя приложения, которому принадлежит эта страница.
Parameter APPLICATION;

/// Отображаемое имя для нового приложения.
Parameter PAGENAME;

/// Домен, используемый для локализации.
Parameter DOMAIN;

/// Этот блок Style содержит определение CSS-стиля страницы.
XData Style
{
<style type="text/css">
</style>
}

/// Этот XML блок описывает содержимое этой страницы.
XData Contents [ XMLNamespace = " http://www.intersystems.com/zen"  ]
{
<page xmlns=" http://www.intersystems.com/zen"  title="">
  <tablePane
    id="table" 
    showQuery="true" 
    bodyHeight="10em" 
    fixedHeaders="true" 
    maxRows="50" 
    queryClass="%Library.File" 
    queryName="FileSet"
    dataSource="columns"
  >
    <parameter value="C:\UPLOAD\"/>
    <parameter value="*.jpg"/>
    <parameter value=""/>
    <parameter value="0"/>
    <parameter value=";"/>
    <column header="Файл" colName="Name" />
    <column header="Тип" colName="Type" />  
  </tablePane>
</page>
}

}
...
Рейтинг: 0 / 0
Как прочитать список файлов в COS
    #37347891
Фотография Аленочка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо, значит получается что нужно указывать все параметры..
хотя странно: в документации класса 3 последних параметра выставлены по дефолту, поэтому думалось что и указывать их не обязательно.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как прочитать список файлов в COS
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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