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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
жил был код (именно с маленькой буквы ;) )
Код:
%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
сумкадраная (подумал я) и нахардкодил
Код:
Select Case UCase(session.Platform)
Case {LINUX},{UNIX}:'{UNIX} from test on CentOS 6.5
но не домина и здесь меня об..ла
s% = linux_OSGetSystemTempDirectory(d) - получился 0 (да, Карл - ноль)
пришлось еще нахардкодить
Код:
 'temporary hardcoded
If s%<1 Then d={/tmp}:s%=Len({/tmp})
что обидно и некошерно
 
  • Нравится
Реакции: vital

savl

Lotus Team
28.10.2011
2 624
314
BIT
542
@lmike, Dim d As String * 256
это сделает строку сразу длинной 256 символов? Пробелами заполнит или пустая?
Я потому что делал Space(256)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
это сделает строку сразу длинной 256 символов? Пробелами заполнит или пустая?
чем заполнит не проверял (возможно нулями), но точно отобразится такой длины
[DOUBLEPOST=1450870959,1450870889][/DOUBLEPOST]просто Dim d As String - это ""
учитывая передачу как буфер в Си, 0 - наиболее вероятен
 
Последнее редактирование модератором:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
ожидаемо
Код:
24.12.2015 13:32:34   Agent printing: TempDir len: 0
24.12.2015 13:32:34   Agent printing: TempDir>/tmp
ведь это буфер, куда Сишная ф-ция пишет резат и возвращает длину записанного, а она 0
а вот нарваться на переполнение в Сях - запросто, потому как 0 терминейтед стринги
 
  • Нравится
Реакции: savl

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
меня терзают смутные сомнения, что на серверах эта ф-ция (linux_OSGetSystemTempDirectory(d)) работает как-то иначе
виндятского сервера нет и проверить не могу (лень ставить в виртуалку винду с домино сервантом)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
спс, что проверил (именно на домине сервере, да?)
остаются вопросы по вариантам ОС/настроек домины (я апгрейдился 7->8.5->9.0.1), где это не работатет
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
В Linux и Windows всегда использую GetEnvironmentValue( "TEMP", True)
Проблема с возвращаемой строкой бывает, когда нет доступа к этой переменной.
Касательно разделителя пути - всегда использую "/"
Для Lotusscript это не принципиально. c:\Lotus\data/db/test.nsf будет работать.
Одно - такой путь не будет работать для java
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
В Linux и Windows всегда использую GetEnvironmentValue( "TEMP", True)
она не обязана быть определенной в линухах (у меня оно нигде не было определено)

мало того, по спецификациям д.б. $TMPDIR (но и его часто нет)
Касательно разделителя пути - всегда использую "/"
не будет проблем, вплоть до вызова внешнего приложения, в винде ;), с таким путем
я тоже предпочитаю "правильный" слэш
описанный в топики подход хорош тем - что не гадит в общесистемный темп (у нотусни-то он свой)и как следствие - не зависит от загаженности его же
к тому же, в линухах /tmp часто на рутовой точке монтирования, а она привязана в "маленькому" разделу, а домина не чистит темп (со всеми вытекающими) в ходе работы (автоматически)
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Ну мы делаем так.. первым берем системный TEMP, если его нет - то берем каталог DATA и там создаем TEMP.
Но в таком случае да - TEMP надо чистить :(
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
542
@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;
}
долго, но универсально.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
@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;
}
долго, но универсально.
да это понятно. Я говорил о том, что для Lotusscript не нужно приводить строку к одному разделителю. Можно использовать прямой слэш для формирования строки в Windows
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
364
@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;
}
долго, но универсально.
А почему не
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;
 
  • Нравится
Реакции: savl

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
с java все несколько хитрее
эта переменная может переопределяться
но возня с системным темпом не отменяется
есть класс (стыжженый откуда-то ), он опирается на код топика, но может "чистить"
Код:
%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
ну и
Код:
		Set ZipClass = jSession.GetClass("org.files.ZipUtil")
		 sep=ZipClass.fs_sep()
надо заменить на System.getProperty("file.separator");типа
Код:
Set SysClass=jSession.GetClass({java.lang.System})
 
sep=SysClass.getProperty("file.separator")
 
Последнее редактирование модератором:
Мы в соцсетях:

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