Option Explicit On Imports System.IO Imports System.Text.RegularExpressions Imports DigitalData.Modules.Logging Imports Independentsoft Public Class ClassFilehandle Private _LOGGER As Logger Public Sub New() _LOGGER = My.LogConfig.GetLogger End Sub ''' ''' Diese Funktion entfernt alle Zeichen aus dem übergebenen String ''' die in Dateinamen nicht erlaubt sind. ''' ''' Der zu prüfende String ''' String ohne nichterlaubte Zeichen Public Function InvalidCharacters(Input As String) As String Dim replacement = "" 'Return System.Text.RegularExpressions.Regex.Replace(Input, "[\\/:*?""<>|\r\n]", "", System.Text.RegularExpressions.RegexOptions.Singleline) Dim regexSearch = New String(Path.GetInvalidFileNameChars()) & New String(Path.GetInvalidPathChars()) Dim r = New Regex(String.Format("[{0}]", Regex.Escape(regexSearch))) Return r.Replace(Input, replacement) End Function Public Function Decide_FileHandle(filename As String, handletype As String) Try If filename.EndsWith(".msg") Then My.Application.Globix.CurrMessageID = "" Dim _msg As New Msg.Message(filename) If _msg.Attachments.Count > 0 Then Dim result As MsgBoxResult If My.Application.User.Language = "de-DE" Then result = MessageBox.Show(New Form With {.TopMost = True}, "Achtung: Die Email enthält Anhänge!" & vbNewLine & "Wollen Sie die Anhänge separat indexieren und herauslösen?", "Nachfrage zur Indexierung:", MessageBoxButtons.YesNo, MessageBoxIcon.Question) Else result = MessageBox.Show(New Form With {.TopMost = True}, "Attention: This Email contains Attachments!" & vbNewLine & "Do you want to extract the attachments and index them seperately?", "Question about Indexing:", MessageBoxButtons.YesNo, MessageBoxIcon.Question) End If If result = MsgBoxResult.Yes Then If handletype.StartsWith("|FW") Then Return Email_Decay(filename, True) Else Return Email_Decay(filename) End If End If End If End If If filename.ToUpper.EndsWith(".LNK") Then If My.Application.User.Language = "de-DE" Then MsgBox("Verknüpfungen können nicht abgelegt werden!", MsgBoxStyle.Critical, "Global Indexer") Else MsgBox("Shortcuts cannot be droppped!", MsgBoxStyle.Critical, "Global Indexer") End If Return False End If Return Insert_GI_File(filename, handletype) Catch ex As Exception MsgBox("Unexpected Error in Decide_FileHandle: " & ex.Message, MsgBoxStyle.Critical) Return False End Try End Function Private Function Email_Decay(msgname As String, Optional FW As Boolean = False) Try Dim msgonly As String = "|MSGONLY|" Dim ATT_EXTR As String = "|ATTMNTEXTRACTED|" If FW = True Then msgonly = "|FW_MSGONLY|" ATT_EXTR = "|FW_ATTMNTEXTRACTED|" End If Dim erfolgreich As Boolean = False Dim msg As New Msg.Message(msgname) If Not msg.InternetMessageId Is Nothing Then My.Application.Globix.CurrMessageID = msg.InternetMessageId Else _LOGGER.Info(">> Email_Decay: Es konnte keine Message-ID gelesen werden. Eine GUID wird erzeugt!") Dim sGUID As String sGUID = System.Guid.NewGuid.ToString() My.Application.Globix.CurrMessageID = sGUID End If 'Nur die MSGDatei ablegen Dim tempfile As String = Path.Combine(Path.GetTempPath, Path.GetFileNameWithoutExtension(msgname) & "_excl_att.msg") If File.Exists(tempfile) Then File.Delete(tempfile) End If Dim _msgEXAtt As New Msg.Message(msgname) _msgEXAtt.Attachments.Clear() _msgEXAtt.Save(tempfile) 'Datei in Array zum Templöschen speichern My.Application.Globix.TEMP_FILES.Add(tempfile) If Insert_GI_File(tempfile, msgonly) = True Then erfolgreich = True 'Hier nun die Anhänge herauslösen Dim _msg As New Msg.Message(msgname) Dim i1 As Integer = 1 _LOGGER.Info(">> Anzahl der Attachments: " & _msg.Attachments.Count) For Each attachment As Independentsoft.Msg.Attachment In _msg.Attachments If erfolgreich = False Then Exit For End If Dim attachment_name As String If attachment.LongFileName Is Nothing Then attachment_name = attachment.DisplayName Else attachment_name = attachment.LongFileName End If If attachment.EmbeddedMessage IsNot Nothing Then attachment_name = InvalidCharacters(attachment_name) tempfile = Path.Combine(Path.GetTempPath, attachment_name & ".msg") tempfile = CType(Versionierung_Datei(tempfile), String) If tempfile <> String.Empty Then Dim oMessage = attachment.EmbeddedMessage oMessage.Save(tempfile) My.Application.Globix.TEMP_FILES.Add(tempfile) _LOGGER.Info(">> Attachment (" & i1 & "):" & tempfile) erfolgreich = Insert_GI_File(tempfile, ATT_EXTR) i1 += 1 End If ElseIf Not attachment_name.Contains("inline") Then 'Sonderzeichen entfernen attachment_name = InvalidCharacters(attachment_name) tempfile = Path.Combine(Path.GetTempPath, attachment_name) tempfile = Versionierung_Datei(tempfile) If tempfile <> "" Then attachment.Save(tempfile) 'Datei in Array zum Templöschen speichern My.Application.Globix.TEMP_FILES.Add(tempfile) _LOGGER.Info(">> Attachment (" & i1 & "):" & tempfile) 'nun der Insert des Anhanges erfolgreich = Insert_GI_File(tempfile, ATT_EXTR) i1 += 1 End If End If Next End If Return erfolgreich Catch ex As Exception MsgBox("Error in Email_Decay: " & ex.Message, MsgBoxStyle.Critical) End Try End Function Private Function Insert_GI_File(filename As String, handleType As String) Try filename = filename.Replace("'", "''") Dim filename_only As String = Path.GetFileName(filename) Dim ins As String = "INSERT INTO TBGI_FILES_USER (FILENAME2WORK, USER@WORK,HANDLE_TYPE,FILENAME_ONLY) VALUES ('" & filename & "','" & Environment.UserName & "','" & handleType & "','" & filename_only & "')" Return My.Database.ExecuteNonQuery(ins) Catch ex As Exception Return False End Try End Function Public Function IsFileInUse(ByVal fullFilePath As String) As Boolean ' Gibt zurück, ob die übergebene Datei momentan exklusiv zu haben ist. ' Prüft, ob die angegeben Datei aktuell durch eine ' andere Anwendung in Benutzung ist Dim ff As Integer = FreeFile() If System.IO.File.Exists(fullFilePath) Then Try ' Versuchen, die Datei mit *exklusiven* Lese- und ' Schreibrechten zu öffnen FileOpen(ff, fullFilePath, OpenMode.Binary, OpenAccess.ReadWrite, OpenShare.LockReadWrite) Catch ex As Exception ' Ist ein Fehler aufgetreten, so wird nach außen hin generell ' davon ausgegangen, dass die Datei in Benutzung ist (obwohl ' auch andere Ursachen, etwa Rechteprobleme, möglich sind). _LOGGER.Info(">> FileInUse Message: " & ex.Message) IsFileInUse = True Finally ' Die eventuell geöffnete Datei schließen FileClose(ff) End Try Return False End If End Function Public Function Versionierung_Datei(Dateiname As String) Dim extension Dim _NewFileString Try Dim version As Integer = 1 Dim Stammname As String = Path.GetDirectoryName(Dateiname) & "\" & Path.GetFileNameWithoutExtension(Dateiname) extension = Path.GetExtension(Dateiname) Dim _neuername As String = Stammname 'Dim MoveFilename As String = DATEINAME.Replace(element.Value, "") 'Überprüfen ob File existiert If File.Exists(_neuername & extension) = False Then _NewFileString = _neuername Else Do While File.Exists(_neuername & extension) version = version + 1 _neuername = Stammname & "~" & version _NewFileString = _neuername Loop End If Return _NewFileString & extension Catch ex As Exception _LOGGER.Info(" - Error in versioning file - error: " & vbNewLine & ex.Message) _LOGGER.Error(ex.Message) MsgBox(ex.Message, MsgBoxStyle.Critical, "Error in versioning file:") Return "" End Try End Function '' ''' Ersetzt alle nicht zulässigen Zeichen im angegebenen Dateinamen ''' ''' Dateiname ohne Pfadangabe ''' Ersatzzeichen für alle unzulässigen Zeichen ''' im Dateinamen Public Function CleanFilename(ByVal sFilename As String, Optional ByVal REPLACEChar As String = "") As String _LOGGER.Info(" Filename before CleanFilename: '" & sFilename & "'") If sFilename.Contains(".\") Then sFilename = sFilename.Replace(".\", "\") End If 'If sFilename.Contains("'") Then ' sFilename = sFilename.Replace("'", "") 'End If 'If sFilename.Contains("..") Then ' sFilename = sFilename.Replace("..", ".") 'End If ' alle nicht zulässigen Zeichen ersetzen sFilename = System.Text.RegularExpressions.Regex.Replace(sFilename, My.Application.Globix.REGEX_CLEAN_FILENAME, REPLACEChar) sFilename = System.Text.RegularExpressions.Regex.Replace(sFilename, "[\\/:*?""<>|\r\n]", "", System.Text.RegularExpressions.RegexOptions.Singleline) 'Dim oCleanFileName As String = String.Join(REPLACEChar, sFilename.Split(Path.GetInvalidFileNameChars())) Dim oCleanFileName As New System.IO.FileInfo(System.Text.RegularExpressions.Regex.Replace(sFilename, String.Format("[{0}]", String.Join(String.Empty, Path.GetInvalidFileNameChars)), REPLACEChar)) _LOGGER.Info("Filename after CleanFilename: '" & sFilename & "'") Return sFilename End Function End Class