Autor Thema: Filesystem Klasse unter LS  (Gelesen 13070 mal)

Offline Johnson

  • Senior Mitglied
  • ****
  • Beiträge: 258
  • Geschlecht: Männlich
Filesystem Klasse unter LS
« am: 08.12.05 - 13:27:29 »
Das Handling mit Dateien oder ganzen Ordnerstrukturen in Lotus Script ist ja zuweilen recht schwierig und kompleziert.

Desshalb habe ich eine extra Klasse geschrieben die mir eine Funktionen dazu zur Verfügung stellen soll.

Als Basis dazu dient das FileSystemObject-Objekt des Windowsstandards. Und da ist auch schon das Problem. Bisher bin ich mit der Windowsschmittstelle recht gut zurechgekommen. Es gibt jedoch viele viele Szenarien in denen unter Linux mit Dateien gearbeitet wird. Da in Sachen Linux u.ä. meine Kenntnisse sehr begrenzt sind, bitte ich hier um etwas Hilfe und Hintergrundinfos.

Gruß und Danke im Voraus
Johnson

« Letzte Änderung: 12.12.05 - 17:24:57 von Johnson »
Gruß
Johnson

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re: Filesystem Klasse unter LS
« Antwort #1 am: 08.12.05 - 23:05:43 »
Kurze Erklärung, da der Thread nun 2mal verschoben wurde:
Johnson hatte hier bei Best Practices Diskussionen gepostet, Axel dann das ganze (eigentlich korrekt) in Tipps & Tricks verschoben.

koehlerbv hatte allerdings hier vorgeschlagen, daraus einen Best Practices - Artikel zu machen, daher hab ich den Thread nun wieder hierher verschoben.  ;)
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline Johnson

  • Senior Mitglied
  • ****
  • Beiträge: 258
  • Geschlecht: Männlich
Re: Filesystem Klasse unter LS
« Antwort #2 am: 09.12.05 - 11:05:41 »
Zur Dokumentation:

Grundsätzlich sollen folgende Funktionen möglich sein:
Laufwerke (nur Windows) identifizieren
Verzeichnisse erstellen, durchsuchen, kopieren, verschieben, löschen
Dateien erstellen, lesen/schreiben, kopieren, verschieben, löschen

Die Zugriffsberechtigungen sollen hier nicht abgebildet werden, da diese sich von OS zu OS unterscheiden.


Übersicht zur Version 1.0

1. Basics

Properties
   FileSystemObject   FileSystemObject-Objekt

2. Laufwerke (Win)

Properties
   DriveExitsts(strDrive)   Prüft ob das abgegebene Laufwerk existiert
   DriveLetters   Allen Laufwerksbuchstaben in einem Array
   Drives   Drives-Objekt (Listenobjekt mit Drive-Objekten)
Functions
   GetDrive(strDrive)   Laufwerk als Drive-Objekt
   GetDriveName(strPath)   Laufwerknamen eines Verzeichnisses

Methods
   CreateVirtualDrive(strVirtDrive, strPath)
   Erstellt für das angegebene Verzeichnis ein virtuelles Laufwerk (temporär)
   RemoveVirtualDrive(strVirtDrive)   Löscht ein virtuelles Laufwerk


3. Verzeichnisse

Properties
   FolderExists(strPath)   Prüft ob das angegebene Verzeichnis existiert
   NotesFolder   Notes\Data-Verzeichnis als Folder-Objekt
   SystemFolder   Konfigurationsverzeichnis von Windows als Folder-Objekt
   TemporaryFolder   Temporäres Verzeichnis von Windows/des aktuellen Benutzers als Folder-Objekt
   WindowsFolder   Windowsverzeichnis als Folder-Objekt

Functions
   DirFiles(strPath)   Alle Dateinamen eines Verzeichnisses in einem Array
   DirFolder(strPath)   Alle Ordner eines Verzeichnissen in einem Array
   GetFolder(strPath)   Verzeichnis als Folder-Objekt
   GetParentFolderName(strPath)   Name übergeordnete Verzeichnisses.

