Dateien suchen

Nicole

Mitglied
Hallo
Ich habe ein Programm geschrieben das auf eine Konvertierung von Dateien in das pdf Format zugreift und die Vorbereitung für die Konvertierung vereinfachen soll.
Bei zwei Dingen weiss ich aber nicht mehr weiter.

1. würde ich gerne prüfen wann die pdf Datei konvertiert ist und im Laufwerk V:\...\pdfout erscheint um anzuzeigen das die Konvertierung fertig ist und um die Datei in das Laufwerk zu kopieren aus dem die Ursprungsdatei stammt.

2. Würde ich gerne dieses Programm direkt aus dem Windows Explorer starten und zwar soll das zu konvertierende File ausgewählt werden und über die rechte Maustaste das Programm gestartet werden alllerdings fehlt mir hierzu eine geschickte Lösung.

Wäre super wenn mir jemand weiterhelfen könnte.

Falls es weiterhilft
Mein Code sind wie folgt aus:

Code:
Option Explicit

    Dim FilenameX As String
    Dim DriveX As String
    Dim PathX As String
    Dim FileX As String
    Dim ExtensionX As String
    
Private Sub Drive1_Change()
    Dir1.Path = Drive1.Drive
End Sub

Private Sub Dir1_Change()
    File1.Path = Dir1.Path
End Sub

Private Sub File1_Click()
    Dim FullPath As String
    Dim QuellPath As String
    Dim ZielPath As String
    Dim ZielPathA As String
    Dim FileOut As String
    Dim PauseTime, Start, Finish

'Aufruf der Prozedur zum aufteilen des Pfades seine einzelnen Komponenten

    FullPath = Dir1 & File1
       SplitPath FullPath
             
'Selektiert die angewählte Datei nach der Extension, kopiert diese in
'den entsprechenden Pfad und bereitet und bereitet die Konvertierung vor
    
    Select Case ExtensionX
        Case "doc", "xls"
            QuellPath = FullPath
            ZielPath = "\\pre-wap-konv1\wrdxls-in\" & FilenameX
                FileCopy QuellPath, ZielPath
            ZielPathA = ZielPath & "a"
                FileCopy ZielPath, ZielPathA
                Name ZielPathA As "\\pre-wap-konv1\wrdxls-in\" & FileX & ".rdy"
  
        Case "gl2", "ps", "plt", "hp2", "hpl", "tif", "eps", "EPS", "PS"
            QuellPath = FullPath
            ZielPath = "\\pre-wap-konv1\Konvertierung\hpgltiffps\" & FilenameX
                FileCopy QuellPath, ZielPath
            ZielPathA = ZielPath & "a"
                FileCopy ZielPath, ZielPathA
                Name ZielPathA As "\\pre-wap-konv1\Konvertierung\hpgltiffps\" & FileX & ".rdy"

        
            Case Is <> "xls", "doc", "gl2", "ps", "plt", "hp2", "hpl", "tif"
                MsgBox "Fileformat is not convertable!" & "Please choose the correct format!", _
                vbExclamation, "Attention!"
            Exit Sub
          
    End Select

    ChDir "\\pre-wap-konv1\Konvertierung\"
    Drive1.Drive = "\\pre-wap-konv1\Konvertierung\"
        Dir1.Path = "\\pre-wap-konv1\Konvertierung\pdfout"
        
        MsgBox " Please wait a few seconds! Conversion is running!", vbInformation
   

PauseTime = 30
Start = Timer
Do While Timer < Start + PauseTime
     File1.Filename = Dir1 & "\" & "*.*"
    KonvFile = Dir1 & "\" & FileX & ".pdf"
    If Dir(KonvFile) = FileX & ".pdf" Then
        Finish = Timer
    End If
Loop
        MsgBox " Convertion is finished! ", vbInformation


    QuellPath = Dir1 & "\" & FileX & ".pdf"
    ZielPath = PathX & "\" & FileX & ".pdf"
    FileCopy QuellPath, ZielPath



    Kill QuellPath

    Drive1.Drive = DriveX
    File1.Filename = Dir1 & "\" & "*.*"
End Sub

'Prozedur zur Aufteilung des übergebenen Pfades in seine einzelnen
'Komponenten - Laufwerk, Ordner, Datei

