Решено Как узнать сколько свободного места осталось на диске С?

R4z0R

Green Team
06.08.2009
269
7
BIT
0
Можно ли из скрипта LS узнать сколько свободного места осталось на диске С?
 

Domino-Designer

Людям надо поморгать!
Lotus Team
06.12.2011
617
223
BIT
25
На 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


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

erdi

Green Team
20.08.2008
264
17
BIT
0
ну почему же?
Код:
 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
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
да уж извращенцы
а что через доминошную статистику снять не можете?
 

R4z0R

Green Team
06.08.2009
269
7
BIT
0
работает! Только мне нужна одна цифра - диска, где находится Дата. Это просто продолжение "архивной темы". Нужно в целом чтобы юзер нажал кнопку, скрипт проверил хватит ли места на диске и создал локальную реплику архива.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
System.out.println(f.getFreeSpace() +" bytes");
и получим отлуп по секьюрити нотусевой жвм
как мы его не получим:
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, ну зачем опять КОМ? вот ничем не сложнее:
Код:
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
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
364
Код:
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

использование:
Код:
Dim FreeSpace As Double
FreeSpace = FreeDiskSpace("C:\")
Print CStr(FreeSpace)
 
K

Kee_Keekkenen

по аналогии с Win API можно использовать Notes API для получения серверной статистики с помошью StatQuery()
Visual Basic:
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
Добавлено: обновлённая версия находится здесь.
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
364
Отчего юзать КОМ не приветствуется?
1. Microsoft уже давно объявило эксперимент с технологией COM неудачным и всеми силами пытается от него избавиться, но некоторые корпоративные программисты продолжают его использовать и мешают Microsoft сделать это. Но когда-нибудь у них это получится. Я верю.
2. В нашей организации ни на одном сервере COM не работает, т.к. сервера не на Windows, а многие начальники предпочитают использовать MacBook-и - у них тоже не работает.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!