Временный каталог

Тема в разделе "Lotus - Программирование", создана пользователем lmike, 23 дек 2015.

  1. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    жил был код (именно с маленькой буквы ;) )
    Код (LotusScript):
    %REM
    *--------------------------------------------
        Function GetNotesTempDirectory
        Description: CAPI для получения временного каталога notes
    %END REM

    Function GetNotesTempDirectory() As String
    ' Returns the path of the temporary directory used by Notes.
    ' Not same as system or user temp dir that you can get e.g. with Environ("TEMP") in Windows.
    ' Main reasons to use this instead: works crossplatform, and partitioned servers each need
    ' their own temp dir to avoid interfering with each other.
        Dim session As New NotesSession
        Dim d As String * 256
        Dim s%
        Select Case session.Platform
        Case "Linux"
            s% = linux_OSGetSystemTempDirectory(d)
        Case "Macintosh"
            s% = mac_OSGetSystemTempDirectory(d)
        Case "Windows/32"
            s% = w32_OSGetSystemTempDirectory(d)
        Case Else
            Error ERR_UNSUPPORTED_PLATFORM, "In GetNotesTempDirectory, platform not supported: " & session.Platform
        End Select
        GetNotesTempDirectory = Left$(d, s%)
    End Function
    и не задумывался я о его рабочести на серверах
    на вендядко он отрабатывал номана, но давеча - запусти я его в агенте на серванте
    а сервер был CentOS release 6.6 (Final)
    и чтобы вы думали - закозлило программное творение
    первый фуцк был в определении session.Platform, кот. выкатило UNIX
    сумкадраная (подумал я) и нахардкодил
    Код (LotusScript):
    Select Case UCase(session.Platform)
    Case {LINUX},{UNIX}:'{UNIX} from test on CentOS 6.5
    но не домина и здесь меня об..ла
    s% = linux_OSGetSystemTempDirectory(d) - получился 0 (да, Карл - ноль)
    пришлось еще нахардкодить
    Код (LotusScript):
     'temporary hardcoded
    If s%<1 Then d={/tmp}:s%=Len({/tmp})
    что обидно и некошерно
     
    2 пользователям это понравилось.
  2. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    @lmike, Dim d As String * 256
    это сделает строку сразу длинной 256 символов? Пробелами заполнит или пустая?
    Я потому что делал Space(256)
     
  3. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    чем заполнит не проверял (возможно нулями), но точно отобразится такой длины
    [DOUBLEPOST=1450870959,1450870889][/DOUBLEPOST]просто Dim d As String - это ""
    учитывая передачу как буфер в Си, 0 - наиболее вероятен
     
    #3 lmike, 23 дек 2015
    Последнее редактирование модератором: 23 дек 2015
  4. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    797
    Симпатии:
    78
    да много их там - напр: "Windows/64","Linux/64" ;)
     
  5. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    "беда" не в этом, а в том что определение Linux произошло как UNIX
     
  6. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    @lmike, а попробуй space(256) сделать, будет косяк или нет...
     
  7. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    ожидаемо
    Код (Text):
    24.12.2015 13:32:34   Agent printing: TempDir len: 0
    24.12.2015 13:32:34   Agent printing: TempDir>/tmp
    ведь это буфер, куда Сишная ф-ция пишет резат и возвращает длину записанного, а она 0
    а вот нарваться на переполнение в Сях - запросто, потому как 0 терминейтед стринги
     
    3 пользователям это понравилось.
  8. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    меня терзают смутные сомнения, что на серверах эта ф-ция (linux_OSGetSystemTempDirectory(d)) работает как-то иначе
    виндятского сервера нет и проверить не могу (лень ставить в виртуалку винду с домино сервантом)
     
  9. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    на win 32/64 работает как часы.
     
    2 пользователям это понравилось.
  10. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    спс, что проверил (именно на домине сервере, да?)
    остаются вопросы по вариантам ОС/настроек домины (я апгрейдился 7->8.5->9.0.1), где это не работатет
     
  11. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    да, у меня агент excel на серванте создает в эту папку.
    у нас было 852 (куча разных FP), потом 9,0,1 -> FP4
    Сейчас перевели на win2012/64, 901FP4 с нуля.
     
  12. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    В Linux и Windows всегда использую GetEnvironmentValue( "TEMP", True)
    Проблема с возвращаемой строкой бывает, когда нет доступа к этой переменной.
    Касательно разделителя пути - всегда использую "/"
    Для Lotusscript это не принципиально. c:\Lotus\data/db/test.nsf будет работать.
    Одно - такой путь не будет работать для java
     
  13. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    она не обязана быть определенной в линухах (у меня оно нигде не было определено)
    http://stackoverflow.com/questions/2435062/what-happened-to-the-tmp-environment-variable
    мало того, по спецификациям д.б. $TMPDIR (но и его часто нет)
    не будет проблем, вплоть до вызова внешнего приложения, в винде ;), с таким путем
    я тоже предпочитаю "правильный" слэш
    описанный в топики подход хорош тем - что не гадит в общесистемный темп (у нотусни-то он свой)и как следствие - не зависит от загаженности его же
    к тому же, в линухах /tmp часто на рутовой точке монтирования, а она привязана в "маленькому" разделу, а домина не чистит темп (со всеми вытекающими) в ходе работы (автоматически)
     
  14. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Ну мы делаем так.. первым берем системный TEMP, если его нет - то берем каталог DATA и там создаем TEMP.
    Но в таком случае да - TEMP надо чистить :(
     
  15. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    @NickProstoNick,
    @lmike,

    Код (Java):
     public String tempdir() {
    String tempdir = System.getProperty("java.io.tmpdir");
    if ( !(tempdir.endsWith("/") || tempdir.endsWith("\\")) )
    tempdir = tempdir + System.getProperty("file.separator");
    return tempdir;
    }
    долго, но универсально.
     
  16. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    да это понятно. Я говорил о том, что для Lotusscript не нужно приводить строку к одному разделителю. Можно использовать прямой слэш для формирования строки в Windows
     
  17. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    А почему не
    Код (Java):

    String tempdir = System.getProperty("java.io.tmpdir");
    String sep = System.getProperty("file.separator");
    if (!tempdir.endsWith(sep)){
       tempdir = tempdir + sep;
       return tempdir;
    }
     
    ?
    или даже
    Код (Java):

    String tempdir = System.getProperty("java.io.tmpdir");
    String sep = System.getProperty("file.separator");
    return !tempdir.endsWith(sep) ?  tempdir.concat(sep) : tempdir;
     
     
    2 пользователям это понравилось.
  18. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    с java все несколько хитрее http://stackoverflow.com/questions/1924136/environment-variable-to-control-java-io-tmpdir
    эта переменная может переопределяться
    но возня с системным темпом не отменяется
    есть класс (стыжженый откуда-то ), он опирается на код топика, но может "чистить"
    Код (LotusScript):
    %REM
    *********************************************
        Class TempFolderManager
        Description: создание и удаление временных файлов
    %END REM

    Class TempFolderManager As ErrorHandlerWJ
        m_path As String
        m_files List As Integer
        Private sep As String
        Private ZipClass As Javaclass
     
        Function Unique As String
            Dim unik
            unik = Evaluate("@Unique")
            Unique = StrToken(unik(0), "-", -1) ' drop the username part of the ID which is always the same for this user
        End Function
     
        Sub New
            On Error GoTo ErrH
            Set ZipClass = jSession.GetClass("org.files.ZipUtil")
            sep=ZipClass.fs_sep()
            m_path = GetNotesTempDirectory & sep & Unique
            MkDir m_path
    Quit:
            Exit Sub
    ErrH:
            Error Err, RaiseError
        End Sub
     
        Public Property Get Path As String
            Path = m_path
        End Property
     
        Function NewFilename(ByVal strSuffix$, ByVal bManage As Boolean) As String
            Dim strFName$
            strFName = Unique
            If Len(strSuffix) > 0 Then strFName = strFName & "." & strSuffix
            NewFilename = m_path & sep & strFName
            If bManage Then
                m_files(NewFilename) = 0
            End If
        End Function
     
        Sub Manage(ByVal strPath$)
            m_files(strPath) = 1
        End Sub
     
        Sub Unmanage(ByVal strPath$)
            On Error Resume Next
            Erase m_files(strPath)
        End Sub
     
        Function ClearFiles( ) As Boolean
            ' erase all files under management but leave the directory so that we can use it more.
            ' return True if all files were successfully erased.
            On Error GoTo failed
            ClearFiles = True
            ForAll ffileno In m_files
                Kill ListTag(ffileno)
    nextFile:
            End ForAll
            Erase m_files
            Exit Function
    failed:
            ClearFiles = False
            Resume nextFile
        End Function
     
        Sub Delete
            On Error Resume Next
            If ClearFiles Then RmDir m_path
        End Sub
    End Class
    ну и
    Код (LotusScript):
            Set ZipClass = jSession.GetClass("org.files.ZipUtil")
             sep=ZipClass.fs_sep()
    надо заменить на System.getProperty("file.separator");типа
    Код (LotusScript):
    Set SysClass=jSession.GetClass({java.lang.System})
     
    sep=SysClass.getProperty("file.separator")
     
    #18 lmike, 11 янв 2016
    Последнее редактирование модератором: 11 янв 2016
Загрузка...

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