Public Sub SplitPath(FullPath As String, Optional Drive As String, _
Optional Path As String, Optional Filename As String, _
Optional File As String, Optional Extension As String)
    Dim nPos As Integer
       
    nPos = InStrRev(FullPath, "\")
    If nPos Then
        If Left$(FullPath, 2) = "\\" Then
            If nPos = 2 Then
                Drive = FullPath
                Path = ""
                Filename = ""
                File = ""
                Extension = ""
                Exit Sub
            End If
        End If
        Path = Left$(FullPath, nPos - 1)
        PathX = Path
        Filename = Mid$(FullPath, nPos + 1)
        FilenameX = Filename
        nPos = InStrRev(Filename, ".")
        If nPos Then
            File = Left$(Filename, nPos - 1)
            FileX = File
            Extension = Mid$(Filename, nPos + 1)
            ExtensionX = Extension
        Else
            File = Filename
            Extension = ""
        End If
    Else
        Path = FullPath
        Filename = ""
        File = ""
        Extension = ""
    End If
    If Left$(Path, 2) = "\\" Then
        nPos = InStr(3, Path, "\")
        If nPos Then
            Drive = Left$(Path, nPos - 1)
        Else
            Drive = Path
        End If
    Else
        If Len(Path) = 2 Then
            If Right$(Path, 1) = ":" Then
                Path = Path & "\"
            End If
        End If
        If Mid$(Path, 2, 2) = ":\" Then
            Drive = Left$(Path, 2)
            DriveX = Drive & "\"
        End If
    End If
 
End Sub

// Lirion: Code-Tags eingefügt. Bei längeren Codes bitte selbst dran denken. :)
 
Zuletzt bearbeitet von einem Moderator:

Daniel Toplak

Erfahrenes Mitglied
Zunächst mal ne kleine Anmerkung:
bei Selcect case brauchst du am ende nicht mehr nachfragen Case Is <> "xls", "doc", ....
Es genügt ein Case Else Block:

Code:
Select Case a
  Case 1
    mach das

  Case 2
    mach dies

  Case Else
    mach nix, ende

End Select

Zu dem 1. Problem:
Mir ist irgendwie nicht ganz klar wie die Konvertierung vor sich gehen soll. Macht das ein Externes Programm oder irgendwas?
Naja du kannst überprüfen ob eine Datei vorhanden ist, in dem du das FileSystemObject verwendest:
Code:
Dim fs
Dim vorhanden as Boolean
Set fs = CreateObject("Scripting.FileSystemObject")
vorhanden = fs.FileExists(Dateispez) 
If vorhanden = True then
  'Datei ist da
Else
  'Datei ist nicht da
End If

Zum 2. Problem:
Da gibt es 2 Möglichkeiten:
a) Über di Registry und shellex-Datei-verbindungen. Damit kann man einen Eintrag im Contexmenü für bestimmte Datei-Extensions erstellen.
Aber das weiss ich leider nicht wie das geht.

b) über das sendto Menü
Du legst eine Verknüpfung zu deiner Applikation in den sendto Ordner des jeweiligen Windows-Users.
Dann kann man eine X-Beliebige Datei oder sogar mehrer Dateien an deine Anwendung schicken.
die Dateien und ihre Pfade stehen dann in der Variable Command$ drin.
Diese kannst du dann entsprechen am Leerzeichen aufsplitten.
Aber bedenke, daß in Dateiname selbst auch Leerzeichen vorhanden sind, dann sind diese aber mit " eingeschlossen. Mit dem Entsprechenden Split-Algorithmus und Arrays, kannst du somit problemlos die Dateien behandeln.

Gruss Homer
 

Nicole

Mitglied
Erstmal besten Dank für die Antworten.

Die Konvertierung läuft in einem Externen Programm ab. Sie startet sobald in einem Verzeichnis die zu konvertierende Datei und eine Kopie mit der Extension ".rdy" existieren.

um Problem eins zu lösen habe ich Deinen Code Homer in mein Programm übernommen. Allerdings hab ich eine Do Schleife daraus gemacht da es etwas dauert bis die konvertierte Datei im V:\pdfout auftaucht.

Allerdings erkennt er nicht wenn/wann die Datei existiert, und ich hab echt keine Ahnung was da schief geht.
Vielleicht hast Du eine Idee Homer oder sonst wer.

Vielen Dank


Code:
                ...
                ZielPathA = ZielPath & "a"
                FileCopy ZielPath, ZielPathA
                Name ZielPathA As "\\pre-wap-konv1\Konvertierung\hpgltiffps\" & FileX & ".rdy"

        
            Case Else
                MsgBox "Fileformat is not convertable!" & "Please choose the correct format!", _
                vbExclamation, "Attention!"
            Exit Sub
          
    End Select

    ChDir "\\pre-wap-konv1\Konvertierung\"
    Drive1.Drive = "\\pre-wap-konv1\Konvertierung\"
        Dir1.Path = "\\pre-wap-konv1\Konvertierung\pdfout"
        
        MsgBox " Please wait a few seconds! Conversion is running!", vbInformation
   

