Files
ToolCollection/ToolCollection/frmDIHauptseite.vb

2461 lines
123 KiB
VB.net

#Region "+++++ Imports +++++"
Imports System.IO
Imports System.Threading
Imports System.ComponentModel
Imports System.Collections.ObjectModel
Imports System.Net.Mail
Imports System.ServiceProcess
Imports WINDREAMLib
Imports DigitalData.Modules.Logging
Imports System.Text.RegularExpressions
#End Region
Public Class frmDIHauptseite
Dim Formloaded As Boolean = False
Private Shared _Instance As frmDIHauptseite = Nothing
Private _running As Boolean = False
Dim In_Use As Boolean
Public Shared _windream As ClassWindream_allgemein
Public Shared _Link2NavDokumentart, _Link2NavIndexwert As String
Private Shared _Logger As DigitalData.Modules.Logging.Logger
Private Shared _MyLogger As LogConfig
Public Shared Function Instance() As frmDIHauptseite
If _Instance Is Nothing OrElse _Instance.IsDisposed = True Then
_Instance = New frmDIHauptseite
End If
_Instance.BringToFront()
Return _Instance
End Function
Public Sub New()
Try
' Dieser Aufruf ist für den Designer erforderlich.
InitializeComponent()
_MyLogger = New LogConfig(LogConfig.PathType.CustomPath, Path.Combine(My.Application.Info.DirectoryPath, "Log"))
_Logger = _MyLogger.GetLogger()
Me.threadDateiimport = New BackgroundWorker()
Me.threadDateiimport.WorkerReportsProgress = True
Me.threadDateiimport.WorkerSupportsCancellation = True
_windream = New ClassWindream_allgemein(_MyLogger)
AddHandler threadDateiimport.DoWork, AddressOf threadDateiimport_DoWork
AddHandler threadDateiimport.RunWorkerCompleted, AddressOf threadDateiimport_RunWorkerCompleted
AddHandler threadDateiimport.ProgressChanged, AddressOf threadDateiimport_ProgressChanged
'Do While _windream.Init = False
' MsgBox("Windream nicht initiiert")
'Loop
ClassDIProfile.Init()
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler bei Laden von Dateiimport -> Hauptseite")
End Try
End Sub
#Region "+++++ Variablen +++++"
Private threadDateiimport As BackgroundWorker
Private selectedProfile As ClassDIProfil = New ClassDIProfil()
Private ImportFileList As ReadOnlyCollection(Of String)
Private UVerzeichnisse As ReadOnlyCollection(Of String)
Private arrayDateiinformationen As ArrayList
Private CriticalErrorInBackgroundWorker As Boolean = False
Private manProfile As String
Private FehlerProfileListe As New List(Of String)
Private FehlerMsgBoxVisible As Boolean = False
Private Alles_OK As Boolean = True
Private Manuell As Boolean = False
Private Durchlauf As Boolean = False
Private CountFilesImported As Integer = 0
Private CountFiles2Import As Integer = 0
Private bgwQuelldatei = ""
Private bgwZielordner = ""
Private oWMStream_Result As Integer
Private ErgebnisNochNichtLöschen As Boolean = False
Private TreeNodeInfos As New ArrayList
Private singleInfoNode As New ArrayList
Private Gesamtfiles As Integer = 0
#End Region
#Region "+++++ Konstanten +++++"
Const WMObjectEditModeObject = &H1F
Const WMObjectStreamOpenModeReadWrite = 2
Const WMEntityObjectType = 10
Const WMEntityDocument = 1
Const WMObjectVariableValueTypeUndefined = 0
Const WMObjectVariableValueTypeString = 1
Const WMObjectVariableValueTypeInteger = 2
Const WMObjectVariableValueTypeFloat = 3
Const WMObjectVariableValueTypeBoolean = 4
Const WMObjectVariableValueTypeDate = 5
Const WMObjectVariableValueTypeFixedPoint = 6
Const WMObjectVariableValueTypeTimeStamp = 7
Const WMObjectVariableValueTypeCurrency = 8
Const WMObjectVariableValueTypeTime = 9
Const WMObjectVariableValueTypeVariant = 10
Const WMObjectVariableValueTypeMask = &HFFF
Const WMObjectVariableValueFlagMask = &HFFFFF000
Const WMObjectVariableValueTypeVector = &H1000
Const WMObjectVariableValueTypeFulltext = &H2000
Const WMObjectVariableValueTypeDefaultValue = &H4000
Dim WMObjectVariableValueTypeVectorAlpha = 36865
' wenn das Indexieren aktiviert ist MUSS die Übertragung auch aktiviert sein !!!
Const ÜBERTRAGUNG_DURCHFÜHREN As Boolean = True
Const INDEXIEREN_DURCHFÜHREN As Boolean = True
#End Region
#Region "+++++ Events +++++"
Private Sub btnStarten_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDI_Manuell_starten.Click
Standards_Ueberpruefen()
'MsgBox(Alles_OK.ToString)
If Alles_OK = False Then
'MsgBox("Alles_OK = False")
Alles_OK = True
Exit Sub
End If
Manuell = True
manProfile = Me.cmbProfilauswahl.SelectedItem
Backgroundtask_Dateiimport_starten()
End Sub
Private Sub btnAbbrechen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAbbrechen.Click
Import_Abbrechen()
End Sub
Sub Import_Abbrechen()
Try
If Me.threadDateiimport.IsBusy Then
Me.threadDateiimport.CancelAsync()
End If
Me.cmbProfilauswahl.Enabled = True
Me.txtQuellordner.Enabled = True
Me.txtZielordner.Enabled = True
Me.btnQuellordner.Enabled = True
Me.btnZielordner.Enabled = True
If Me.rbManuell.Checked Then
btnDI_Manuell_starten.Enabled = True
Me.btnDurchlauf.Enabled = False
Me.numIntervallDurchlauf.Enabled = False
Else
btnDI_Manuell_starten.Enabled = False
Me.btnDurchlauf.Enabled = True
Me.numIntervallDurchlauf.Enabled = True
Me._running = False
Me.btnDurchlauf.Text = "Durchlauf für Dateiimport starten"
Me.lblLetzter_Durchlauf.Visible = False
Me.lblLog.Visible = False
Me.tvLog.Visible = False
Me.timRun_Dateiimport.Stop()
Durchlauf = False
End If
Me.progressImport.Enabled = False
Me.lblProgress.Enabled = False
Me.btnAbbrechen.Enabled = False
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler bei Abbruch:")
End Try
End Sub
Private Sub cmbProfilauswahl_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbProfilauswahl.SelectedIndexChanged
' die Importinformationen ausblenden
Me.lblLog.Visible = False
Me.tvLog.Visible = False
Me.progressImport.Visible = False
Me.btnAbbrechen.Visible = False
Me.lblProgress.Visible = False
' die Felder für die Verzeichnisse aktivieren
Me.txtQuellordner.Enabled = True
Me.txtZielordner.Enabled = True
Me.btnQuellordner.Enabled = True
Me.btnZielordner.Enabled = True
Me.selectedProfile = ClassDIProfile.getProfilByName(Me.cmbProfilauswahl.SelectedItem)
Me.txtQuellordner.Text = Me.selectedProfile.OriginalQuellordner
Me.dlgQuellordner.SelectedPath = Me.selectedProfile.OriginalQuellordner
Me.txtZielordner.Text = Me.selectedProfile.OriginalZielordner
Me.dlgZielordner.SelectedPath = Me.selectedProfile.OriginalZielordner
' Start-Button aktivieren wenn beide Verzeichnisse eingetragen sind
If Not Me.txtQuellordner.Text = "" And Not Me.txtZielordner.Text = "" Then
Me.btnDI_Manuell_starten.Enabled = True
Else
Me.btnDI_Manuell_starten.Enabled = False
End If
End Sub
Private Sub btnQuellordner_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnQuellordner.Click
If Me.dlgQuellordner.ShowDialog = DialogResult.OK Then
Me.txtQuellordner.Text = Me.dlgQuellordner.SelectedPath
End If
End Sub
Private Sub btnZielordner_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnZielordner.Click
If Me.dlgZielordner.ShowDialog = DialogResult.OK Then
Me.txtZielordner.Text = Me.dlgZielordner.SelectedPath
End If
End Sub
Private Sub txtQuellordner_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtQuellordner.TextChanged
If Not Me.txtQuellordner.Text = "" And Not Me.txtZielordner.Text = "" Then
Me.btnDI_Manuell_starten.Enabled = True
Else
Me.btnDI_Manuell_starten.Enabled = False
End If
End Sub
Private Sub txtZielordner_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtZielordner.TextChanged
If Not Me.txtQuellordner.Text = "" And Not Me.txtZielordner.Text = "" Then
Me.btnDI_Manuell_starten.Enabled = True
Else
Me.btnDI_Manuell_starten.Enabled = False
End If
End Sub
Private Sub AlleKnotenÖffnenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AlleKnotenÖffnenToolStripMenuItem.Click
Me.tvLog.ExpandAll()
End Sub
Private Sub AlleKnotenSchließenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AlleKnotenSchließenToolStripMenuItem.Click
Me.tvLog.CollapseAll()
End Sub
Private Sub btnProfiladd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
frmDIProfilHinzufuegen.ShowDialog()
End Sub
Private Sub frmDIHauptseite_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
Formloaded = True
Me.LoadProfilesInCombobox()
If AUTOSTART_FIM Then
Me.rbAutomatisch.Checked = True
Automatischer_Durchlauf(False)
_Logger.Info("AUTOSTART_FIM = True - Dateiimport wird gestartet.")
AUTOSTART_FIM = False
Else
_Logger.Info("Dateiimport Hauptformular wurde geladen - Dateiimport wird NICHT gestartet.")
End If
End Sub
#End Region
#Region "+++++ BackgroundWorker +++++"
#Region "+++++ Durchläuft alle Dateien +++++"
#Region "*** BackgroundWorker wird gestartet ***"
Private Sub startBackgroundTask()
Try
Me.lblProgress.Enabled = True
Me.lblProgress.Text = "Dateien und Informationen werden aufbereitet und geladen. Bitte haben Sie Geduld, da dieser Prozess evtl. viel Zeit in Anspruch nehmen kann."
Me.tvLog.Nodes.Clear()
ClassLoggerDI.Init("", My.Settings.vLogDI & "_", True)
threadDateiimport.RunWorkerAsync()
Catch ex As Exception
MsgBox("Fehler beim Starten des BackgroundWorkers." & vbNewLine & vbNewLine & "Fehlernachricht:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Fehler im BackgroundWorker")
End Try
End Sub
#End Region
#Region "*** DoWork: während der BackgroundWorker aktiv ist ***"
Private Sub threadDateiimport_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
Dim _TimeStart As Date
Dim _TimeEnd As Date
Try
'###
ClassLoggerDI.Add(" ", False)
ClassLoggerDI.Add(" ", False)
ClassLoggerDI.Add(" ", False)
ClassLoggerDI.Add("======================================================================", False)
ClassLoggerDI.Add(" Dateiimporter gestartet ", False)
ClassLoggerDI.Add("______________________________________________________________________", False)
ClassLoggerDI.Add(" Datum: " & Now, False)
_TimeStart = Now
ClassLoggerDI.Add(" Intervall: " & Me.numIntervallDurchlauf.Value, False)
ClassLoggerDI.Add("======================================================================", False)
' Liste für fehlerhafte Profile zurücksetzen
FehlerProfileListe.Clear()
If _windream.Init Then
If Manuell = True Then
ClassLoggerDI.Add(">> Manueller Durchlauf", False)
ClassLoggerDI.Add("Profilname: " & manProfile, False)
Me.selectedProfile = ClassDIProfile.getProfilByName(manProfile)
ClassLoggerDI.Add("- Start des Profildurchlaufes ", False)
Profil_Durchlauf()
Manuell = False
ElseIf Durchlauf = True Then
ClassLoggerDI.Add(">> Zeitgesteuerter Durchlauf", False)
'1. ###### Zählen der Files
Gesamtfiles = 0
Dim files_Durchlauf As ReadOnlyCollection(Of String)
For Each item As ClassDIProfil In ClassDIProfile.Profile
Me.selectedProfile = ClassDIProfile.getProfilByName(item.OriginalProfilname)
'Nur die files der Aktiven Profile zählen
If CBool(selectedProfile.Aktiv) = True Then
Try
If Me.selectedProfile.Subdirectories = True Then
files_Durchlauf = My.Computer.FileSystem.GetFiles(Me.selectedProfile.OriginalQuellordner, FileIO.SearchOption.SearchAllSubDirectories, "*.*")
Else
files_Durchlauf = My.Computer.FileSystem.GetFiles(Me.selectedProfile.OriginalQuellordner, FileIO.SearchOption.SearchTopLevelOnly, "*.*")
End If
Gesamtfiles += files_Durchlauf.Count
Catch ex As Exception
' Profil zur Fehlerliste hinzufügen
FehlerProfileListe.Add(item.OriginalProfilname)
ClassLoggerDI.Add($"## FEHLER beim Zugriff auf Quellordner für Profil '{item.OriginalProfilname}': {ex.Message}", True)
End Try
End If
Next
ClassLoggerDI.Add("Gesamtanzahl der zu importierenden Dateien: " & Gesamtfiles, False)
If Gesamtfiles > 0 Then
'2. Jetzt das Durchlaufen jedes Profiles
For Each item As ClassDIProfil In ClassDIProfile.Profile
Me.selectedProfile = ClassDIProfile.getProfilByName(item.OriginalProfilname)
ClassLoggerDI.Add("Profilname: " & selectedProfile.Profilname, False)
' Überprüfen ob Profil aktiv oder inaktiv
If CBool(selectedProfile.Aktiv) = False Then
ClassLoggerDI.Add(">> Profil: " & selectedProfile.Profilname & " ist inaktiv geschaltet", False)
ClassLoggerDI.Add("", False)
ElseIf FehlerProfileListe.Contains(item.OriginalProfilname) Then
' Profil überspringen, wenn es bereits als fehlerhaft markiert wurde
ClassLoggerDI.Add(">> Profil: " & selectedProfile.Profilname & " wird übersprungen (fehlerhafter Pfad)", False)
ClassLoggerDI.Add("", False)
Else
' den Durchlaufszeitpunkt speichern
selectedProfile.LastRun = Now
selectedProfile.Save(False)
'Und nun das Profil durchlaufen
ClassLoggerDI.Add("- Start des Profildurchlaufes ", False)
Profil_Durchlauf()
End If
Next
End If
End If
Else
ClassLoggerDI.Add(" windream could not be initialized...", True)
End If
'###
Catch ex As Exception
ClassLoggerDI.Add(" ## Fehler bei thread_DI_DoWork: " & ex.Message, False)
End Try
_TimeEnd = Now
Dim seconds As Integer = (_TimeEnd - _TimeStart).TotalSeconds
ClassLoggerDI.Add("", False)
ClassLoggerDI.Add(" Durchlauf beendet: " & Now, False)
Dim Dauer
Dauer = (seconds / 60)
If Dauer < 1 Then
ClassLoggerDI.Add(" Dauer: " & seconds.ToString & " Sekunden", False)
Else
ClassLoggerDI.Add(" Dauer: " & (seconds / 60).ToString & " Minuten", False)
End If
End Sub
Public Function func_check_file_use(ByVal filename) As Boolean
filename = filename.Replace(My.Settings.vWLaufwerk, "\\windream\objects")
Dim fs As Integer = FreeFile()
Dim inuse As Boolean = False
If File.Exists(filename) Then
'Try
' FileOpen(fs, filename, OpenMode.Binary, OpenAccess.ReadWrite, OpenShare.LockReadWrite)
'Catch ex As Exception
' ClassLoggerDI.Add(" ## File " & filename & " inuse or not able to open - message: " & ex.Message, False)
' inuse = True
'Finally
' FileClose(fs)
'End Try
End If
Return inuse
End Function
Private Function Link2Navision(ByVal Dokart As String, ByVal index As String, ByVal dateinamelink As String, ByVal dateiname As String)
Dim p As New Process
Try
Dim Argument As String = """" & Dokart & """" & " " & """" & index & """" & " " & """" & dateinamelink & """" & " " & """" & dateiname & """"
DetailLog("*Argument: " & Argument)
Dim psi As New ProcessStartInfo(My.Settings.PathLink2Navision)
psi.UseShellExecute = False
psi.RedirectStandardError = True
psi.RedirectStandardOutput = True
psi.Arguments = Argument
p = Process.Start(psi)
DetailLog("*Prozess gestartet")
'psi.UseShellExecute = False
'psi.RedirectStandardError = True
'psi.RedirectStandardOutput = True
'p.StartInfo = psi
'p.Start()
p.WaitForExit()
ClassLoggerDI.Add(" *Prozess beendet - Datei an Navision übergeben!", False)
Return True
Catch ex As Exception
ClassLoggerDI.Add(" Fehler in Link2Navision")
ClassLoggerDI.Add(p.StandardError.ReadToEnd())
Return False
End Try
End Function
Sub GetDirectories(ByVal StartPath As String, ByRef DirectoryList As ArrayList)
Dim Dirs() As String = Directory.GetDirectories(StartPath)
DirectoryList.AddRange(Dirs)
For Each Dir As String In Dirs
CURRENT_UNTERV.Add(Dir)
GetDirectories(Dir, DirectoryList)
Next
End Sub
Private Function string_Contains(s As String, search As String)
Return s.ToLower.Contains(search.ToLower)
End Function
Private Sub Profil_Durchlauf()
'Array zum Speichern der Subdirectories
Dim oSubDirectoryList As New ArrayList
'Array zum Speichern der nicht bearbeiteten Dateien
Dim oFileAusschlussList As New ArrayList
'Variable für das "Letzte Subdirectory"
Dim oLastFolderinFiles As String = ""
Try
If Me.selectedProfile.Subdirectories = True Then
Me.ImportFileList = My.Computer.FileSystem.GetFiles(Me.selectedProfile.OriginalQuellordner, FileIO.SearchOption.SearchAllSubDirectories, "*.*")
Else
Me.ImportFileList = My.Computer.FileSystem.GetFiles(Me.selectedProfile.OriginalQuellordner, FileIO.SearchOption.SearchTopLevelOnly, "*.*")
End If
Catch ex As Exception
' Profil zur Fehlerliste hinzufügen, falls noch nicht vorhanden
If Not FehlerProfileListe.Contains(Me.selectedProfile.OriginalProfilname) Then
FehlerProfileListe.Add(Me.selectedProfile.OriginalProfilname)
End If
ClassLoggerDI.Add($"## FEHLER beim Zugriff auf Quellordner für Profil '{Me.selectedProfile.OriginalProfilname}': {ex.Message}", True)
Exit Sub
End Try
Dim oError As Boolean = False
Dim DT_TBTC_DI_REGEX_MATCH As DataTable
Try
Dim oSQl = $"SELECT * FROM TBTC_DI_REGEX_MATCH WHERE PROFILE_NAME = '{Me.selectedProfile.OriginalProfilname}'"
DT_TBTC_DI_REGEX_MATCH = DB_ECM.GetDatatable(oSQl)
Catch ex As Exception
ClassLoggerDI.Add($"ErrorMessageProfil_Durchlauf: {ex.Message}")
oError = True
End Try
If Me.ImportFileList IsNot Nothing And oError = False Then
Me.CountFilesImported = 0
If Durchlauf = True Then
Me.CountFiles2Import = Gesamtfiles
Else
Me.CountFiles2Import = Me.ImportFileList.Count
End If
'Me.lblProgress.Text = Me.dateienImportiert & " von " & Me.dateienGesamt & " Dateien importiert"
'Me.lblProgress.Visible = True
Me.arrayDateiinformationen = New ArrayList
If Me.ImportFileList.Count > 0 Then
ClassLoggerDI.Add(">> Insgesamt sollen [" & Me.ImportFileList.Count & "] Dateien importiert werden", False)
Else
ClassLoggerDI.Add(">> Keine Dateien vorhanden", False)
Exit Sub
End If
Dim fileAusschliessen As Boolean = False
If Me.selectedProfile.Subdirectories = True Then
DetailLog("Subdirectories activated")
CURRENT_UNTERV = New List(Of String)
For Each oSubdirectory In Directory.GetDirectories(Path.GetDirectoryName(Me.selectedProfile.OriginalQuellordner & "\"), "*.*")
If My.Settings.vLogErrorsonly = False Then ClassLoggerDI.Add($" > checking Subdirectory [{oSubdirectory}]", False)
GetDirectories(Me.selectedProfile.OriginalQuellordner & "\", oSubDirectoryList)
Next
For Each Dir As String In oSubDirectoryList
oLastFolderinFiles = Dir
Next
oSubDirectoryList.Reverse()
If My.Settings.vLogErrorsonly = False Then
ClassLoggerDI.Add(" >CURRENT_UNTERV filled", False)
End If
Else
oLastFolderinFiles = Me.selectedProfile.OriginalQuellordner
End If
For Each filename As String In Me.ImportFileList
' zuerst einen Testdurchlauf
Dim resultArray = Me.selectedProfile.GetIndexArray(filename, Me.selectedProfile.OriginalQuellordner, oLastFolderinFiles)
If resultArray IsNot Nothing Then
'Dim indexArray As ArrayList = New ArrayList
'indexArray = Me.selectedProfile.GetIndexArray(filename, Me.txtQuellordner.Text)
'Me.arrayDateiinformationen.Add(indexArray)
Me.arrayDateiinformationen.Add(resultArray)
Else
ClassLoggerDI.Add("ATTENTION: Profil_Durchlauf isNothing!!", False)
End If
If Me.threadDateiimport.CancellationPending Then
Exit Sub
End If
Next
If Me.ImportFileList.Count > 0 Then
DetailLog("Array mit allen Informationen konnte erfolgreich erzeugt werden")
End If
'Console.WriteLine("Durchlauf von DoWork")
Me.CountFilesImported = 0
If Durchlauf = True Then
Me.CountFiles2Import = Gesamtfiles
Else
Me.CountFiles2Import = Me.ImportFileList.Count
End If
' alle Dateien durchlaufen
If Me.ImportFileList.Count > 0 Then
DetailLog("Now For Each oFilenameQuelle As String In Me.ImportFileList")
End If
For Each oFilenameQuelle As String In Me.ImportFileList
fileAusschliessen = False
Dim oFilenameOnly = Path.GetFileName(oFilenameQuelle)
If DT_TBTC_DI_REGEX_MATCH.Rows.Count = 1 Then
If Regex.IsMatch(oFilenameOnly, DT_TBTC_DI_REGEX_MATCH.Rows(0).Item("REGEX")) = False Then
ClassLoggerDI.Add($" >> Regex not Matching for file {oFilenameOnly}!", False)
fileAusschliessen = True
End If
End If
If fileAusschliessen = False Then
If oFilenameQuelle.StartsWith("~$") Then
fileAusschliessen = True
Else
If My.Settings.vDIAusschluss <> "" Then
If My.Settings.vDIAusschluss.Contains("/") Then
'Ausschlußzeichen
Dim strTeile() As String
strTeile = My.Settings.vDIAusschluss.Split("/")
For i As Integer = 0 To strTeile.Length - 1
If string_Contains(oFilenameQuelle, strTeile(i).ToLower) = True Then
fileAusschliessen = True
Exit For
End If
Next
Else
If string_Contains(oFilenameQuelle, My.Settings.vDIAusschluss.ToLower) = True Then
fileAusschliessen = True
End If
End If
End If
End If
End If
'Wenn Datei nicht Sonderzeichen enthält
If fileAusschliessen = False Then
'Überprüfen ob Datei geöffnet ist??
In_Use = func_check_file_use(oFilenameQuelle)
If In_Use = True And oFilenameQuelle.EndsWith(".pdf") Then
ClassLoggerDI.Add(" >> File might be an PDF/A ", False)
In_Use = False
End If
'Achtung Datei in Benutzung
If In_Use = True Then
If My.Settings.vLogErrorsonly = False Then
ClassLoggerDI.Add(" >> Datei in Benutzung ", False)
ClassLoggerDI.Add(" >> Datei '" & oFilenameQuelle & "' wird im aktuellen Durchlauf nicht berücksichtigt!", False)
ClassLoggerDI.Add(" ", False)
End If
'File in Array speichern
oFileAusschlussList.Add(oFilenameQuelle)
Me.oWMStream_Result = 0
Me.threadDateiimport.ReportProgress(Me.CountFilesImported / Me.CountFiles2Import * 100)
Me.CountFilesImported += 1
Else
'Datei nicht in Benutzung
Dim oFileInfo As IO.FileInfo = New IO.FileInfo(oFilenameQuelle)
'zeitdiff nur Zur sicherheit ob file gerade erst erstellt
'If My.Settings.vDItime_durationExists <> 0 Then
If selectedProfile.Verzoegerung <> 0 And DateDiff("s", oFileInfo.CreationTime, Now) < selectedProfile.Verzoegerung Then
'Datei wurde erst "vor kurzem erstellt" - nicht berücksichtigen
If My.Settings.vLogErrorsonly = False Then
ClassLoggerDI.Add(" ### Datei vor weniger als " & selectedProfile.Verzoegerung & " sec. erstellt ###", False)
ClassLoggerDI.Add(" Datei: " & oFilenameQuelle & " wird im aktuellen Durchlauf nicht berücksichtigt!", False)
End If
'File in Array speichern
oFileAusschlussList.Add(oFilenameQuelle)
Me.oWMStream_Result = 0
Me.threadDateiimport.ReportProgress(Me.CountFilesImported / Me.CountFiles2Import * 100)
Me.CountFilesImported += 1
Else
'Datei kann bearbeitet werden
Me.bgwQuelldatei = oFilenameQuelle
Me.bgwZielordner = Me.selectedProfile.OriginalZielordner 'Me.txtZielordner.Text
If My.Settings.vLogErrorsonly = False Then
ClassLoggerDI.Add(" ", False)
ClassLoggerDI.Add(" # Hintergrundprozess wird gestartet (" & oFilenameQuelle & ") <==", False)
ClassLoggerDI.Add(" Datei " & Me.bgwQuelldatei & " behandeln", False)
End If
' prüfen ob der Vorgang abgebrochen werden soll
If Me.threadDateiimport.CancellationPending = True Then
ClassLoggerDI.Add("Vorgang wurde abgebrochen", False)
'e.Cancel = True
Exit Sub
End If
Dim quellVerzeichnis As String = Me.bgwQuelldatei.Substring(0, Me.bgwQuelldatei.LastIndexOf("\"))
Dim quellUnterverzeichnis As String = quellVerzeichnis.Substring(Me.selectedProfile.OriginalQuellordner.Length)
Dim dateiname As String = Me.bgwQuelldatei.Substring(Me.bgwQuelldatei.LastIndexOf("\") + 1)
Dim dateinameOhneExt As String = ""
If dateiname.Contains(".") Then
dateinameOhneExt = dateiname.Substring(0, dateiname.LastIndexOf("."))
Else
dateinameOhneExt = dateiname
End If
Dim dateiExt As String = dateiname.Substring(dateiname.LastIndexOf("."))
Dim vAnhangDateTime As String = "_" & Now.Year & Now.Month & Now.Day & "_" & Now.Hour & Now.Minute & Now.Second & dateiExt
If Me.selectedProfile IsNot Nothing Then
If Me.selectedProfile.Backup Then
DetailLog("Backup soll angelegt werden")
'If My.Computer.FileSystem.FileExists(Me.selectedProfile.Backupordner & "\" & dateiname) Then
If My.Computer.FileSystem.FileExists(Me.selectedProfile.Backupordner & quellUnterverzeichnis & "\" & dateiname) Then
DetailLog(":3.1:Backupdatei existiert")
If Me.selectedProfile.Overwrite = False Then
DetailLog(":3.1.1:nicht überschreiben")
My.Computer.FileSystem.CopyFile(Me.bgwQuelldatei, Me.selectedProfile.Backupordner & quellUnterverzeichnis & "\" & dateinameOhneExt & vAnhangDateTime)
Else
DetailLog(":3.1.2:überschreiben")
My.Computer.FileSystem.DeleteFile(Me.selectedProfile.Backupordner & quellUnterverzeichnis & "\" & dateiname)
My.Computer.FileSystem.CopyFile(Me.bgwQuelldatei, Me.selectedProfile.Backupordner & quellUnterverzeichnis & "\" & dateiname)
End If
Else
DetailLog(":3.2:Backupdatei existiert noch nicht")
My.Computer.FileSystem.CopyFile(Me.bgwQuelldatei, Me.selectedProfile.Backupordner & quellUnterverzeichnis & "\" & dateiname)
End If
End If
End If
DetailLog("DateiÜbertragen wird nun aufgerufen")
'#############################
'Datei-Übertragung
'#############################
DI_FILESIZE = 0
DI_PAGECOUNT = 0
Dim fsi As New IO.FileInfo(bgwQuelldatei)
DI_FILESIZE = CDec(fsi.Length)
DI_PAGECOUNT = clsHelper.GetPDFPageCount(bgwQuelldatei, "DI")
Dim DoubleBytes As Double
DoubleBytes = CDbl(DI_FILESIZE / 1048576) 'MB
DI_FILESIZE = FormatNumber(DoubleBytes, 2)
'Evtl. Subdirectories extrahieren
Dim index As Integer = Me.selectedProfile.OriginalQuellordner.Length
Dim SubPath As String = IO.Path.GetDirectoryName(bgwQuelldatei).Substring(index)
Dim oZielOrdner As String
If SubPath = "" Then
oZielOrdner = Me.selectedProfile.OriginalZielordner
Else
oZielOrdner = Me.selectedProfile.OriginalZielordner & SubPath
End If
'Die Datei nun nach windream übertragen
DI_STREAMRESULTFILE = ""
Me.oWMStream_Result = Stream_File(Me.bgwQuelldatei, oZielOrdner) 'Me.selectedProfile.OriginalZielordner
'DateiÜbertragen_Schleife(Me.bgwQuelldatei, Me.selectedProfile.OriginalZielordner) ' '
CriticalErrorInBackgroundWorker = False
'
If Me.oWMStream_Result = -2 Then
Me.CriticalErrorInBackgroundWorker = True
Else
'Schwerwiegender Fehler in der Dateiübertragung
'MsgBox(übertragen_erfolgreich.ToString)
End If
' hier nochmal prüfen, da der Fehler gerade erst aufgetreten sein kann
If Not CriticalErrorInBackgroundWorker Then
If Me.oWMStream_Result = 0 Then
Try
Dim extension As String = Replace(Path.GetExtension(DI_STREAMRESULTFILE), ".", "").ToUpper
Catch ex As Exception
End Try
'Übertragen war erfolgreich, alles ok!
DetailLog("Stream war erfolgreich")
If Me.selectedProfile.DateiLöschen Then
DetailLog("Datei soll gelöscht werden: " & bgwQuelldatei)
Try
My.Computer.FileSystem.DeleteFile(Me.bgwQuelldatei)
Catch ex As Exception
Try
Dim opath = Path.GetDirectoryName(Me.bgwQuelldatei) & "\Delete_Error"
Dim oFilename = Path.GetFileName(Me.bgwQuelldatei)
File.Move(Me.bgwQuelldatei, opath & "\" & oFilename)
Catch ex1 As Exception
ClassLoggerDI.Add("## Unbehandelter Fehler FileMove after NoDelete : " & ex.Message, False)
End Try
End Try
DetailLog("Datei wurde gelöscht")
End If
DetailLog("Stream-Routine beendet")
If Me.selectedProfile.Link2Navision = True And My.Settings.PathLink2Navision <> "" Then
DetailLog("#### Link2Navision ist aktiviert ####")
'Q:/Extern/WWS/Ausgangsrechnung/ARE-120018-Demo Adresse 16001~1.pdf
Dim _dateiname As String = IO.Path.GetFileName(DI_STREAMRESULTFILE)
Dim _Dokart, _Indexwert As String
_Dokart = _Link2NavDokumentart
_Indexwert = _Link2NavIndexwert
'Wenn Werte gelesen werden konnten
If _Dokart <> "" And _Indexwert <> "" Then
'Start von DDLink2Navision
Link2Navision(_Dokart, _Indexwert, DI_STREAMRESULTFILE, _dateiname)
End If
End If
End If
If Err.Number > 0 Then
ClassLoggerDI.Add(" ## Unbehandelter Fehler in Profil Durchlauf: " & Err.Description, False)
If Err.Description.Contains("CTL_E_PATHNOTFOUND") Or Err.Description.Contains("angegebene Netzwerkname ist nicht mehr verfügbar") Then
'DAS Windream-Laufwerk ist nicht verfügbar!
CriticalErrorInBackgroundWorker = True
Import_Abbrechen()
MsgBox("Schwerwiegender Fehler in Dateiimporter windream!" & vbNewLine & "ERROR: " & Err.Description & vbNewLine & "DAS WINDREAM-LAUFWERK IST NICHT VERFÜGBAR!" & vbNewLine &
"Der Importvorgang wurde abgebrochen!" & vbNewLine & "Fehlerbehebung: ==> Starten Sie windream und den den Dateiimporter neu!")
Exit Sub
End If
End If
'Hochzählen
Me.threadDateiimport.ReportProgress(Me.CountFilesImported / Me.CountFiles2Import * 100)
Me.CountFilesImported += 1
Else
CriticalErrorInBackgroundWorker = False
Me.threadDateiimport.CancelAsync()
Exit Sub
End If
If Me.threadDateiimport.CancellationPending Then
Exit Sub
End If
End If
End If
End If
Next
'Subdirectory-Folder Löschen
If selectedProfile.UVVerzeichnisLoeschen = True Then
DetailLog("Unterverzeichnisse sollen gelöscht werden.")
If oFileAusschlussList.Count > 0 Then
For Each Dir As String In oSubDirectoryList
Dim dir_ex As Boolean = False
For Each _filename As String In oFileAusschlussList
If Path.GetDirectoryName(_filename).ToUpper = Dir.ToUpper Then
ClassLoggerDI.Add(" - Das Unterverzeichnis '" & Dir & "' kann nicht gelöscht werden weil es noch zu importierende Dateien enthält!", False)
dir_ex = True
End If
Next
If dir_ex = False Then
If IO.Directory.Exists(Dir) Then
My.Computer.FileSystem.DeleteDirectory(Dir, FileIO.DeleteDirectoryOption.ThrowIfDirectoryNonEmpty)
If Err.Number > 0 Then
ClassLoggerDI.Add(" - Das Unterverzeichnis '" & Dir & "' wurde NICHT gelöscht!", False)
ClassLoggerDI.Add(" - FEHLERMELDUNG: " & Err.Description, False)
Else
DetailLog("Das Unterverzeichnis '" & Dir & "' wurde gelöscht!")
End If
End If
End If
Next
Else
For Each Dir As String In oSubDirectoryList
My.Computer.FileSystem.DeleteDirectory(Dir, FileIO.DeleteDirectoryOption.ThrowIfDirectoryNonEmpty)
If Err.Number > 0 Then
ClassLoggerDI.Add(" - Das Unterverzeichnis '" & Dir & "' wurde NICHT gelöscht", False)
ClassLoggerDI.Add(" - FEHLERMELDUNG: " & Err.Description, False)
Else
DetailLog("Das Unterverzeichnis '" & Dir & "' wurde gelöscht!")
End If
Next
End If
End If
If Me.selectedProfile.VerzeichnisLöschen Then
'MsgBox(quellVerzeichnis)
DetailLog("Das Quellverzeichnis soll gelöscht werden")
Try
My.Computer.FileSystem.DeleteDirectory(selectedProfile.Quellordner, FileIO.DeleteDirectoryOption.ThrowIfDirectoryNonEmpty)
DetailLog("Das Quellverzeichnis wurde gelöscht!")
Catch ex As Exception
ClassLoggerDI.Add("Das Quellverzeichis wurde NICHT gelöscht " & ex.Message, True)
End Try
End If
Else
If Manuell = True Then
End If
End If
End Sub
#End Region
#Region "*** Fortschritt hat sich verändert ***"
Private Sub threadDateiimport_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) 'Handles threadDateiimport.ProgressChanged
Try
Me.lblProgress.Text = Me.CountFilesImported & " von " & Me.CountFiles2Import & " Dateien importiert"
'Console.WriteLine("Fortschritt geändert: " & Me.lblProgress.Text)
Me.progressImport.Value = e.ProgressPercentage.ToString
Dim dateiname = Me.ImportFileList(Me.CountFilesImported - 1).ToString
Me.tvLog.Nodes.Add(dateiname.Substring(Me.txtQuellordner.Text.Length))
'Console.WriteLine("######## TreeNode (" & dateiname.Substring(Me.txtQuellordner.Text.Length) & "): " & Me.übertragen_erfolgreich)
If Me.oWMStream_Result = 0 Then
If Me.TreeNodeInfos.Count > 0 Then
'Me.tvLog.Nodes(Me.dateienImportiert - 1).Nodes.Add(Me.TreeNodeInfos(Me.dateienImportiert - 1)(0))
'Me.tvLog.Nodes(Me.dateienImportiert - 1).Nodes(0).ForeColor = Color.DarkGreen
' Console.WriteLine("############# TreeNode: dateienImportiert = " & Me.dateienImportiert & "; Count-1 = " & Me.TreeNodeInfos(Me.dateienImportiert - 1).Count - 1)
For i As Integer = 0 To Me.TreeNodeInfos(Me.CountFilesImported - 1).Count - 1
'!!!!!!!
Me.tvLog.Nodes(Me.CountFilesImported - 1).Nodes.Add(Me.TreeNodeInfos(Me.CountFilesImported - 1)(i))
'Console.WriteLine("############# TreeNode: dateienImportiert = " & Me.dateienImportiert)
'Console.WriteLine("############# Me.TreeNodeInfos(" & Me.dateienImportiert - 1 & ", " & i & ") = " & Me.TreeNodeInfos(Me.dateienImportiert - 1)(i))
' *** Farben festlegen ***
If Me.TreeNodeInfos(Me.CountFilesImported - 1)(i).ToString.StartsWith("Ziel:") Then
Me.tvLog.Nodes(Me.CountFilesImported - 1).Nodes(i).ForeColor = Color.DarkGreen
ElseIf Me.TreeNodeInfos(Me.CountFilesImported - 1)(i).ToString.StartsWith("Dokumenttyp:") Then
Me.tvLog.Nodes(Me.CountFilesImported - 1).Nodes(i).ForeColor = Color.Green
ElseIf Me.TreeNodeInfos(Me.CountFilesImported - 1)(i).ToString.StartsWith("Zielindex:") Then
Me.tvLog.Nodes(Me.CountFilesImported - 1).Nodes(i).ForeColor = Color.Goldenrod
ElseIf Me.TreeNodeInfos(Me.CountFilesImported - 1)(i).ToString.StartsWith("Bei dem Zielindex handelt es sich um ein Vektorfeld") Then
Me.tvLog.Nodes(Me.CountFilesImported - 1).Nodes(i).ForeColor = Color.Gold
'ElseIf Me.TreeNodeInfos(Me.dateienImportiert - 1)(i).ToString.StartsWith("Der Datei wurde kein Index zugewiesen.") Then
' Me.tvLog.Nodes(Me.dateienImportiert - 1).Nodes(i).ForeColor = Color.IndianRed
ElseIf Me.TreeNodeInfos(Me.CountFilesImported - 1)(i).ToString.StartsWith("Hinweis:") Then
Me.tvLog.Nodes(Me.CountFilesImported - 1).Nodes(i).ForeColor = Color.Red
Else
Me.tvLog.Nodes(Me.CountFilesImported - 1).Nodes(i).ForeColor = Color.DarkGray
End If
Next
End If
Else
Me.tvLog.Nodes(Me.CountFilesImported - 1).ForeColor = Color.Red
Me.tvLog.Nodes(Me.CountFilesImported - 1).Nodes.Add("Möglicherweise stehen nicht ausreichend Schreibrechte zur Verfügung")
Me.tvLog.Nodes(Me.CountFilesImported - 1).Nodes.Add("oder Datei ist in Benutzung. Check Log-Datei")
Me.tvLog.Nodes(Me.CountFilesImported - 1).Nodes(0).ForeColor = Color.Red
Me.tvLog.Nodes(Me.CountFilesImported - 1).Nodes(1).ForeColor = Color.Red
End If
'Me.tvLog.Nodes(Me.dateienImportiert - 1).Nodes.Add("Dateiname: " & dateiname.Substring(dateiname.LastIndexOf("\") + 1))
'Me.tvLog.Nodes(Me.dateienImportiert - 1).Nodes(0).ForeColor = Color.Green
'Me.tvLog.Nodes(Me.dateienImportiert - 1).Nodes.Add("Dokumenttyp: " & Me.selectedProfile.DokumenttypString)
'Me.tvLog.Nodes(Me.dateienImportiert - 1).Nodes(1).ForeColor = Color.Green
Catch ex As Exception
'MessageBox.Show(ex.Message, "Fehler in ProgressChanged", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, Nothing, False)
End Try
End Sub
#End Region
#Region "*** BackgroundWorker wurde beendet ***"
Private Sub threadDateiimport_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)
Try
Dim result As String = ""
If e.Cancelled Then
MsgBox("Der Dateiimport wurde durch den Anwender abgebrochen.", MsgBoxStyle.Information, "Dateiimport: Vorgang manuell abgebrochen")
ElseIf e.Error IsNot Nothing Then
MsgBox("Beim Dateiimport ist ein Fehler aufgetreten. Der Vorgang wurde abgebrochen." & vbNewLine & vbNewLine & "Dateiimport: Fehlernachricht:" & vbNewLine & e.Error.Message, MsgBoxStyle.Exclamation, "Vorgang auf Grund eines Fehlers abgebrochen")
Else
Me.progressImport.Value = 100
' Fehlermeldung für fehlerhafte Profile anzeigen
' NUR wenn keine MessageBox bereits angezeigt wird
If FehlerProfileListe.Count > 0 AndAlso Not FehlerMsgBoxVisible Then
' Flag setzen BEVOR die MessageBox angezeigt wird
FehlerMsgBoxVisible = True
Dim fehlerMessage As New System.Text.StringBuilder()
fehlerMessage.AppendLine("ACHTUNG: Fehler in folgenden Profilen:")
fehlerMessage.AppendLine()
For Each profilname As String In FehlerProfileListe
fehlerMessage.AppendLine("" & profilname)
Next
fehlerMessage.AppendLine()
fehlerMessage.AppendLine("Bitte kontrollieren Sie die hinterlegten Quell- und Zielpfade,")
fehlerMessage.AppendLine("sowie die Zugriffsberechtigungen!")
' MessageBox anzeigen (blockiert bis Benutzer OK klickt)
MsgBox(fehlerMessage.ToString(), MsgBoxStyle.Exclamation, "Fehlerhafte Profile erkannt")
' Flag zurücksetzen NACHDEM die MessageBox geschlossen wurde
FehlerMsgBoxVisible = False
' Fehler auch im Log vermerken
ClassLoggerDI.Add("======================================================================", False)
ClassLoggerDI.Add(" FEHLERHAFTE PROFILE: " & FehlerProfileListe.Count, True)
For Each profilname As String In FehlerProfileListe
ClassLoggerDI.Add(" - " & profilname, True)
Next
ClassLoggerDI.Add("======================================================================", False)
End If
End If
' den ersten Knoten öffnen und direkt wieder schließen, damit der letzte Knoten korrekt angezeigt wird
' -> sonst wird das letzte Element nicht richtig (nur zur Hälfte) angezeigt
If Me.tvLog.Nodes.Count > 0 Then
Me.tvLog.Nodes(0).Expand()
Me.tvLog.Nodes(0).Collapse()
End If
Me.cmbProfilauswahl.Enabled = True
Me.txtQuellordner.Enabled = True
Me.txtZielordner.Enabled = True
Me.btnQuellordner.Enabled = True
Me.btnZielordner.Enabled = True
If Me.rbManuell.Checked Then
Me.btnDI_Manuell_starten.Enabled = True
lblmanuell_letzterDurchlauf.Visible = True
Me.lblmanuell_letzterDurchlauf.Text = "Letzter Durchlauf: " & My.Computer.Clock.LocalTime
Else
Me.btnDI_Manuell_starten.Enabled = False
End If
Me.progressImport.Enabled = False
Me.lblProgress.Enabled = False
Me.btnAbbrechen.Enabled = False
Me.lblProgress.Visible = False
Me.progressImport.Visible = False
Me.btnAbbrechen.Visible = False
If Me.Visible = True Then
Me.ErgebnisNochNichtLöschen = False
End If
Catch ex As Exception
MsgBox("Es ist ein fehler bei dem Abschluss des Import aufgetreten." & vbNewLine & vbNewLine & "Fehlernachricht:" & vbNewLine & ex.Message, MsgBoxStyle.Exclamation, "Fehler beim Abschließen des Imports")
End Try
End Sub
#End Region
#End Region
#End Region
Sub LoadProfilesInCombobox()
'Schreibt die Profile in die Combobox in der Toolbar.
Try
'ClassDateiimportProfile.Init()
Me.cmbProfilauswahl.Items.Clear()
If ClassDIProfile.Profile IsNot Nothing Then 'ClassDateiimportUsers.Benutzer(benutzername).Profile IsNot Nothing Then
For Each item As ClassDIProfil In ClassDIProfile.Profile
Me.cmbProfilauswahl.Items.Add(item.OriginalProfilname)
Next
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler beim Laden der Profile in die Auswahlliste")
End Try
End Sub
#Region "***** windream-Übertragung *****"
Public Class SW
Public label As String
Public stopwatch As Stopwatch
Public Sub New(label As String)
Me.label = label
stopwatch = New Stopwatch()
stopwatch.Start()
End Sub
Public Function Done() As Long
stopwatch.Stop()
Dim ts As TimeSpan = stopwatch.Elapsed
Dim oDecResult As Decimal
Dim timespan_ = String.Format("{0:00}:{1:00}.{2:00}", ts.Minutes, ts.Seconds, ts.Milliseconds / 10)
If ts.Minutes > 0 Then
timespan_ = String.Format("{0:00}:{1:00}.{2:00}", ts.Minutes, ts.Seconds, ts.Milliseconds / 10)
ElseIf ts.Seconds > 0 And (ts.Minutes > 0) = False Then
timespan_ = String.Format("{0:00}.{1:00} seconds", ts.Seconds, ts.Milliseconds / 10)
Try
oDecResult = CDec(timespan_.ToString.Replace(" seconds", ""))
Catch ex As Exception
oDecResult = 0
End Try
ElseIf (ts.Seconds > 0) = False And ts.Milliseconds > 0 Then
timespan_ = String.Format("{0:00}.{1:00} seconds (below1sec)", ts.Seconds, ts.Milliseconds / 10)
Try
oDecResult = CDec(timespan_.ToString.Replace(" seconds (below1sec)", ""))
Catch ex As Exception
oDecResult = 0
End Try
End If
If timespan_ <> "00:00.00" Then
Dim message = String.Format("{0} || {1}", timespan_, label)
ClassLoggerDI.Add(message, False)
End If
Return oDecResult
End Function
End Class
Sub DetailLog(Detailinfo As String)
If My.Settings.vLogErrorsonly = False Then ClassLoggerDI.Add($">>>> {Detailinfo}", False)
End Sub
Dim SWBesttime As Decimal = 100
Public Function Stream_File(ByVal filenameQuelle As String, ByVal zielpfad As String)
Dim oFilenameOnly As String = Path.GetFileName(filenameQuelle)
Dim oStopWatchTimer As SW
Dim oStopWatchTimerC As SW
Dim _Step As String = "0"
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer = New SW($"[{oFilenameOnly}]-Stream_File")
oStopWatchTimerC = New SW($"[{oFilenameOnly}]-Stream_FileComplete")
End If
Try
If My.Computer.FileSystem.DirectoryExists(zielpfad) = False Then
My.Computer.FileSystem.CreateDirectory(zielpfad)
ClassLoggerDI.Add("Zielverzeichnis neu erzeugt!", False)
End If
Const STREAM_BinaryObject = "BinaryObject"
DetailLog("Stream_File wurde gestartet")
Dim endgültigerDateiname As String = ""
' Objekt für Datei und Zielverzeichnis anlegen
Dim Quelldatei_Name As String = Path.GetFileName(filenameQuelle)
DetailLog("Quelldatei gelesen")
_Step = "1"
'## Prüfen ob Datum-Ordnerhierarchie erstellt werden soll
If selectedProfile.Date_UV.ToString <> "" Then
Dim Month As String = My.Computer.Clock.LocalTime.Month
If Month.Length = 1 Then
Month = "0" & Month
End If
Dim Day As String = My.Computer.Clock.LocalTime.Day
If Day.Length = 1 Then
Day = "0" & Day
End If
Select Case Me.selectedProfile.Date_UV
Case "True"
My.Computer.FileSystem.CreateDirectory(zielpfad & "\" & My.Computer.Clock.LocalTime.Year)
My.Computer.FileSystem.CreateDirectory(zielpfad & "\" & My.Computer.Clock.LocalTime.Year & "\" & Month)
My.Computer.FileSystem.CreateDirectory(zielpfad & "\" & My.Computer.Clock.LocalTime.Year & "\" & Month & "\" & Day)
zielpfad = zielpfad & "\" & My.Computer.Clock.LocalTime.Year & "\" & Month & "\" & Day
Case "YYYY-MM-DD"
My.Computer.FileSystem.CreateDirectory(zielpfad & "\" & My.Computer.Clock.LocalTime.Year)
My.Computer.FileSystem.CreateDirectory(zielpfad & "\" & My.Computer.Clock.LocalTime.Year & "\" & Month)
My.Computer.FileSystem.CreateDirectory(zielpfad & "\" & My.Computer.Clock.LocalTime.Year & "\" & Month & "\" & Day)
zielpfad = zielpfad & "\" & My.Computer.Clock.LocalTime.Year & "\" & Month & "\" & Day
Case "YYYY-MM"
My.Computer.FileSystem.CreateDirectory(zielpfad & "\" & My.Computer.Clock.LocalTime.Year)
My.Computer.FileSystem.CreateDirectory(zielpfad & "\" & My.Computer.Clock.LocalTime.Year & "\" & Month)
zielpfad = zielpfad & "\" & My.Computer.Clock.LocalTime.Year & "\" & Month
Case "YYYY"
My.Computer.FileSystem.CreateDirectory(zielpfad & "\" & My.Computer.Clock.LocalTime.Year)
zielpfad = zielpfad & "\" & My.Computer.Clock.LocalTime.Year
End Select
DetailLog("Zielpfad erzeugt: '" & zielpfad & "'")
End If
_Step = "2"
'########
Dim Zielverzeichnis As String = zielpfad
endgültigerDateiname = Zielverzeichnis.Substring(2) & "\" & Quelldatei_Name
If endgültigerDateiname.StartsWith("\\") Then
endgültigerDateiname = endgültigerDateiname.Substring(2)
End If
endgültigerDateiname = endgültigerDateiname.Replace("Windream\Objects\", "")
DetailLog("endgültigerDateiname: " + endgültigerDateiname)
DetailLog("Zielverzeichnis erzeugt")
If Directory.Exists(Zielverzeichnis) = False Then
'Try to create the directory.
Try
Directory.CreateDirectory(Zielverzeichnis)
Catch ex As Exception
ClassLoggerDI.Add("Unexpected Error in Creating Target Folder: " & vbNewLine & ex.Message)
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer.Done()
oStopWatchTimerC.Done()
End If
Return -2
End Try
End If
_Step = "2.1"
If Directory.Exists(Zielverzeichnis) Then
DetailLog("targetPath existiert")
' Überprüfen ob der zu Kopieren notwendige Speicherplatz auf Ziellaufwerk vorhanden ist
Dim dvr As New DriveInfo(My.Settings.vWLaufwerk & ":")
Dim freeSpace = dvr.TotalFreeSpace
Dim info As New FileInfo(filenameQuelle)
' Get length of the file.
Dim length As Long = info.Length
If freeSpace < length Then
MsgBox(" Auf dem Zielverzeichnis ist nicht genug Speicherplatz zum Übertragen frei.", MsgBoxStyle.Exclamation, "Nicht genug Speicherplatz")
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer.Done()
oStopWatchTimerC.Done()
End If
Return -2
End If
DetailLog("Datei kopieren von " & filenameQuelle & " nach " & zielpfad.Substring(2) & "\" & Quelldatei_Name & ".")
Dim oNewWMObject
Dim oFileIO
Dim oWMStream
DetailLog("Connect definieren: CreateObject('Windream.WMConnect')")
If My.Settings.DLL_WMOTOOL = "" Then
oFileIO = New WMOTOOLLib.WMFileIO
DetailLog("Direkter Verweis auf New WMOTOOLLib.WMFileIO")
Else
oFileIO = CreateObject(My.Settings.DLL_WMOTOOL) 'WMOTool.WMFileIO oder WMOTOOLLib.WMFileIO
DetailLog("Verwendeter Verweis aus Anwendungsstring: '" & My.Settings.DLL_WMOTOOL & "'")
End If
Dim LoggedIn = _windream.oWMSession.aLoggedin
If LoggedIn = False Then
ClassLoggerDI.Add(" - Login on dms-Server failed", False)
' MsgBox("Login failed. ")
End If
'==================================================================
' check if files exist
'==================================================================
DetailLog("ÜBERPRÜFTER DATEINAME => " & endgültigerDateiname)
Dim wdFilexists As Boolean
DetailLog("Versuch auf die Datei in W: zuzugreifen und zu sperren...")
_Step = "3"
DetailLog("_Step: " & _Step)
wdFilexists = _windream.oWMSession.WMObjectExists(WMEntityDocument, endgültigerDateiname, 0, 0)
If wdFilexists = False Then
DetailLog("Datei ist NICHT vorhanden, kann also einfach neu angelegt werden")
Err.Clear()
'==================================================================
' create an object
'==================================================================
_Step = "3.1"
DetailLog("_Step: " & _Step)
oNewWMObject = _windream.oWMSession.GetNewWMObjectFS(WMEntityDocument, endgültigerDateiname, WMObjectEditModeObject)
If Err.Number > 0 Then
ClassLoggerDI.Add(" FEHLER: WMObject konnte nicht erzeugt werden - Error: '" & Err.Description & "'")
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer.Done()
oStopWatchTimerC.Done()
End If
'MsgBox(Err.Description)
End If
' MsgBox("Created file: " + endgültigerDateiname)
Else
_Step = "3.1.1"
DetailLog("_Step: " & _Step)
' wenn auf die Datei zugeriffen werden konnte ist sie bereits vorhanden -> Datum anhängen
DetailLog("DATEI IST BEREITS VORHANDEN - MUSS VERSIONIERT WERDEN!")
Err.Clear()
'### Automatische Versionierung mit ~ (Tilde) ###
Dim oMyVersion As Integer = 2
Dim extension As String = Quelldatei_Name.Substring(Quelldatei_Name.LastIndexOf("."))
If zielpfad.StartsWith("\\Windream\Objects") Then
DetailLog("Replacing windream\objects...")
zielpfad = zielpfad.Replace("\\Windream\Objects", "")
Else
zielpfad = zielpfad.Substring(2)
End If
Dim Stammname As String = zielpfad & "\" & Quelldatei_Name.Substring(0, Quelldatei_Name.LastIndexOf("."))
Dim neuername As String = zielpfad & "\" & Quelldatei_Name.Substring(0, Quelldatei_Name.LastIndexOf("."))
DetailLog("Stammname [" & Stammname & "]")
DetailLog("neuername [" & neuername & "]")
Do While file_exists("\\WINDREAM\OBJECTS\" & neuername & extension) = True
DetailLog("Versionierung - Datei [" & neuername & extension & "] ist vorhanden!")
neuername = Stammname & "~" & oMyVersion
DetailLog("Versionierung - neuername [" & neuername & "]")
endgültigerDateiname = neuername & extension
oMyVersion = oMyVersion + 1
Loop
DetailLog("Datei [" & endgültigerDateiname & "] wird benutzt um den Filestream nach WM zu erzeugen...")
_Step = "3.1.2"
DetailLog("_Step: " & _Step)
Try
oNewWMObject = _windream.oWMSession.GetNewWMObjectFS(WMEntityDocument, endgültigerDateiname, WMObjectEditModeObject)
Catch ex As Exception
ClassLoggerDI.Add(" FEHLER DATEI_VORHANDEN GetNewWMObjectFS...")
ClassLoggerDI.Add(" FEHLER bei _windream.oWMSession.GetNewWMObjectFS: '" & ex.Message)
Return -1
End Try
If Err.Number > 0 Then
ClassLoggerDI.Add(" FEHLER: Neues WMObject (Kopie) konnte nicht erzeugt werden - Error: '" & Err.Description & "'")
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer.Done()
oStopWatchTimerC.Done()
End If
'MsgBox(Err.Description)
End If
DetailLog("...WMObject-Filestream zugewiesen")
End If
_Step = "3.2"
DetailLog("_Step: " & _Step)
DetailLog("ENDGÜLTIGER DATEINAME => " & endgültigerDateiname)
If oNewWMObject IsNot Nothing Then
' lock object for file system access (to change the file itself)
oNewWMObject.lock()
' set fileIO the local source file
DetailLog("Now Streaming from filenameQuelle...")
oFileIO.bstrOriginalFileName = filenameQuelle
If Err.Number > 0 Then
'MsgBox(Err.Number.ToString)
ClassLoggerDI.Add(" FEHLER: fileIO konnte nicht gesetzt werden - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
ClassLoggerDI.Add(" HINWEIS: Überprüfen Sie den Verweis auf die Bibliotheken 'WMOTool.WMFileIO' UND 'WMOTOOLLib.WMFileIO' und ändern diese in den Anwendungseinstellungen (DLL_WMOTOOL)'", False)
oNewWMObject.Unlock()
System.IO.File.Delete(My.Settings.vWLaufwerk & ":" & endgültigerDateiname)
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer.Done()
oStopWatchTimerC.Done()
End If
Return -1
' MsgBox(Err.Description)
End If
_Step = "3.3"
DetailLog("_Step: " & _Step)
Try
' open the windream object's file stream for writing
oWMStream = oNewWMObject.OpenStream(STREAM_BinaryObject, WMObjectStreamOpenModeReadWrite)
Catch ex As Exception
ClassLoggerDI.Add(" FEHLER bei OpenStream - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
oNewWMObject.Unlock()
Try
System.IO.File.Delete(My.Settings.vWLaufwerk & ":" & endgültigerDateiname)
Catch ex1 As Exception
End Try
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer.Done()
oStopWatchTimerC.Done()
End If
Return -1
End Try
If Err.Number > 0 Then
ClassLoggerDI.Add(" FEHLER bei OpenStream - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
oNewWMObject.Unlock()
System.IO.File.Delete(My.Settings.vWLaufwerk & ":" & endgültigerDateiname)
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer.Done()
oStopWatchTimerC.Done()
End If
Return -1
'MsgBox(Err.Description)
End If
DetailLog("oWMStream erzeugt")
' give fileIO helper object the windream stream
_Step = "3.4"
DetailLog("_Step: " & _Step)
oFileIO.aWMStream = oWMStream
If Err.Number > 0 Then
ClassLoggerDI.Add(" FEHLER bei Zuweisen aWMStream zu aFileIO - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
oNewWMObject.Unlock()
System.IO.File.Delete(My.Settings.vWLaufwerk & ":" & endgültigerDateiname)
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer.Done()
oStopWatchTimerC.Done()
End If
Return -1
'MsgBox(Err.Description)
End If
' let fileIO object import the original file into windream
oFileIO.ImportOriginal(True)
If Err.Number > 0 Then
ClassLoggerDI.Add(" FEHLER bei FileIO.ImportOriginal(True) - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
oNewWMObject.Unlock()
System.IO.File.Delete(My.Settings.vWLaufwerk & ":" & endgültigerDateiname)
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer.Done()
oStopWatchTimerC.Done()
End If
Return -1
' MsgBox(Err.Description)
End If
DetailLog("Inhalt der Datei konnte übertragen werden")
' close the windream file stream
_Step = "3.5"
DetailLog("_Step: " & _Step)
oWMStream.Close()
If Err.Number > 0 Then
ClassLoggerDI.Add(" FEHLER bei aWMStream.Close() - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
oNewWMObject.Unlock()
System.IO.File.Delete(My.Settings.vWLaufwerk & ":" & endgültigerDateiname)
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer.Done()
oStopWatchTimerC.Done()
End If
Return -1
'MsgBox(Err.Description)
End If
' save new windream object
oNewWMObject.save()
If Err.Number > 0 Then
ClassLoggerDI.Add(" FEHLER bei WMObject.save - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
oNewWMObject.Unlock()
System.IO.File.Delete(My.Settings.vWLaufwerk & ":" & endgültigerDateiname)
Return -1
'MsgBox(Err.Description)
End If
DetailLog("Datei konnte gespeichert werden")
' unlock the windream object
_Step = "3.6"
DetailLog("_Step: " & _Step)
oNewWMObject.unlock()
If Err.Number > 0 Then
ClassLoggerDI.Add(" FEHLER bei WMObject.unlock - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
oNewWMObject.Unlock()
System.IO.File.Delete(My.Settings.vWLaufwerk & ":" & endgültigerDateiname)
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer.Done()
oStopWatchTimerC.Done()
End If
Return -1
'MsgBox(Err.Description)
End If
If _windream.oWMSession.WMObjectExists(WMEntityDocument, endgültigerDateiname.Replace(My.Settings.vWLaufwerk & ":", ""), 0, 0) = False Then
ClassLoggerDI.Add(Now.ToShortTimeString & " >> File '" & DI_STREAMRESULTFILE & "' should exist in windream but WMObjectExists returned 'false' ...", True)
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer.Done()
oStopWatchTimerC.Done()
End If
Return -1
End If
'DATEI GRÖSSE ERMITTELN - MANCHMAL KOMMT ES VOR DAS DATEIGRÖße 0 ist
_Step = "3.7"
DetailLog("_Step: " & _Step)
Dim oFILenth As FileInfo
Dim oIFLength As Long
If My.Settings.DIOpt_CheckLength = True Then
oFILenth = New FileInfo(My.Settings.vWLaufwerk & ":" & endgültigerDateiname)
oIFLength = oFILenth.Length
DetailLog(">>Length der Zieldatei: " & oIFLength.ToString)
End If
If (My.Settings.DIOpt_CheckLength = True And oIFLength > 0 And Err.Number = 0) Or Err.Number = 0 Then
_Step = "4"
DetailLog(">>_Step: " & _Step)
If My.Settings.StopwatchTimerActive = True Then oStopWatchTimer.Done()
If My.Settings.StopwatchTimerActive = True Then oStopWatchTimer = New SW($"{oFilenameOnly}-IndexStreamFile")
If Me.DateiIndexieren(filenameQuelle, endgültigerDateiname) = False Then
Try
oNewWMObject.Unlock()
Catch ex As Exception
End Try
Try
ClassLoggerDI.Add("DateiIndexieren = False: FEHLER bei Dateiindexieren!!")
ClassLoggerDI.Add("Datei [" & endgültigerDateiname & "] wird wieder gelöscht!")
System.IO.File.Delete(My.Settings.vWLaufwerk & ":" & endgültigerDateiname)
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer.Done()
oStopWatchTimerC.Done()
End If
Catch ex As Exception
ClassLoggerDI.Add(" Datei konnte nicht gelöscht werden! " & ex.Message)
End Try
Return -1
End If
Dim p As String
If endgültigerDateiname.StartsWith("\") Then
If endgültigerDateiname.StartsWith("\\") Then
p = endgültigerDateiname.Replace("\\", "\")
Else
p = endgültigerDateiname
End If
Else
p = "\" & endgültigerDateiname
End If
DI_STREAMRESULTFILE = My.Settings.vWLaufwerk & ":" & p
If _windream.oWMSession.WMObjectExists(WMEntityDocument, DI_STREAMRESULTFILE.Replace(My.Settings.vWLaufwerk & ":", ""), 0, 0) = True Then
ClassLoggerDI.Add(Now.ToString & " >> Datei '" & DI_STREAMRESULTFILE & "' wurde erfolgreich nach windream importiert!", False)
If My.Settings.StopwatchTimerActive = True Then
Dim oSWResult = oStopWatchTimerC.Done()
Try
If oSWResult < SWBesttime Then
ClassLoggerDI.Add($"New Besttime for StreamFile: 0.{oSWResult.ToString} seconds")
SWBesttime = oSWResult
End If
Catch ex As Exception
End Try
End If
Return 0
Else
ClassLoggerDI.Add(Now.ToString & " >> File '" & DI_STREAMRESULTFILE & "' should exist in windream but WMObjectExists returned 'false' ...", True)
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer.Done()
oStopWatchTimerC.Done()
End If
Return -1
End If
Else
If My.Settings.DIOpt_CheckLength = True And oIFLength = 0 Then
_Step = "5"
DetailLog(">>_Step: " & _Step)
System.IO.File.Delete(My.Settings.vWLaufwerk & ":" & endgültigerDateiname)
ClassLoggerDI.Add(" FEHLER bei Datei-Übertragen - FileLength ist 0, Übertragene Datei wurde gelöscht- Überprüfen Sie Log-File")
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer.Done()
End If
Return -1
End If
End If
Else
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer.Done()
oStopWatchTimerC.Done()
End If
Return -1
End If
Else
DetailLog("targetPath exisitiert NICHT")
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer.Done()
oStopWatchTimerC.Done()
End If
Return -2
End If
Catch ex As Exception
ClassLoggerDI.Add("Unexpected Error in Stream_File: " & ex.Message, True)
Try
If My.Settings.StopwatchTimerActive = True Then
oStopWatchTimer.Done()
oStopWatchTimerC.Done()
End If
Catch ex1 As Exception
End Try
Return -1
End Try
End Function
Private Function file_exists(ByVal _file As String)
Try
_file = _file.Replace("W:", "\\windream\objects")
If System.IO.File.Exists(_file) Then
Return True
Else
Return False
End If
Catch ex As Exception
ClassLoggerDI.Add(" Fehler in file exists")
Return False
End Try
End Function
#End Region
#Region "***** Indexe und Werte organisieren *****"
''' <summary>
''' Liefert Indexierungsinformationen bezüglich der angegebenen Datei.
''' </summary>
''' <param name="filename">Dateiname der Datei</param>
''' <returns>Liefert eine verschachtelte ArrayList mit Indexierunsinformationen</returns>
''' <remarks>
''' Das zurückgelieferte Array hat folgende Struktur:
''' + ArrayList
''' +-> Dateiname
''' +-> ArrayList
''' +-> Indexname 1
''' +-> ArrayList
''' +-> Wert 1
''' +-> Wert 2
''' +-> ...
''' +-> ArrayList
''' +-> Indexname 2
''' +-> ArrayList
''' +-> Wert 1
''' +-> Wert 2
''' +-> ...
''' </remarks>
Private Function GetArrayZuDatei(ByVal filename As String)
For Each element As ArrayList In Me.arrayDateiinformationen
If element(0) = filename Then Return element
Next
Return Nothing
End Function
''' <summary>
''' Übergibt einer in windream gespeicherten Datei Indexwerte
''' </summary>
''' <param name="pFilenameQuelle">Name der zu indexierenden Datei</param>
''' <param name="pFilenameZiel">neuer Name der zu indexierenden Datei</param>
''' <returns>Liefert True wenn das Indexieren erfolgreich war, sonst False</returns>
''' <remarks></remarks>
Private Function DateiIndexieren(ByVal pFilenameQuelle As String, ByVal pFilenameZiel As String)
Try
DetailLog("DateiIndexieren wurde aufgerufen")
'Die Werte zusammenfügen
Dim oArrayList As ArrayList = Me.GetArrayZuDatei(pFilenameQuelle)
Dim WMObject As WINDREAMLib.WMObject '= CreateObject("WINDREAMLib.WMObject") 'New WINDREAMLib.WMObject
If oArrayList Is Nothing Then
ClassLoggerDI.Add($"ERROR in DateiIndexieren in DateiIndexieren: oArrayList is nothing!!", False)
Return False
End If
'MsgBox("DateiIndexieren:" & vbNewLine & ClassDateiimportWindream.GetWindreamDriveLetter & filenameZiel & vbNewLine & Me.selectedProfile.DokumenttypString)
' SingleNode leeren
Me.singleInfoNode = New ArrayList
' Hier die grundsätzlichen Informationen übergeben
Me.singleInfoNode.Add("Ziel: " & My.Settings.vWLaufwerk & ":" & pFilenameZiel) '_windream.GetWindreamDriveLetter & filenameZiel)
' den Dokumenttyp schreiben
If INDEXIEREN_DURCHFÜHREN Then
DetailLog("Indexieren wird gestartet ##")
Try
' ein windream-Objekt der Datei anlegen
WMObject = _windream.oWMSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, pFilenameZiel)
Catch ex As Exception
ClassLoggerDI.Add("Could not create windreamobject for filestring: " & pFilenameZiel, True)
ClassLoggerDI.Add("Error: " & ex.Message, False)
Return False
End Try
Try
' die Datei sperren
WMObject.lock()
Catch ex As Exception
' nichts tun (Datei ist bereits gesperrt)
End Try
' wenn der Datei noch kein Dokumenttyp zugewiesen wurde
If WMObject.aObjectType.aName = "Standard" Then
Dim profil As ClassDIProfil = Me.selectedProfile
' ihr den entsprechenden Dokumenttyp zuweisen
WMObject.aObjectType = _windream.oWMSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, Me.selectedProfile.DokumenttypString)
' WMObject.aObjectType = Me.selectedProfile.Dokumenttyp
DetailLog("Objekttyp wird gesetzt")
Else
If WMObject.aObjectType.aName <> "Standard" Then
ClassLoggerDI.Add(">> ACHTUNG: Ein Objekttyp war bereits gesetzt ==> " & WMObject.aObjectType.aName, False)
End If
DetailLog("Objekttyp war bereits gesetzt")
End If
Try
WMObject.Save()
Catch ex As Exception
' wenn es einen Fehler beim speichern gab, dann konnte auch kein Dokumenttyp gesetzt werden -> es kann also auch keine
' Indexierung stattfinden und die Indexierung muss nicht fortgesetzt werden
ClassLoggerDI.Add(">> Error while saving Object: " & ex.Message, False)
Return False
End Try
Try
WMObject.unlock()
Catch ex As Exception
' wenn das entsperren nicht geklappt hat, dann war die Datei auch nicht gesperrt
End Try
DetailLog("Datei wurde gespeichert / Unlock wurde durchgeführt")
' wenn bis hierher alles geklappt hat wurde ein Dokumenttyp übergeben
' dies wird an das Array für den TreeView-Log übergeben
Me.singleInfoNode.Add("Objekttyp: " & Me.selectedProfile.DokumenttypString)
DetailLog("Objekttyp: " & Me.selectedProfile.DokumenttypString)
Else
ClassLoggerDI.Add($"INDEXIEREN_DURCHFÜHREN: {INDEXIEREN_DURCHFÜHREN}")
End If
' wenn keine Werte vorhanden sind, soll wenigstens der Dokumenttyp eingetragen werden
Try
If oArrayList(1) Is Nothing Then
ClassLoggerDI.Add($"Attention: oArrayList(1) is nothing!!", False)
Return False
End If
Catch ex As Exception
' wenn ein Fehler auftrat -> Fehler vermerken
Me.singleInfoNode.Add(" - ACHTUNG: Der Datei wurde kein Index zugewiesen.")
' an die Gesamtauflistung übergeben
Me.TreeNodeInfos.Add(Me.singleInfoNode)
Return False
End Try
Dim indexe As String = ""
For i As Integer = 1 To oArrayList.Count - 1
Dim indexname As String = oArrayList(i)(0)
Dim werte
DetailLog("Indexname: '" & indexname & "'")
If (_windream.GetTypeOfIndexAsIntByName(indexname) = WMObjectVariableValueTypeVector) Or _windream.GetTypeOfIndexAsIntByName(indexname) = 4097 Then
DetailLog("Es handelt sich um ein Vektor-Feld")
werte = New ArrayList
For Each wert As String In oArrayList(i)(1)
'Am 04.08.2014 aktualisiert: um zu verhindern das die vorangegangene Versionierung "Tilde-Werte" schreibt
Dim IndexValue = wert
DetailLog("Wert vor Überprüfung: " & IndexValue)
IndexValue = CheckIndexValue(IndexValue)
'Ausstieg da Fehler in der Überprüfung
If IndexValue Is Nothing Then
Return False
End If
DetailLog("Value für Indexierung: " & IndexValue)
werte.Add(IndexValue)
Next
DetailLog("Werte zu Array hinzugefügt!")
Else
'Am 04.08.2014 aktualisiert: um zu verhindern das die vorangegangene Versionierung "Tilde-Werte" schreibt
Dim IndexValue = oArrayList(i)(1)(0)
DetailLog("Value vor Überprüfung: " & IndexValue)
IndexValue = CheckIndexValue(IndexValue)
'Ausstieg da Fehler in der Überprüfung
If IndexValue Is Nothing Then
Return False
End If
DetailLog("Value für Indexierung: " & IndexValue)
werte = IndexValue
End If
'indexe &= indexname & " = " & werte & vbNewLine
'Der Indexierungsvorgang
Dim indexErgebnis As ArrayList = Me.Indexiere(pFilenameZiel, indexname, werte)
For Each indexInfo As String In indexErgebnis
Me.singleInfoNode.Add(indexInfo)
Next
Next
Me.TreeNodeInfos.Add(Me.singleInfoNode)
Return True
Catch ex As Exception
ClassLoggerDI.Add("Hinweis: Die Datei " & pFilenameZiel & " konnte nicht indexiert werden.")
ClassLoggerDI.Add("Fehler: " & ex.Message)
Return False
End Try
End Function
Private Function CheckIndexValue(ByVal input)
Try
'Ersetzt die Versionierungen Tilde(~) und Klammern ((1))
For i As Integer = 1 To 20
If input.ToString.EndsWith("~" & i.ToString) Then
input = input.ToString.Replace("~" & i.ToString, "")
ElseIf input.ToString.EndsWith("(" & i.ToString & ")") Then
input = input.ToString.Replace("(" & i.ToString & ")", "")
End If
Next
Return input
Catch ex As Exception
ClassLoggerDI.Add("Fehler in CheckIndexValue: " & ex.Message)
Return Nothing
End Try
End Function
''' <summary>
''' Diese Funktion überprüft ob eine Variable ein Array ist, oder nicht.
''' </summary>
''' <param name="arrayOrNot">Variable die überprüft werden soll</param>
''' <returns>Liefert True wenn es sich um ein Array handelt, sonst False</returns>
''' <remarks></remarks>
Private Function IsArray(ByVal arrayOrNot As Object)
Dim arrayType As String = UCase(arrayOrNot.GetType.ToString)
' überprüft an welcher Stelle sich ein '['-Zeichen befindet
Dim position = InStr(arrayType, "[")
' existiert ein '['-Zeichen, so handelt es sich um ein Array (GetType wäre System.Object[])
If Not position = 0 Then
Return True
Else
Return False
End If
End Function
''' <summary>
''' Diese Funktion überprüft ob eine Variable eine ArrayList ist, oder nicht.
''' </summary>
''' <param name="arrayOrNot">Variable die überprüft werden soll</param>
''' <returns>Liefert True wenn es sich um eine ArrayList handelt, sonst False</returns>
''' <remarks></remarks>
Private Function IsArrayList(ByVal arrayOrNot As Object)
Dim arrayType As String = UCase(arrayOrNot.GetType.ToString)
' überprüft an welcher Stelle sich ein '['-Zeichen befindet
Dim position = InStr(arrayType, "[")
' existiert ein '['-Zeichen, so handelt es sich um ein Array (GetType wäre System.Object[])
If arrayOrNot.GetType.ToString = "System.Collections.ArrayList" Then
Return True
Else
Return False
End If
End Function
''' <summary>
''' Diese Funktion errechnet aus einem Datum den Unix-Timestamp
''' </summary>
''' <param name="FromDateTime">Datum, für das der Timestamp errechnet werden soll</param>
''' <returns>Liefert den Timestamp als Integer</returns>
''' <remarks></remarks>
Private Function GetTimestamp(ByVal FromDateTime As DateTime) As Integer
If IsDate(FromDateTime) Then
Dim Startdate As DateTime = #1/1/1970#
Dim Spanne As TimeSpan
' vom Datum das Datum des "Beginns der Zeitrechnung" abziehen
Spanne = FromDateTime.Subtract(Startdate)
' die Zeitspanne in einen Integer umwandeln
Return CType(Math.Abs(Spanne.TotalSeconds()), Integer)
Else
Return 0
End If
End Function
''' <summary>
''' Führt das eigendliche Indexieren aus
''' </summary>
''' <param name="filenameZiel">Dateiname der zu indexierenden Datei</param>
''' <param name="index">Name des zu indexierenden Indexfeldes</param>
''' <param name="werte">Der Wert/die Werte die dem Index zugewiesen werden sollen</param>
''' <returns>Liefert True wenn das Indexieren erfolgreich war, sonst False</returns>
''' <remarks></remarks>
Private Function Indexiere(ByVal filenameZiel As String, ByVal index As String, ByVal werte As Object) As ArrayList
Dim type = werte.GetType
DetailLog("In Indexierungsvorgang für: " & filenameZiel)
Dim indexInfos = New ArrayList
Dim count_Values As Integer
If type.FullName = "System.String" Then
count_Values = 1
Else
Try
For Each wert As Object In werte
count_Values += 1
Next
Catch ex As Exception
count_Values = 1
End Try
End If
Try
Dim WMObject As WINDREAMLib.WMObject = Nothing '= CreateObject("WINDREAMLib.WMObject") '= New WINDREAMLib.WMObject 'CreateObject("WINDREAMLib.WMObject")
'MsgBox("Indexiere: " & vbNewLine & filenameZiel)
Dim indexBeschreibung As String = ""
'werte Is Nothing Or _
' überprüfen ob alle notwendigen Informationen angegeben wurden (sonst abbrechen)
If filenameZiel Is Nothing Or
filenameZiel = "" Or
index Is Nothing Or
index = "" Or
Not _windream.ExistIndexInObjekttyp(Me.selectedProfile.DokumenttypString, index) Then
indexInfos.Add("Hinweis: Die Datei wurde auf Grund eines Problems in der Initialisierung nicht vollständig indexiert.")
DetailLog("Hinweis: Die Datei wurde auf Grund eines Problems in der Initialisierung nicht vollständig indexiert.")
Return indexInfos
End If
Dim ofileExists As Boolean
If INDEXIEREN_DURCHFÜHREN Then
' prüfen ob die zu indexierende Datei existiert
ofileExists = My.Computer.FileSystem.FileExists(My.Settings.vWLaufwerk & ":" & filenameZiel) '_windream.GetWindreamDriveLetter
Else
ofileExists = True
End If
Dim an As Integer = 0
Do While My.Computer.FileSystem.FileExists(My.Settings.vWLaufwerk & ":" & filenameZiel) = False
If an > 500 Then
ofileExists = False
Exit Do
Else
DetailLog("Achtung: Datei exisitiert noch nicht: " & My.Computer.Clock.LocalTime)
End If
an = an + 1
Loop
' wenn die Datei existiert
If ofileExists Then
If INDEXIEREN_DURCHFÜHREN Then WMObject = _windream.oWMSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, filenameZiel)
' eine Variable für den umgewandelten Indexwert anlegen (kein Typ, da noch unklar ist was reingeschrieben wird)
Dim convertValue = Nothing
' den Typ des Zielindexes auslesen
Dim TypDesIndexes As Integer
Try
If INDEXIEREN_DURCHFÜHREN Then
' ein windream-Objekt der Datei anlegen
WMObject = _windream.oWMSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, filenameZiel)
If My.Settings.vLogErrorsonly = False Then
ClassLoggerDI.Add(" - windream-Objekt der Datei erzeugt", False)
ClassLoggerDI.Add(" - Ziel: W:\" & filenameZiel, False)
End If
Try
' die Datei sperren
WMObject.lock()
Catch ex As Exception
End Try
' wenn der Datei noch kein Dokumenttyp zugewiesen wurde
If WMObject.aObjectType.aName = "Standard" Then
' ihr den entsprechenden Dokumenttyp zuweisen
WMObject.aObjectType = _windream.oWMSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, Me.selectedProfile.DokumenttypString)
End If
End If
' wenn keine Werte vorhanden sind, soll wenigstens der Dokumenttyp eingetragen werden
If werte Is Nothing Then
If INDEXIEREN_DURCHFÜHREN Then
Try
WMObject.Save()
WMObject.unlock()
Catch ex As Exception
End Try
End If
Return Me.singleInfoNode
End If
' den Typ des Zielindexes auslesen
TypDesIndexes = _windream.GetTypeOfIndexAsIntByName(index)
' wenn es sich bei dem Index NICHT um ein Vektorfeld handelt
If TypDesIndexes < WMObjectVariableValueTypeVector Then
indexInfos.Add("Bei dem Zielindex handelt es sich um einen Einzelindex.")
DetailLog("Bei dem Zielindex handelt es sich um einen Einzelindex.")
' wenn es sich bei der Variablen mit den ausgelesenen Indexwerten um ein Array oder eine ArrayList handelt
If Me.IsArray(werte) Or Me.IsArrayList(werte) Then
' ein Backup der Indexwerte anlegen
Dim temp As Object = werte
' und die eigendliche Variable zurücksetzen
werte = Nothing
' dann soll nur der letzte Wert des Arrays übernommen werden, damit nicht versucht wird ein
' Array in einen Einzelindex zu speichern
werte = temp(temp.Length - 1)
End If
Else
indexInfos.Add("Bei dem Zielindex handelt es sich um ein Vektorfeld.")
DetailLog("Bei dem Zielindex handelt es sich um ein Vektorfeld.")
' ein Backup der Indexwerte anlegen
Dim temp As Object = werte
' und die eigentliche Variable zurücksetzen
werte = Nothing
' dann soll nur der letzte Wert des Arrays übernommen werden, damit nicht versucht wird ein
' Array in einen Einzelindex zu speichern
werte = temp
DetailLog("Array geleert und erneuert!")
End If
indexBeschreibung = "Zielindex: " & index & " => "
Catch ex As Exception
indexInfos.Add("Hinweis: Beim Initialisieren der Datei auf dem windream-Laufwerk ist ein Fehler aufgetreten.")
ClassLoggerDI.Add("Hinweis: Beim Initialisieren der Datei auf dem windream-Laufwerk ist ein Fehler aufgetreten.", False)
Return indexInfos
End Try
Try
' den Typ des Zielindexes
DetailLog("Typ des Indexes: " & TypDesIndexes.ToString)
Select Case (TypDesIndexes)
Case WMObjectVariableValueTypeUndefined ' zu klären !!!!
convertValue = vbEmpty
Case WMObjectVariableValueTypeString
''Führende Nullen Entfernen
'If werte.ToString.StartsWith("0") Then
' Dim wert As String = CStr(CInt(werte.ToString))
' convertValue = wert
' ClassLoggerDI.Add(" - Führende Nullen wurden entfernt", False)
'Else
' convertValue = CStr(werte)
'End If
convertValue = CStr(werte)
If convertValue.ToString.Contains("~1") Then
convertValue = convertValue.ToString.Replace("~1", "")
End If
If convertValue.ToString.Contains("~2") Then
convertValue = convertValue.ToString.Replace("~2", "")
End If
If convertValue.ToString.Contains("~3") Then
convertValue = convertValue.ToString.Replace("~3", "")
End If
If convertValue.ToString.Contains("~4") Then
convertValue = convertValue.ToString.Replace("~4", "")
End If
Case WMObjectVariableValueTypeInteger
Try
convertValue = CInt(werte)
Catch ex As Exception
ClassLoggerDI.Add("Convert value to integer", $"Error while converting value [{werte}] to integer", ex)
indexInfos.Add($"Error while converting value [{werte}] to integer")
Return indexInfos
End Try
Case 11
convertValue = Convert.ToInt64(werte)
Case WMObjectVariableValueTypeFloat
werte = werte.ToString.Replace(".", ",")
convertValue = CDbl(werte)
Case WMObjectVariableValueTypeBoolean
Try
convertValue = CBool(werte)
Catch ex As Exception
' Nothing zuweisen damit SetVariableValue nicht ausgeführt wird
'convertValue = Nothing
End Try
Case WMObjectVariableValueTypeDate
If (IsDate(werte)) Then
convertValue = CDate(werte)
Else
convertValue = vbEmpty
End If
Case WMObjectVariableValueTypeFixedPoint
werte = werte.ToString.Replace(".", ",")
convertValue = CDbl(werte)
Case WMObjectVariableValueTypeTimeStamp
Dim timestamp As Integer = Me.GetTimestamp(werte)
If timestamp > 0 Then
convertValue = timestamp
Else
convertValue = vbEmpty
End If
Case WMObjectVariableValueTypeCurrency
Dim aValue As System.Runtime.InteropServices.CurrencyWrapper = New System.Runtime.InteropServices.CurrencyWrapper(werte)
convertValue = aValue
Case WMObjectVariableValueTypeTime
If (IsDate(werte)) Then
convertValue = CDate(werte) ' ggf. aber nur die Zeit
Else
convertValue = vbEmpty
End If
Case WMObjectVariableValueTypeVariant
convertValue = werte
Case WMObjectVariableValueTypeMask ' zu klären !!!!
convertValue = vbEmpty
Case WMObjectVariableValueFlagMask ' zu klären !!!!
convertValue = vbEmpty
Case WMObjectVariableValueTypeFulltext
convertValue = CStr(werte)
Case WMObjectVariableValueTypeDefaultValue ' zu klären !!!!
convertValue = vbEmpty
Case Else
' wenn es sich um einen TypVektorIndex handelt
If TypDesIndexes >= 4096 And TypDesIndexes < 8192 Or TypDesIndexes = 36865 Or TypDesIndexes = 8 Then
DetailLog("Es handelt sich um einen Vektorindex")
Dim oTemp_arr As New ArrayList
Select Case TypDesIndexes
Case 4097
DetailLog("VektorIndex vom Typ 4097")
For Each wert As Object In werte
oTemp_arr.Add(CStr(wert))
DetailLog("Wert " & CStr(wert) & " konvertiert")
Next
Case 4098
DetailLog("VektorIndex vom Typ 4098 Integer")
If count_Values = 1 Then
oTemp_arr.Add(CInt(werte))
Else
For Each wert As Object In werte
oTemp_arr.Add(CInt(wert))
Next
End If
Case 4099
DetailLog("VektorIndex vom Typ 4099 (Float)")
If count_Values = 1 Then
werte = werte.ToString.Replace(".", ",")
oTemp_arr.Add(CDbl(werte))
Else
For Each wert As Object In werte
wert = wert.ToString.Replace(".", ",")
oTemp_arr.Add(CDbl(wert))
Next
End If
Case 8
DetailLog("VektorIndex vom Typ 8 (Boolean)")
If count_Values = 1 Then
oTemp_arr.Add(CBool(werte))
Else
For Each wert As Object In werte
oTemp_arr.Add(CBool(wert))
Next
End If
Case 4100
DetailLog("VektorIndex vom Typ 4100 (Boolean)")
If count_Values = 1 Then
oTemp_arr.Add(CBool(werte))
Else
For Each wert As Object In werte
oTemp_arr.Add(CBool(wert))
Next
End If
Case 8204
DetailLog("VektorIndex vom Typ 8204 (Boolean)")
If count_Values = 1 Then
oTemp_arr.Add(CBool(werte))
Else
For Each wert As Object In werte
oTemp_arr.Add(CBool(wert))
Next
End If
Case 4101
DetailLog("VektorIndex vom Typ 4101 Date")
For Each wert As Object In werte
'wert =
oTemp_arr.Add(CDate(wert))
Next
Case 4107 ' Vektor64bit
oTemp_arr.Add(Convert.ToInt64(werte))
'convertValue = Convert.ToInt64(werte)
Case WMObjectVariableValueTypeTimeStamp
DetailLog("VektorIndex vom Typ DateTime " & WMObjectVariableValueTypeTimeStamp.ToString)
For Each wert As Object In werte
oTemp_arr.Add(CLng(wert))
Next
Case 4104
DetailLog("VektorIndex vom Typ Currency")
For Each wert As Object In werte
Dim aValue As System.Runtime.InteropServices.CurrencyWrapper = New System.Runtime.InteropServices.CurrencyWrapper(werte)
oTemp_arr.Add(aValue)
Next
Case 4107
DetailLog("VektorIndex vom Typ Integer 64bit")
If count_Values = 1 Then
oTemp_arr.Add(Convert.ToInt64(werte))
Else
For Each wert As Object In werte
oTemp_arr.Add(Convert.ToInt64(wert))
Next
End If
Case 36865
DetailLog("VektorIndex vom Typ 36865")
Try
oTemp_arr.Add(CStr(werte))
Catch ex As Exception
oTemp_arr.Add(werte)
End Try
Case WMObjectVariableValueTypeUndefined
DetailLog("VektorIndex Undefined")
convertValue = ""
Case WMObjectVariableValueTypeBoolean
DetailLog("VektorIndex Boolean")
For Each wert As Object In werte
Try
oTemp_arr.Add(CBool(wert))
Catch ex As Exception
' Nothing zuweisen damit SetVariableValue nicht ausgeführt wird
oTemp_arr = Nothing
End Try
Next
Case WMObjectVariableValueTypeFixedPoint
DetailLog("VektorIndex WMObjectVariableValueTypeFixedPoint")
For Each wert As Object In werte
oTemp_arr.Add(CDbl(wert))
Next
Case WMObjectVariableValueTypeTime
DetailLog("VektorIndex WMObjectVariableValueTypeTime")
For Each wert As Object In werte
oTemp_arr.Add(CDate(wert))
Next
Case WMObjectVariableValueTypeVariant
DetailLog("VektorIndex WMObjectVariableValueTypeVariant")
' dann bleiben alle Werte wie sie sind
End Select
If oTemp_arr.Count > 0 Then
DetailLog("Einträge in temp_arr also Speichern des Arrays in convertValue")
convertValue = Nothing
convertValue = oTemp_arr.ToArray
Else
convertValue = vbEmpty
End If
DetailLog("Werte erfolgreich konvertiert")
Else
convertValue = vbEmpty
End If
End Select
Catch ex As Exception
' einen Hinweis über einen aufgetretenen Fehler an das Array für den TreeView-Log anhängen
indexInfos.Add("Hinweis: beiAuswerten/Konvertieren des Typs ist ein Fehler aufgetreten.")
ClassLoggerDI.Add("Fehler bei Auswerten/Konvertieren des Typs!", ex.Message)
' die Indexierungsinformationen für den TreeView-Log zurückgeben
Return indexInfos
End Try
Try
If INDEXIEREN_DURCHFÜHREN Then
' ***** Anmerkung: das Nachindexieren mit vbEmpty ist möglich (siehe oben) jedoch nicht *****
' ***** das Indexieren mit einem Nothing-Wert !!! *****
' wenn das Konvertieren soweit gut gelaufen ist (also kein Nothing-Wert zugewiesen wurde)
If convertValue IsNot Nothing Then
' den konvertierten Indexwert dem entsprechenden Index zuweisen
WMObject.SetVariableValue(index, convertValue)
If My.Settings.vLogErrorsonly = False Then
ClassLoggerDI.Add(" - den konvertierten Indexwert dem entsprechenden Index zuweisen", False)
ClassLoggerDI.Add(" - Indexname: " & index.ToString, False)
ClassLoggerDI.Add(" - Indexwert: " & convertValue.ToString, False)
End If
If index = selectedProfile.Link2Navision_dokart Then
_Link2NavDokumentart = convertValue.ToString
End If
If index = selectedProfile.Link2Navision_Index Then
_Link2NavIndexwert = convertValue.ToString
End If
End If
' die Indexinformationen des Dokuments speichern
WMObject.Save()
DetailLog("die Indexinformationen des Dokuments speichern")
' Unlock in einem unbehandelten Try-Block um Fehler abzufangen,
' wenn eine Datei nicht gesperrt ist
Try
' die Sperrung des Dokuments aufheben
WMObject.unlock()
DetailLog("die Sperrung des Dokuments aufheben")
Catch ex As Exception
' nichts tun (Datei war nicht gesperrt)
End Try
End If
If convertValue IsNot Nothing Then
' sonst die Indexbeschreibung löschen, damit sie im TreeView-Log nicht auftaucht
indexBeschreibung &= convertValue.ToString
Else
indexBeschreibung = Nothing
End If
Catch ex As Exception
If INDEXIEREN_DURCHFÜHREN Then
' auch wenn ein Fehler aufgetreten ist muss das Dokument gespeichert werden, um den Dokumenttypen zu speichern
WMObject.Save()
' Unlock in einem unbehandelten Try-Block um Fehler abzufangen,
' wenn eine Datei nicht gelocked ist
Try
WMObject.unlock()
Catch ex2 As Exception
' nichts tun (Datei war nicht gesperrt)
End Try
End If
' Nachricht für den TreeView-Log
indexBeschreibung &= "konnte nicht indexiert werden"
ClassLoggerDI.Add(" DATEI konnte nicht indexiert werden", True)
End Try
' wenn eine Indexbeschreibung vorliegt -> diese an das Array für den TreeView-Log anhängen
If indexBeschreibung IsNot Nothing Then
' Indexierungsnachricht an Array für TreeView-Log anhängen
indexInfos.Add(indexBeschreibung)
End If
' die Indexierungsinformationen für den TreeView-Log zurückgeben
Return indexInfos
Else
' die Indexierungsinformationen für den TreeView-Log zurückgeben
indexInfos.Add("Hinweis: Die Datei hat zum Zeitpunkt der Indexierung noch nicht auf dem windream-Laufwerk existiert.")
ClassLoggerDI.Add(" Hinweis: Die Datei hat zum Zeitpunkt der Indexierung noch nicht auf dem windream-Laufwerk existiert.", False)
End If
Catch ex As Exception
indexInfos.Add("Hinweis: Unbekannter Fehler beim Indexieren der Datei.")
ClassLoggerDI.Add("Unbekannter Fehler beim Indexieren der Datei.", True)
ClassLoggerDI.Add(ex.Message)
End Try
Return indexInfos
End Function
#End Region
Private Sub frmDIHauptseite_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
If Formloaded = True Then
If Me.Size.Height > 100 Then
If Not Me.threadDateiimport.IsBusy Then
If Not Me.ErgebnisNochNichtLöschen Then
' alle Profilein die Combobox schreiben
Me.LoadProfilesInCombobox()
' Me.lblLog.Visible = False
' Me.tvLog.Visible = False
Me.progressImport.Visible = False
Me.btnAbbrechen.Visible = False
Me.lblProgress.Visible = False
Me.txtQuellordner.Enabled = False
Me.txtZielordner.Enabled = False
Me.btnQuellordner.Enabled = False
Me.btnZielordner.Enabled = False
Else
Me.ErgebnisNochNichtLöschen = False
End If
Else
Me.ErgebnisNochNichtLöschen = True
End If
End If
End If
End Sub
Private Sub rbManuell_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbManuell.CheckedChanged
If Me.rbManuell.Checked Then
btnDI_Manuell_starten.Enabled = True
Me.btnDurchlauf.Enabled = False
Me.numIntervallDurchlauf.Enabled = False
Else
btnDI_Manuell_starten.Enabled = False
Me.btnDurchlauf.Enabled = True
Me.numIntervallDurchlauf.Enabled = True
End If
End Sub
Private Sub btnDurchlauf_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDurchlauf.Click
If Me._running = False Then
Dim result As MsgBoxResult = MsgBox("Wollen Sie den Durchlauf sofort starten?" & vbNewLine & "'Nein' führt den Durchlauf in " & Me.numIntervallDurchlauf.Value & " Minuten zum ersten mal aus!", MsgBoxStyle.YesNo, "Frage:")
If result = MsgBoxResult.Yes Then
Automatischer_Durchlauf(True)
Else
Automatischer_Durchlauf(False)
End If
Else
Automatischer_Durchlauf(False)
End If
End Sub
Sub Automatischer_Durchlauf(ByVal runnow As Boolean)
Try
If Me._running = False Then
If Not threadDateiimport.IsBusy Then
ClassLoggerDI.Init("", My.Settings.vLogDI & "_", True)
Me._running = True
Me.btnDurchlauf.Text = "Dateiimport stoppen"
Me.btnDI_Manuell_starten.Enabled = False
Me.numIntervallDurchlauf.Enabled = False
Me.lblLog.Visible = True
Me.tvLog.Visible = True
Me.Durchlauf = True
Me.timRun_Dateiimport.Interval = Me.numIntervallDurchlauf.Value * 60 * 1000
Me.timRun_Dateiimport.Start()
My.Settings.Save()
'Direkt einen Durchlauf starten
If runnow = True Then
Thread.Sleep(3000)
Run_Profildurchlauf()
End If
Else
MsgBox("Die Prozesse des Dateiimporters laufen noch")
End If
Else
Me._running = False
Me.btnDurchlauf.Text = "Durchlauf für Dateiimport starten"
Me.lblLetzter_Durchlauf.Visible = False
Me.numIntervallDurchlauf.Enabled = True
Me.lblLog.Visible = False
Me.tvLog.Visible = False
Me.timRun_Dateiimport.Stop()
Durchlauf = False
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler bei btnDurchlauf.Click:")
End Try
End Sub
Private Sub timRun_Dateiimport_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timRun_Dateiimport.Tick
Run_Profildurchlauf()
End Sub
Sub Run_Profildurchlauf()
If Not threadDateiimport.IsBusy Then
If My.Settings.Sleep_Begin > 0 And My.Settings.Sleep_End > 0 Then
If Now.Hour >= My.Settings.Sleep_Begin And Now.Hour <= My.Settings.Sleep_End Then
clsLogger.Add(String.Format(">> ToolCollection is in SleepMode - {0}-{1}-{2}", Now.Hour.ToString, My.Settings.Sleep_Begin.ToString, My.Settings.Sleep_End.ToString), False)
Exit Sub
End If
End If
Me.lblLetzter_Durchlauf.Visible = True
Backgroundtask_Dateiimport_starten()
Me.lblLetzter_Durchlauf.Text = "Letzter Durchlauf: " & My.Computer.Clock.LocalTime
End If
End Sub
Private Sub Standards_Ueberpruefen()
If Not My.Computer.FileSystem.DirectoryExists(Me.txtQuellordner.Text) And Not My.Computer.FileSystem.DirectoryExists(Me.txtZielordner.Text) Then
MsgBox("Es wurde kein gültiges Verzeichnis angegeben. Mindestens eines der angegebenen Verzeichnisse existiert nicht.", MsgBoxStyle.Exclamation, "Ungültige Eingabe")
Alles_OK = False
Exit Sub
End If
If Not Me.txtZielordner.Text.Substring(0, 2).ToUpper = My.Settings.vWLaufwerk & ":" Then '_windream.GetWindreamDriveLetter.ToUpper
MsgBox("Das angegebene Zielverzeichnis befindet sich nicht auf einem windream-Laufwerk. Bitte prüfen Sie nochmals Ihre Eingabe.", MsgBoxStyle.Exclamation, "Ungültige Eingabe")
Alles_OK = False
Exit Sub
End If
If Me.selectedProfile.Dokumenttyp Is Nothing Then
MsgBox("Der Objekttyp, der dem Profil zugewiesen ist, scheint auf dem aktuellen windream-Server nicht zu existieren." & vbNewLine &
"Bitte prüfen Sie das Profil auf Richtigkeit." & vbNewLine & vbNewLine &
"Überprüfen Sie bitte ob der Objekttyp in den Profileinstellungen rot dargestellt ist. Ist dies der" & vbNewLine &
"Fall, dann existiert der Objekttyp nicht und das Profil kann auf dem windream-Server, an dem Sie" & vbNewLine &
"gerade angemeldet sind, nicht benutzt werden.", MsgBoxStyle.Exclamation, "Profil mit ungültigem Objekttyp")
Alles_OK = False
Exit Sub
End If
Dim zielVerzeichnisCheck As WINDREAMLib.WMObject = Nothing
Try
zielVerzeichnisCheck = _windream.oWMSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityFolder, Me.txtZielordner.Text.Substring(2))
Catch ex As Exception
End Try
If zielVerzeichnisCheck Is Nothing Then
MsgBox("Es wurde kein gültiges Zielverzeichnis angegeben. Prüfen Sie bitte ob das Verzeichnis auf dem windream-Laufwerk existiert.", MsgBoxStyle.Exclamation, "Ungültige Eingabe")
Alles_OK = False
Exit Sub
End If
End Sub
Private Sub Backgroundtask_Dateiimport_starten()
Me.TreeNodeInfos = New ArrayList
Me.cmbProfilauswahl.Enabled = False
Me.txtQuellordner.Enabled = False
Me.txtZielordner.Enabled = False
Me.btnQuellordner.Enabled = False
Me.btnZielordner.Enabled = False
Me.progressImport.Enabled = True
Me.btnAbbrechen.Enabled = True
Me.lblLog.Visible = True
Me.tvLog.Visible = True
Me.lblProgress.Visible = True
Me.progressImport.Visible = True
Me.btnAbbrechen.Visible = True
Me.btnDI_Manuell_starten.Enabled = False
Me.progressImport.Value = 0
Me.startBackgroundTask()
End Sub
Private Sub frmDIHauptseite_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
End Sub
Private Sub tcMain_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles tcMain.SelectedIndexChanged
My.Settings.Save()
End Sub
Private Sub frmDIHauptseite_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub
End Class