Methods
   CopyFolder(strSourcePath, strTargetPath)   Kopiert einen Ordner.
   CreateFolder(strPath)   Erstellt einen Ordner
   DeleteFolder(strPath)   Löscht einen Ordner
   SearchFile(strPath, SearchFileResult, strText)   Durchsucht einen Ordner (rekursiv)

4. Dateien

Properties
   FileExists(strFilePath)   Prüft ob eine Datei existiert

Functions
   GetFile(strFilePath)   File-Objekt
   GetFileCreated(strFilePath)   Erstelldatum einer Datei
   GetFileLastModified(strFilePath)   Datum, an dem eine Datei gespeichert wurde

Methods
   CopyFile(strSourceFilePath, strTargetFilePath, blnOverwrite   Kopiert eine Datei
   DeleteFile   Löscht eine Datei
   MoveFile(strSourceFilePath, strTargetFilePath)   Verschiebt eine Datei


Zusätzliche Features in Version 2.0

... sind gerade in Arbeit und steht dann voraussichtlich im Januar 2006 hier zur Verfügung.

  • Alle Funktionen (außer Laufwerkeigenschaften) Plattformunabhängig
  • Diverse zusätzliche Eigenschaften zum Filesystem wie z.B. Verzeichnistrenner ("/" oder "\")

Falls irgendetwas nicht berücksichtigt wurde bzw. konzeptionelle Untstimmigkeiten auftreten (Hui! Was für´n Satz), dann bitte hier posten!
Gruß
Johnson

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Filesystem Klasse unter LS
« Antwort #3 am: 09.12.05 - 11:34:08 »
Ich hab' das noch ein paar Vorschläge.

1. Umbenennen einer Datei.
2. Umbenennen eines Ordners
3. Auswahldialog für einen Ordner (API-Funktion BrowseForFolder, gibt's wahrscheinlich nur für Windows, ob das "Pinguin-OS" das auch kann weiß ich nicht ).


koehlerbv hatte allerdings hier vorgeschlagen, daraus einen Best Practices - Artikel zu machen, daher hab ich den Thread nun wieder hierher verschoben. ;)

Einverstanden. Das Posting kannte ich nicht.

Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline Johnson

  • Senior Mitglied
  • ****
  • Beiträge: 258
  • Geschlecht: Männlich
Re: Filesystem Klasse unter LS
« Antwort #4 am: 09.12.05 - 13:37:09 »
zu Punkt 1 und 2:
Richtig. Das fehlt noch.

zu Punkt 3:
Reichen die Funktionen SaveFileDialog und OpenFileDialog des NotesUIWorkspace-Objekts nicht aus?
Hintergrund: Diese Library sollte lediglich das Handling ermöglichen, Frontend-Funktionen habe ich in einer Frontend-Klasse (von Filesystem vererbt) definiert.

Aber hier zwei Beispiele (Ordner und Datei auswählen) wie es in der Klasse aussehen könnte:
Code
' ChoiceFolder
	Public Function ChoiceFolder(str_title) As Variant
		Dim folder As Variant
		Dim var_filepath As Variant
		Dim uiws as NotesUIWorkspace
		Set uiws = New NotesUIWorkspace
		var_filepath = uiws.SaveFileDialog(True, str_title, "", "")
		If Isempty(var_filepath) Then Exit Function
		If Me.FolderExists(var_filepath(0)) Then
			Set folder = Me.GetFolder(var_filepath(0))
		Else
			If Messagebox("Das angegebene Verzeichnis existiert nicht!" & Chr(13) & _
			"Möchten Sie es jetzt erstellen?", MB_YESNO + MB_ICONQUESTION, str_title) = 6 Then
				Call Me.CreateFolder(var_filepath(0))
				Set folder = Me.GetFolder(var_filepath(0))
			End If
		End If
		If Not (Isempty(folder)) Then ChoiceFolder = folder.Path
		Set folder = Nothing
	End Function

Code
' DlgFile
	' Shows a dialog to choice a file and returns the file path.
	Public Function DlgFile(str_title as String, str_filter As String, str_initdir As String) As String
		Dim uiws as NotesUIWorkspace
		Set uiws = New NotesUIWorkspace
		Dim var_result As Variant
		var_result = uiws.OpenFileDialog(False, str_title, str_filter, str_initdir)
		If Isempty(var_result) Then Exit Function
		DlgFile = var_result(0)
	End Function
Gruß
Johnson

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Filesystem Klasse unter LS
« Antwort #5 am: 09.12.05 - 14:08:36 »
zu Punkt 3:
Reichen die Funktionen SaveFileDialog und OpenFileDialog des NotesUIWorkspace-Objekts nicht aus?

Im Prinzip schon. Nur ich verwende gerne, wenn es nur um die Auswahl eines Verzeichnisses geht die Funktion BrowseForFolder. Ich bin eigentlich auch gerne, wenn's sich machen lässt, Windows-konform.


Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline Johnson

  • Senior Mitglied
  • ****
  • Beiträge: 258
  • Geschlecht: Männlich
Re: Filesystem Klasse unter LS
« Antwort #6 am: 09.12.05 - 16:12:11 »
Solange es nur Clients unter Windows gibt.

Remane - Problem:
Das Statement "Name" in LS scheint bugy zu sein. Zumindest R6.5.4 auf Windows XP (SP2).
Die Datei bleibt nach dem Umbenennen bis zum Verlassen von Notes gelockt.  ???
« Letzte Änderung: 09.12.05 - 17:17:32 von Johnson »
Gruß
Johnson

Offline Johnson

  • Senior Mitglied
  • ****
  • Beiträge: 258
  • Geschlecht: Männlich
Re: Filesystem Klasse unter LS
« Antwort #7 am: 09.12.05 - 17:37:55 »
Im Prinzip schon. Nur ich verwende gerne, wenn es nur um die Auswahl eines Verzeichnisses geht die Funktion BrowseForFolder. Ich bin eigentlich auch gerne, wenn's sich machen lässt, Windows-konform.


Unteranderem auch die Funktionen DlgNetworkComputer und DlgNetworkShare:

Code

' ### constants ###

' DlgNetworkShare / DlgNetworkComputer
Private Const ERROR_SUCCESS = 0
Private Const MAX_PATH = 260
Private Const CSIDL_NETWORK = &H12
Private Const BIF_RETURNONLYFSDIRS = &H1
Private Const BIF_BROWSEFORCOMPUTER = &H1000
Private Const DLG_NETWORKSHARE_TITLE = "Bitte wählen Sie eine Freigabe aus!"
Private Const DLG_NETWORKCOMPUTER_TITLE = "Bitte wählen Sie einen Computer aus!"


' ### user defined types ###

' BrowseInfo
Private Type BrowseInfo
	hOwner As Long
	pidlRoot As Long
	pszDisplayName As String
	lpszTitle As String
	ulFlags As Long
	lpfn As Long
	lParam As Long
	iImage As Long
End Type


' ### external functions ###

' This function converts an item identifier list to a file system path.
Declare Private Function apiSHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (Byval pidl As Long, Byval pszPath As String) As Long
' This function retrieves the location of a special folder, such as My Handheld PC, Recycle Bin, Control Panel, Desktop, Printers, Fonts, or various file system directories.
Declare Private Function apiSHGetSpecialFolderLocation Lib "shell32.dll" Alias "SHGetSpecialFolderLocation" (Byval hwndOwner As Long, Byval nFolder As Long, pidl As Long) As Long
' This function displays a dialog box that allows a user to select a folder.
Declare Private Function apiSHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long


Public Function DlgNetworkComputer As String
	Dim bi As BrowseInfo
	Dim lng_pidl As Long
	If apiSHGetSpecialFolderLocation(0, CSIDL_NETWORK, lng_pidl) = ERROR_SUCCESS Then
		bi.hOwner = 0
		bi.pidlRoot = lng_pidl
		bi.pszDisplayName = Space$(MAX_PATH)
		bi.lpszTitle = DLG_NETWORKCOMPUTER_TITLE
		bi.ulFlags = BIF_BROWSEFORCOMPUTER
		If apiSHBrowseForFolder(bi) <> 0 Then
			DlgNetworkComputer = "\\" & Left$(bi.pszDisplayName,Instr(bi.pszDisplayName,Chr$(0)) - 1)
		End If
	End If
End Function

Public Function DlgNetworkShare As String
	Dim bi As BrowseInfo
	Dim lng_pidl As Long
	Dim str_path As String
	Dim lng_return As Long
	If apiSHGetSpecialFolderLocation(0, CSIDL_NETWORK, lng_pidl) = ERROR_SUCCESS Then
		bi.hOwner = 0
		bi.pidlRoot = lng_pidl
		bi.pszDisplayName = Space$(MAX_PATH)
		bi.lpszTitle = DLG_NETWORKSHARE_TITLE
		bi.ulFlags = BIF_RETURNONLYFSDIRS
		lng_pidl = apiSHBrowseForFolder(bi)
		If lng_pidl <> 0 Then
			str_path = Space$(MAX_PATH)
			If apiSHGetPathFromIDList(Byval lng_pidl, Byval str_path) Then
				DlgNetworkShare = Left$(str_path, Instr(str_path, Chr$(0)) - 1)	' folder on host
			Else
				DlgNetworkShare = "\\" & Left$(bi.pszDisplayName, Instr(bi.pszDisplayName,Chr$(0)) - 1)	' host only
			End If
		End If
	End If
End Function

Gruß
Johnson

Offline Johnson

  • Senior Mitglied
  • ****
  • Beiträge: 258
  • Geschlecht: Männlich
Re: Filesystem Klasse unter LS
« Antwort #8 am: 12.12.05 - 17:38:04 »
Hab ´nen kleinen Bug gefunden und entfernt:

NotesFolder Property hatte die falsche Funktion des FileSystemObjects aufgerufen.

http://atnotes.de/index.php?action=dlattach;topic=27547.0;id=3226
Gruß
Johnson

Offline Johnson

  • Senior Mitglied
  • ****
  • Beiträge: 258
  • Geschlecht: Männlich
Re: Filesystem Klasse unter LS
« Antwort #9 am: 29.12.05 - 17:13:32 »
So... es ist soweit: FileSystem 2.0 Beta ist fertig.

Bis auf Laufwerkgeschichten (GetDrive, GetDriveLetters etc.) sind laufen die Funktionen der FileSystem-Klasse auch auf UNIX-Systemen.
Diverse Einschränkungen musste ich natürlich als gegeben hinnehmen.

Zum Testen ist´s freigegeben.
Gruß
Johnson

Offline fayol

  • Frischling
  • *
  • Beiträge: 1
Re: Filesystem Klasse unter LS
« Antwort #10 am: 15.02.07 - 14:16:54 »
mmh, irgendwie hänge ich in einer Schleife:

Code
	Sub Initialize
	
	Dim fs As New Filesystem
	Dim foRoot As folder	
	Set foRoot = fs.NotesFolder
	
End Sub

Was mache ich falsch?

Offline Johnson

  • Senior Mitglied
  • ****
  • Beiträge: 258
  • Geschlecht: Männlich
Re: Filesystem Klasse unter LS
« Antwort #11 am: 28.02.07 - 16:11:40 »
Da gab´s ne Endlosschleife  ::)

Hier is´n Bugfix:
Gruß
Johnson

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz