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

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

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

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

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

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

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

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

Может заодно подскажете как относительный путь до файла превратить в гиперссылку?
Чтобы не было проблем с русскими буквами и пробелами в путях.
...
Рейтинг: 0 / 0
30.04.2011, 23:38
    #37241721
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прочитать список файлов в COS
У меня никаких ошибок не возникает (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
05.05.2011, 09:42
    #37246610
Станислав Вл.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прочитать список файлов в COS
servit,

Спасибо за помощь.
...
Рейтинг: 0 / 0
05.05.2011, 17:18
    #37248002
Станислав Вл.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прочитать список файлов в COS
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
05.05.2011, 17:42
    #37248082
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прочитать список файлов в COS
попробуйте вместо escapeurl сделать EscapeHTML или $zcvt(text,"O","HTML")
...
Рейтинг: 0 / 0
05.05.2011, 18:09
    #37248153
gr_vl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прочитать список файлов в COS
Может єто и не спортивно, но однозначно проще :)
s url=$tr(url,"\","/")
...
Рейтинг: 0 / 0
05.05.2011, 18:13
    #37248167
Станислав Вл.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прочитать список файлов в COS
Блок А.Н.,

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

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

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

Мне надо было сгенерить правый кусок 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
06.05.2011, 20:21
    #37250271
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прочитать список файлов в COS
Станислав Вл.Как в 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
11.05.2011, 15:42
    #37255268
Станислав Вл.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прочитать список файлов в COS
Блок А.Н.,

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

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

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

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

Второй(условие - обязательно должна быть сортировка однозначная сортировка) - запоминать последнюю запись, вернее, ее параметры для сортировки, и следующую страницу выбирать, используя дополнительные условия, которые исключат попадание предыдущих страниц. При этом варианте мы не сможем определить, сколько у нас всего страниц, но он значительно менее затратный, чем первый.
...
Рейтинг: 0 / 0
12.05.2011, 10:09
    #37256371
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прочитать список файлов в COS
Развитие второго варианта - при одинаковой сортировке запоминать количество ранее выгруженных записей или номер страницы
Что-то вроде такого:
Код: 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
13.05.2011, 14:48
    #37259252
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прочитать список файлов в COS
Можно воспользоваться компонентами <tableNavigatorBar> и <tablePane> с включённым режимом Snapshot .
...
Рейтинг: 0 / 0
17.05.2011, 10:10
    #37264086
Станислав Вл.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прочитать список файлов в COS
doublefint,

Спасибо за подробные ответы. Буду пробовать.
...
Рейтинг: 0 / 0
12.07.2011, 05:01
    #37347136
Аленочка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прочитать список файлов в COS
а вот интересно. можно ли использовать запрос 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
12.07.2011, 08:18
    #37347191
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прочитать список файлов в COS
Аленочка ,

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


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