Dim fs
Dim vorhanden As Boolean
Set fs = CreateObject("Scripting.FileSystemObject")
Do While vorhanden = fs.FileExists("\\pre-wap-konv1\Konvertierung\pdfout" & FileX & ".pdf")
If vorhanden = True Then
  MsgBox " Convertion is finished! ", vbInformation
    Exit Do
Else
  'Datei ist nicht da
End If
Loop



    QuellPath = Dir1 & "\" & FileX & ".pdf"
    ZielPath = PathX & "\" & FileX & ".pdf"
    FileCopy QuellPath, ZielPath



    Kill QuellPath

    Drive1.Drive = DriveX
    File1.Filename = Dir1 & "\" & "*.*"
End Sub
....
 

Nicole

Mitglied
Dringend

Hallo ich brauch nochmal unbedingt Eure Hilfe.
Wäre super wenn sich jemand meine Meldung oben nochmal anschauen
könnte besten Dank
Nicole
 

Daniel Toplak

Erfahrenes Mitglied
Das liegt daran, daß du die Schleife nicht etwas falsch geschrieben hast. Dein Programm erkennt normalerweiße schon, daß die Datei vorhanden ist, aber da die beim Erstellen bzw. Entstehen der Datei die Bedingung bei
Code:
Do While vorhanden = fs.FileExists(...)
zutrifft, geht das Programm nicht mehr in die Schleife rein. Und darum erscheint die Meldung nicht mehr.
Also solltest du die Schleife etwas umstellen:
Code:
Dim fs
Dim vorhanden As Boolean
vorhanden = False
Set fs = CreateObject("Scripting.FileSystemObject")
Do While Not vorhanden
    DoEvents
    vorhanden = fs.FileExists("\\pre-wap-konv1\Konvertierung\pdfout" & FileX & ".pdf")
    If vorhanden = True Then
        MsgBox " Convertion is finished! ", vbInformation
        Exit Do
    End If
Loop
Übrigens das DoEvents ist dazu gut, damit auch wärend der Schleife nicht der ganze Rechner steht und noch von Windows Nachrichten durchkommen.

So allerdings würde ich dir Vorschlagen das Ganze ohne Schleife zu machen mit einem Timer-Objekt, das so alle 0.5 - 1 Sekunde überprüft, ob die Datei vorhanden ist.
Das hat den Vorteil, das der Rechner auf dem das Programm läuft nicht zu 100% ausgelastet ist, weil nur alle 0.5 Sekunden überprüft wird und nicht etwa 100-1000 mal in der Sekunde (je nach Rechner). Das hat auch in deinem Fall noch den tollen Nebeneffekt, daß der Netzwerktraffic geringer ist. (da du ja über einen UNC-Pfad auf einen anderen Rechner zugreifst).

Noch elleganter wäre natürlich, wenn du die Konvertierung von deinem Programm aus anstarten würdest und von dem Konvertierungsprogramm ne Rückmeldung bekommen würdest.

Gruss Homer
 

Nicole

Mitglied
Hallo Homer

vielen Dank für Deinen Tip.
Ich habe mal Deinen Code einfach in mein Programm eingebaut.
Jetzt wird die Do Schleife ohne Ende durchlaufen obwohl schon längst das File auf dem V:\pdfout existiert.
Ich weiss mir ehrlichgesagt keinen Rat mehr!

Ich denke ich versuche es auch mal mit dem Timer der alle o,5-1 sec nach der Datei schaut. Leider bin ich da aber code mässig nicht ganz so fit. Vielleicht könntest du mir da etwas behilflich sein.
Wäre echt super von Dir.
Besten Dank!

Gruss Nicole
 

Daniel Toplak

Erfahrenes Mitglied
Also das mit dem Timer ist kein großes Hexenwerk.
Du erstellst ein Timer-Objekt und setzt es irgenwo auf dein Formular.
(Keine Angst es ist zur Laufzeit nicht sichtbar).
Dann stellst du das Intervall ein (in Millisekunden) also auf 500-1000 (=0.5-1 Sekunde).
Dann schreibst du einfach den Code der beim Auslösen des Timers (also alle 1 Sekunde oder so) ausgeführt werden soll in die Funktion Timer1_Timer(). Wobei Timer1 der Name des Timer-Objekts ist.
Wichtig ist natürlich, das du den Timer richtig ein und ausschaltest. Also zum Programmstart sollte er ausgeschaltet sein, erst wenn er benötigt wird einschalten und wenn die Bedingung zutrifft, dann wieder ausschalten.

Gruss Homer