Решено Свободное место

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

  1. R4z0R

    R4z0R Well-Known Member

    Регистрация:
    6 авг 2009
    Сообщения:
    166
    Симпатии:
    0
    Можно ли из скрипта LS узнать сколько свободного места осталось на диске С?
     
  2. Domino-Designer

    Domino-Designer Lotus team
    Lotus team

    Регистрация:
    6 дек 2011
    Сообщения:
    117
    Симпатии:
    4
    На LS - Нет.

    но добавив LS2JAVA

    Код (Java):
    import java.io.File;
     
    public class GetDiskSpace {
     
     /**
     * This sample source code shows
     * how to check the disk space of a partition using java
     * Property of teknoscope.com
     * All Rights Reserved
     * Version 1.0
     * 08/25/2012
     */

     public static void main(String[] args) {
     File f = new File("C:\\");
     System.out.println("Printing the total space");
     System.out.println(f.getTotalSpace() +" bytes");
     System.out.println(f.getTotalSpace()/1000.00 +" Kilobytes");
     System.out.println(f.getTotalSpace()/1000000.00 +" Megabytes");
     System.out.println(f.getTotalSpace()/1000000000.00 +" Gigabytes");
     System.out.println("----------------------------");
     System.out.println("Printing the free space");
     System.out.println(f.getFreeSpace() +" bytes");
     System.out.println(f.getFreeSpace()/1000.00 +" Kilobytes");
     System.out.println(f.getFreeSpace()/1000000.00 +" Megabytes");
     System.out.println(f.getFreeSpace()/1000000000.00 +" Gigabytes");
     }
     
    }
    Printing the total space
    320070479872 bytes
    3.20070479872E8 Kilobytes
    320070.479872 Megabytes
    320.070479872 Gigabytes
    ----------------------------
    Printing the free space
    271363801088 bytes
    2.71363801088E8 Kilobytes
    271363.801088 Megabytes
    271.363801088 Gigabytes


    Или другим способом.
     
  3. erdi

    erdi Well-Known Member

    Регистрация:
    20 авг 2008
    Сообщения:
    261
    Симпатии:
    36
    ну почему же?
    Код (LotusScript):
     Dim fso As Variant
    Dim text, fsp As String
     
    Set fso = CreateObject("Scripting.FileSystemObject")
    text = ""
     
    Forall d In fso.Drives
    If d.DriveType = 2 Then
    If d.IsReady Then
    fsp = Round(d.AvailableSpace / 1024 / 1024 / 1024, 2)
    text = text & "Drive " & d.DriveLetter & ": - free space " & fsp & " Gb." & Chr(10)
    End If
    End If
    End Forall
     
    If text <> "" Then
    Msgbox text
    End If
     
  4. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    да уж извращенцы
    а что через доминошную статистику снять не можете?
     
  5. R4z0R

    R4z0R Well-Known Member

    Регистрация:
    6 авг 2009
    Сообщения:
    166
    Симпатии:
    0
    работает! Только мне нужна одна цифра - диска, где находится Дата. Это просто продолжение "архивной темы". Нужно в целом чтобы юзер нажал кнопку, скрипт проверил хватит ли места на диске и создал локальную реплику архива.
     
  6. R4z0R

    R4z0R Well-Known Member

    Регистрация:
    6 авг 2009
    Сообщения:
    166
    Симпатии:
    0
    допилил, спасибо erdi! Тема закрыта
     
  7. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    и получим отлуп по секьюрити нотусевой жвм
    как мы его не получим:
    Код (Java):
    import java.io.File;
    import org.apache.commons.io.FileSystemUtils;
    import lotus.domino.*;
     
    public class JavaAgent extends AgentBase {
     
        public void NotesMain() {
     
          try {
              Session session = getSession();
              AgentContext agentContext = session.getAgentContext();
     
              // (Your code goes here)
     
              File[] paths;
     
              // returns pathnames for files and directory
              paths = File.listRoots();
     
              // for each pathname in pathname array
              for(File path:paths)
              {
                  // prints file and directory paths
                  System.out.println("Drive Name: "+path);
                  System.out.println("FreeSpace: "+FileSystemUtils.freeSpaceKb(path.toString()));
              }
     
     
          } catch(Exception e) {
              e.printStackTrace();
           }
       }
    }
    теперь по ответу @erdi, ну зачем опять КОМ? вот ничем не сложнее:
    Код (LotusScript):
    Sub Initialize
        On Error GoTo ErrH
    Dim jsession As New Javasession
    Dim FSUTIL As Javaclass
    Dim FILE As Javaclass
    Set FSUTIL=jsession.Getclass({org/apache/commons/io/FileSystemUtils})
        Set FILE=jsession.Getclass({java/io/File})
        Dim drives
        drives=FILE.listRoots()
        ForAll path In drives
            Dim st As String
            st=path.toString()
            Print {Drive Name: } st
            Print {FreeSpace: } FSUTIL.freeSpaceKb(st)
        End ForAll
    Quit:
        Exit Sub
    ErrH:
        Error Err, RaiseError
    End Sub
     
  8. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    770
    Симпатии:
    50
    Код (LotusScript):

    Public Type LargeInt
      lngLower As Long
      lngUpper As Long
    End Type
     
    Declare Function GetDiskFreeSpaceEx Lib "kernel32.dll" Alias "GetDiskFreeSpaceExA" _
    (ByVal lpDirectoryName As String, lpFreeBytesAvailableToCaller As LargeInt,  _
    lpTotalNumberOfBytes As LargeInt, lpTotalNumberofFreeBytes As LargeInt) As Long
     
    Public Function FreeDiskSpace(ByVal sDriveLetter As String) As Double
        Dim udtFreeBytesAvail As LargeInt, udtTtlBytes As LargeInt
        Dim udtTTlFree As LargeInt
        Dim dblFreeSpace As Double
        If GetDiskFreeSpaceEx(sDriveLetter, udtFreeBytesAvail, udtTtlBytes, udtTTlFree) Then
            If udtFreeBytesAvail.lngLower < 0 Then
                dblFreeSpace = udtFreeBytesAvail.lngUpper * 2 ^ 32 + udtFreeBytesAvail.lngLower + 4294967296#
            Else
                dblFreeSpace = udtFreeBytesAvail.lngUpper * 2 ^ 32 + udtFreeBytesAvail.lngLower
            End If
        End If
        FreeDiskSpace = dblFreeSpace
    End Function
     
    использование:
    Код (LotusScript):

    Dim FreeSpace As Double
    FreeSpace = FreeDiskSpace("C:\")
    Print CStr(FreeSpace)
     
     
  9. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    это не лучше КОМы
     
  10. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    по аналогии с Win API можно использовать Notes API для получения серверной статистики с помошью StatQuery()
    Код (LotusScript):
    Option Public
    Option Explicit
     
     
     
     
    %REM
    Агент демонстрирует как получить информацию о сервере или рабочей станции
    используя вызовы Notes API. Вы получите только часть информации, если
    будете вызывать функции на деслтопе, также попробуйте их использовать
    на сервере для получения подробной информации.
     
     
     
     
    Недокументированная API функция Cmovmem используется в этом примере
    под псевдонимом CopyBufferToString - она копирует содержимое буфера
    и возвращает данные в виде строки в Лотус скрипт. Иногда использовать
    эту функцию небезопасно, но она хороша для сохранения данных.
     
     
     
     
    %END REM

     
     
     
     
     
     
     
     
    '** Функция статистики
    Declare Function StatQuery Lib "nnotes" (Byval headerString As String, _
    Byval namePrefix As String, Byval valuePrefix As String, Byval lineSuffix As String, _
    rethStats As Long, retStatsLength As Long) As Integer
     
     
     
     
    '** если хотите получить всю статистическую информацию, используйте значение 0& в качестве statName;
    '** иначе, вы можете получить специфическую статистику (такую как Time.Current)
    Declare Function StatQueryTime Lib "nnotes" (Byval facility As String, _
    Byval statName As Any, Byval headerString As String, Byval namePrefix As String, _
    Byval valuePrefix As String, Byval lineSuffix As String, rethStats As Long, _
    retStatsLength As Long) As Integer
     
     
     
     
    Const STATPKG_OS = "OS"
    Const STATPKG_STATS = "Stats"
    Const STATPKG_OSMEM = "Mem"
    Const STATPKG_OSSEM = "Sem"
    Const STATPKG_OSSPIN = "Spin"
    Const STATPKG_OSFILE = "Disk"
    Const STATPKG_SERVER = "Server"
    Const STATPKG_REPLICA = "Replica"
    Const STATPKG_MAIL = "Mail"
    Const STATPKG_MAILBYDEST = "MailByDest"
    Const STATPKG_COMM = "Comm"
    Const STATPKG_NSF = "Database"
    Const STATPKG_NIF = "Database"
    Const STATPKG_TESTNSF = "Testnsf"
    Const STATPKG_OSIO = "IO"
    Const STATPKG_NET = "NET"
    Const STATPKG_OBJSTORE = "Object"
    Const STATPKG_AGENT = "Agent"
    Const STATPKG_WEB = "Web"
    Const STATPKG_CAL = "Calendar"
    Const STATPKG_SMTP = "SMTP"
    Const STATPKG_LDAP = "LDAP"
    Const STATPKG_NNTP = "NNTP"
    Const STATPKG_ICM = "ICM"
    Const STATPKG_MONITOR = "Monitor"
    Const STATPKG_POP3 = "POP3"
     
     
     
     
    '** Функции памяти
    Declare Function OSLockObject Lib "nnotes.dll" (Byval objectHandle As Long) As Long
    Declare Function OSUnlockObject Lib "nnotes.dll" (Byval objectHandle As Long) As Integer
    Declare Function OSMemFree Lib "nnotes" (Byval handle As Long) As Integer
     
     
     
     
    '** недокументировання функция Notes API копирования буфера памяти в строку
    Declare Sub CopyBufferToString Lib "nnotes.dll" Alias "Cmovmem"  _
    (Byval lpSrc As Long, Byval lpDest As String, Byval lSize As Long)
     
     
     
     
    '** если вы хотите копировать не строковые данные, используйте параметр lpDest As Any
    Declare Sub CopyBuffer Lib "nnotes.dll" Alias "Cmovmem"  _
    (Byval lpSrc As Long, lpDest As Any, Byval lSize As Long)
     
     
     
     
     
     
     
     
    Sub Initialize
    '** выгрузка данных в файл -- код должен быть запущен на сервере и для получения должны быть данные
    Dim newLine As String
    Dim fileNum As Integer
    Dim fileName As String
    Dim nError As Integer
    Dim statBuffer As Long
    Dim statBufferLen As Long
    Dim statArray(0 To 25) As String
     
    statArray(0) = STATPKG_OS
    statArray(1) = STATPKG_STATS
    statArray(2) = STATPKG_OSMEM
    statArray(3) = STATPKG_OSSEM
    statArray(4) = STATPKG_OSSPIN
    statArray(5) = STATPKG_OSFILE
    statArray(6) = STATPKG_SERVER
    statArray(7) = STATPKG_REPLICA
    statArray(8) = STATPKG_MAIL
    statArray(9) = STATPKG_MAILBYDEST
    statArray(10) = STATPKG_COMM
    statArray(11) = STATPKG_NSF
    statArray(12) = STATPKG_NIF
    statArray(13) = STATPKG_TESTNSF
    statArray(14) = STATPKG_OSIO
    statArray(15) = STATPKG_NET
    statArray(16) = STATPKG_OBJSTORE
    statArray(17) = STATPKG_AGENT
    statArray(18) = STATPKG_WEB
    statArray(19) = STATPKG_CAL
    statArray(20) = STATPKG_SMTP
    statArray(21) = STATPKG_LDAP
    statArray(22) = STATPKG_NNTP
    statArray(23) = STATPKG_ICM
    statArray(24) = STATPKG_MONITOR
    statArray(25) = STATPKG_POP3
     
    newLine = Chr(13) & Chr(10)
     
    '** открытие тукстового файла
    fileNum = Freefile()
    fileName = "C:\TestStats.txt"
    Open fileName For Output As fileNum
     
    '** выгрузка одиночниых данных, используя StatQueryTime
    nError = StatQueryTime (STATPKG_STATS, "Time.Start", "Start Time:" & newline, _
    "  ", Chr(9), newLine, statBuffer, statBufferLen)
    Print #fileNum, "GETTING SINGLE STAT USING StatQueryTime"
    If (nError = 0) Then
    Print #fileNum, GetBufferAsString(statBuffer, Cint(statBufferLen), 0, True)
    Else
    Print #fileNum, "API Error " & nError & " calling StatQueryTime"
    End If
     
    '** выгрузка всех данных, используя StatQueryTime
    Print #fileNum, "GETTING ALL STATS USING StatQueryTime"
    Forall stat In statArray
    nError = StatQueryTime (stat, 0&, "Statistics for " & stat & ":" & newLine, _
    "  ", Chr(9), newLine, statBuffer, statBufferLen)
    If (nError = 0) Then
    Print #fileNum, GetBufferAsString(statBuffer, Cint(statBufferLen), 0, True)
    Else
    Print #fileNum, "API Error " & nError & " calling StatQueryTime"
    End If
    End Forall
     
    '** выгрузка всех данных в файл, используя   StatQuery
    nError = StatQuery ("From Stat Query:" & newLine, "  ", Chr(9), newLine, _
    statBuffer, statBufferLen)
    Print #fileNum, "GETTING ALL STATS USING StatQuery (" & statBufferLen & " bytes)"
    If (nError = 0) Then
    '** здесь возможно использовать более 32,767 (наибольшее значение в Notes для типа Integer)
    '** таким образом потребуется несколько проходов
    Dim chunkSize As Integer
    Dim offset As Long
    Dim freeMem As Integer
    While statBufferLen > 0
    If (statBufferLen > 32767) Then
    chunkSize = 32767
    freeMem = False
    Else
    chunkSize = statBufferLen
    freeMem = True
    End If
    Print #fileNum, GetBufferAsString(statBuffer, chunkSize, offset, freeMem);
    offset = offset + chunkSize
    statBufferLen = statBufferLen - chunkSize
    Wend
    Else
    Print #fileNum, "API Error " & nError & " calling StatQuery"
    End If
     
    '** не принебрегайте закрытием файла после выгрузки в него данных
    Close fileNum
    Print "Finished writing to " & fileName
     
    End Sub
     
     
     
     
    Function GetBufferAsString (buffer As Long, bufferLen As Integer, _
    offset As Long, freeMem As Integer) As String
    '** Копирование информации из буфера в строку  
    '** используя недокументированную функцию Cmovmem API  
    '**
    '** "buffer" адрес буфера
    '** "bufferLen" количество байт для копирования
    '** "offset" точка отсчета начала копирования  (
    '** "freeMem" индикатор буфера
    '**  по необходимости буфер можно очищать или оставлять так как есть
    '**
    '** Julian Robichaux -- http://www.nsftools.com
     
    Dim pointer As Long
    Dim bufferText As String
     
    bufferText = Space(bufferLen)
    pointer = OSLockObject(buffer)
    Call CopyBufferToString(pointer + offset, bufferText, Clng(bufferLen))
    Call OSUnlockObject(buffer)
     
    '** Предупреждение: если после вызова OSMemFree вы попробуете заблокировать или
    '** получить доступ к буферу, тогда это приведет к сбою лотуса
    If freeMem Then
    Call OSMemFree(buffer)
    End If
     
    GetBufferAsString = bufferText
    End Function
     
  11. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    770
    Симпатии:
    50
    Так же непереносимо в другую среду, но лучше... как мне кажется.
     
Загрузка...

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