Каталог с подкаталогами

Тема в разделе "Lotus + Java + LS2J", создана пользователем rinsk, 22 окт 2010.

  1. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    797
    Симпатии:
    78
    lmike - фи, как неспортивно!;) Я то уж думал че-ть на LS2J родится:)))

    от первоначального топика (Каталог с подкаталогами) - однозначно напрашивался рекурсивный вызов для раскрытия вложенных групп... Однако иногда можно обойтись и стеком - в первом примере кода эт указатель по динамическому массиву, во втором - баловство со строками:)
     
  2. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    да запросто :)
    тока 10-ть лет назад не было его ;)

    и ещё...
    мне совершенно не понятно - почему не используется рекурсия, для интерпретируемых языков - это обычная практика (ибо стек, формально, не ограничен)
     
  3. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    вот например изящный код (не мой - http://www.exampledepot.com/egs/java.io/TraverseTree.html) прикручивается к LS2J нараз (в process делаем вывод в ArrayList, по окончании преобразуем в String[])
    переделал на "динамику" и добавил метод для LS2J:
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='java'>import java.io.File;
    import java.util.ArrayList;

    public class DirProcess {
    private static ArrayList arrFiles=new ArrayList();

    public String[] Result() {
    String[] result = new String[arrFiles.size()];
    arrFiles.toArray(result);
    return result;
    }

    public void visitAllDirsAndFiles(String dir){
    arrFiles.clear();
    visitAllDirsAndFiles(new File(dir));
    }

    public void visitAllDirs(String dir) {
    arrFiles.clear();
    visitAllDirs(new File(dir));
    }

    private void process(File dir) {
    // TODO Auto-generated method stub
    System.out.println(dir);
    arrFiles.add(dir.toString());
    }

    public void visitAllDirsAndFiles(File dir) {
    process(dir);
    if (dir.isDirectory()) {
    String[] children = dir.list();
    for (int i = 0; i < children.length; i++) {
    visitAllDirsAndFiles(new File(dir, children));
    }
    }
    }

    // Process only directories under dir
    public void visitAllDirs(File dir) {
    if (dir.isDirectory()) {
    process(dir);
    String[] children = dir.list();
    for (int i = 0; i < children.length; i++) {
    visitAllDirs(new File(dir, children));
    }
    }
    }

    // Process only files under dir
    public void visitAllFiles(File dir) {
    if (dir.isDirectory()) {
    String[] children = dir.list();
    for (int i = 0; i < children.length; i++) {
    visitAllFiles(new File(dir, children));
    }
    } else {
    process(dir);
    }
    }

    public static void main(String args[]) {
    DirProcess dirproc=new DirProcess();
    dirproc.visitAllFiles(new File("myStartFolder"));
    }
    }[/CODE]
     
  4. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Особенность реализации LS-функции Dir - при попытке использовать её рекурсивно (Dir$ внутри Dir) вылетает ошибка "Illegal function call".
     
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    подправил класс
    и сделал рапер (DirProcess - имя джава либы):
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код LS2J</div></div><div class="sp-body"><div class="sp-content">
    Код (LotusScript):
    '********************************
    'library DirProcess.LS2J
    '********************************
    Option Public
    Option Declare
    Use "ErrorHandling"
    Uselsx "*lsxlc"
    Use "DirProcess"

    Const ERRBASE_DIRPROCESS=1130
    Private Const ERRLS2JINIT=ERRBASE_DIRPROCESS+1, CS_ERRLS2JINIT={ошибка инициализации класса Java}

    '********************************
    Class DirObj As ErrorHandlerWJ
    Private DirProcObj As JavaObject
    Private DirProcClass As JavaClass
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Sub New()
    On Error Goto errorhandler
    Set DirProcClass = jSession.GetClass("DirProcess")
    Set DirProcObj = DirProcClass.CreateObject
    ExitFunction:
    Exit Sub
    errorhandler:
    Call Me.RaiseError()
    Error ERRLS2JINIT, CS_ERRLS2JINIT
    End Sub
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Function Result() As Variant
    Result=DirProcObj.Result()
    End Function
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Sub VisitAllDirsAndFiles(startDir As String)
    On Error Goto errorhandler
    Call DirProcObj.visitAllDirsAndFiles(startDir)
    ExitFunction:
    Exit Sub
    errorhandler:
    Call Me.RaiseError()
    Resume ExitFunction
    End Sub
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Sub VisitAllDirs(startDir As String)
    On Error Goto errorhandler
    Call DirProcObj.visitAllDirs(startDir)
    ExitFunction:
    Exit Sub
    errorhandler:
    Call Me.RaiseError()
    Resume ExitFunction
    End Sub
    End Class
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код для проверки (агент, таргет - none)</div></div><div class="sp-body"><div class="sp-content">
    Код (LotusScript):
    Option Public
    Option Declare
    Use "DirProcess.LS2J"
    Sub Initialize
    Dim dirProc As New DirObj
    Call dirProc.visitAllDirs(".\data")
    Dim result
    result=dirProc.Result
    Forall m In result
    Print Cstr(m)
    End Forall
    End Sub
     
  6. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    public String[] Result() я бы сделал как private и дёргал бы из visitAllDirsAndFiles и visitAllDirs, и результат return'ом сразу же выдавал на гора.. а то что-то код разбух сильно.
    И имеет ли смысл класс на LS, который просто транслирует вызовы?

    Чуть попроще (вызовы потом будут покомпактнее):
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    %REM
    Library FS
    Description: функционал для работы с файловой системой
    %END REM
    Uselsx "*javacon"

    Private jSession As JavaSession
    Private jDirProcCls As JavaClass


    Private Function initDirProcess() As JavaObject
    On Error Goto ErrH
    Static jDirProcObj As JavaObject

    If jDirProcObj Is Nothing Then
    Set jSession = New JavaSession()
    Set jDirProcCls = jSession.GetClass("DirProcess")
    Set jDirProcObj = jDirProcCls.CreateObject
    End If

    Set initDirProcess = jDirProcObj
    Exit Function

    ErrH:
    'свой обработчик (по желанию)
    Exit Function
    End Function


    Public Function GetSubFiles(startDir As String)
    On Error Goto ErrH
    GetSubFiles = initDirProcess().visitAllDirs(startDir)
    Exit Function

    ErrH:
    'свой обработчик
    Exit Function
    End Function
     
  7. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    абисню :)
    -ф-ции обхода ФС "сбрасывают" массив, а использовать результат я могу захотеть неоднократно
    -инициализация джава объектов, при каждом вызове - мне не очень нра
    -класс хранит инстанс джава объекта и стало-быть - собственная жизнь (в рамках приложения), что бывает удобно (при одновременном использовании нескольких)
     
  8. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    если посмотреть - я одну ф-цию не обернул (только файлы - visitAllFiles) - это для самостоятельной работы, кто заинтересуется :)
    и LS класс можно дописать/переписать - сразу делать возврат резалта (ежели кому-то именно так надо)
     
  9. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    сразу в переменную результат взять и пользовать эту переменную сколько угодно?

    у меня в коде также происходит: Private в Declarations (можно не людить гл.пер, но в этом случае, по моему, это оправдано) и Static.
     
  10. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    так и есть - в ArrayList ...

    если пишем для джава - то былоб неоправдано не использовать и в др. сучностях java
    а "фиксировать" (в переменной) "неудобный" (String[]) объект, в джава - нет смысла (он для LS)...
    у ArrayList легко делается сортировка (а на выходе получим тотже String[]), и прочие прелести работы с List-ами
    со стороны LS - мы не можем передавать динамические массивы (в джава), с Variant - тоже много особенностей
    фиксация массива во врапере (в доп. переменной) будет лишней (нужно обнулять)

    др. словами - тек. реализация, ИМХО, удобна для модификации и параллельного использования (java и LS2J)
    а дальнейшая заточка (под свои взгляды/нужды) - дело пользующего :)
     
  11. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    lmike
    понЯл :(

    Тогда Java-класс я бы разбил на 2: базовый (для использования в Java) и наследуемый от него (для LS2J).
    ну или так бы уже делал:
    Код (Text):
    Public Function VisitAllDirsAndFiles(startDir As String) As Variant
    ...
    Call DirProcObj.visitAllDirsAndFiles(startDir)
    Me.VisitAllDirsAndFiles = DirProcObj.Result()
    ...
    End Function
    ...
     
Загрузка...
Похожие Темы - Каталог подкаталогами
  1. rinsk
    Ответов:
    11
    Просмотров:
    3.783
  2. lmike
    Ответов:
    17
    Просмотров:
    868
  3. acelash
    Ответов:
    2
    Просмотров:
    928
  4. Ekut
    Ответов:
    2
    Просмотров:
    1.310
  5. maksim-hub
    Ответов:
    3
    Просмотров:
    1.840

Поделиться этой страницей