FTP Dateien überschreiben umgehen

MarcoIT

Grünschnabel
Hallo Zusammen ;)
Vielleicht könnt Ihr mir ja helfen.
Ich habe ein Programm geschrieben, dass eine gescannte Datei erstmal lokal speichert und dann den Windowsopenfile-Dialog öffnet (gleich im Ordner in dem die Datei gespeichert wurde). Die Dateien die gescannt werden, erhalten den namen: "img_"aktuelle_Uhrzeit".jpg". Wenn eine Datei mit dem selben Namen bereits in dem Ordner ist, wird die Datei "img_"aktuelle_Uhrzeit_1".jpg" benannt. Wird eine Datei ausgewählt, wird die Auswahl bestätigt und im Anschluss die Datei hochgeladen. Ist dort eine Datei bereits vorhanden, überschreibt der FTP-Server einfach die Datei und die "alte"-Datei ist weg...!

Wie kann ich das umgehen, dass der FTP-Server mir die Datei überschreibt?
 
Hi
und Willkommen bei tutorials.de

Zuerst eben abfragen, ob es eine Datei mit dem Namen gibt.
Wirklich sicher ist das aber auch nicht.
Wenn die andere Datei gerade zwischen Abfrage und eigenem Upload kommt...

FTP ist für sowas ungeeignet.
 
Hey danke dir Sheel für die schnelle Antwort,
die Abfrage pb die Datei bereits vorhanden ist habe ich schon. Ich zeig dir mal was ich bereits so alles habe, vllt kannst du dir dann ein besseres Bild machen.

Code:
Imports System.Net
Imports System.IO.Directory
Imports System.Net.WebRequestMethods
Imports System.Drawing.Printing
Imports System.Globalization
Imports System.IO
Imports System.Runtime.InteropServices
Imports Microsoft.Win32

Public Class Scanbutton

        'Deklaration
        Dim ziel As String
        Dim user As String
        Dim pwd As String

        Dim datum As String
        Dim ofd As New OpenFileDialog
        Dim sfd As New SaveFileDialog
        Dim fso As System.Object

        Dim imagepfad As String
        Dim dialog As New WIA.CommonDialog
        Dim image As WIA.ImageFile = Nothing

        Dim i As String

    Private Declare Function GetTickCount Lib "kernel32" () As Long
        Private Const ConnectTimeOut = 30

    Private Sub Scanbutton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        'Zugangsdaten
        user = ("Benutzer")
        pwd = ("Passwort")

        i = 0
        fso = New Object
        'Datum Formatierung
        datum = FormatDateTime(Now, DateFormat.ShortTime)
        datum = Replace(datum, " ", "_")    ' leerzeichen durch unterstrich ersetzen
        datum = Replace(datum, ".", "")     ' Punkte entfernen
        datum = Replace(datum, ":", "")     ' Doppelpunkte entfernen

        MsgBox("Legen Sie ein Dokument in Ihren Scanner.")
        'Hierbei wird die Windows GUI aufgerufen die zum Scannen verwendet werden kann.
        Try
            image = dialog.ShowAcquireImage(WIA.WiaDeviceType.ScannerDeviceType, , , , False, )
        Catch ex As Exception
            MsgBox("Ein Fehler ist aufgetreten! Überprüfen Sie ob das Gerät Eingeschaltet und angeschlossen ist." & Environment.NewLine & Environment.NewLine & ex.Message)
            End
        End Try

        If Not image Is Nothing Then
            imagepfad = ("C:\Scanbilder\")

            If FileExists(imagepfad + "img_" + datum + ".jpg") Then
                i = i + 1
                image.SaveFile(imagepfad + "img_" + datum + "_" + i + ".jpg")
            Else
                image.SaveFile(imagepfad + "img_" + datum + ".jpg")
            End If

        Else
            MsgBox("Es wurde kein Bild erfasst!", MsgBoxStyle.Information, "Information")
            End
        End If

        ofd.InitialDirectory = "C:\Scanbilder\"
        ofd.Filter = "Gescannte Dokumente (*.jpg)|*.jpg"
        ofd.Title = "Datei zum Öffnen auswählen"

        If ofd.ShowDialog() = DialogResult.OK Then
            MsgBox("Datei wurde ausgewählt.")
        Else
            MsgBox("Abbruch durch User.")
            End
        End If

        Dim webclient As New Net.WebClient
        webclient.Credentials = New Net.NetworkCredential(user, pwd)
        ziel = ("FTPServer")
        Dim request As Net.FtpWebRequest = Net.FtpWebRequest.Create(ziel)
        request.Method = Net.WebRequestMethods.Ftp.ListDirectory
        request.Credentials = New Net.NetworkCredential(user, pwd)

        Try
            request.GetResponse()
            MsgBox("Connected")
        Catch ex As Exception
            MsgBox("Kein Connect")
            Close()
        End Try

        My.Computer.Network.DownloadFile(ofd.FileName, ofd.SafeFileName, user, pwd)

        If ftpfileExists(ziel) = True Then
            ziel = ("FTPServer/" + ofd.SafeFileName)
            My.Computer.Network.UploadFile(ofd.FileName, ziel, user, pwd, True, 500)
            MsgBox("Erfolgreiches Hochladen!")
            End
        Else
            MsgBox("Der Zielordner zum Einfügen der gescannten Dokumente, ist nicht verfügbar.")
            MsgBox("Überprüfen Sie ob der Zielordner vorhanden ist.")
            End
        End If
    End Sub

    '########################################################################################################################################
    ' Funktion zum überprüfen eines Ordners
    '########################################################################################################################################

    Public Function DirExists(ByVal OrigFolder As String)
        Dim fs
        fs = CreateObject("Scripting.FileSystemObject")
        DirExists = fs.folderexists(OrigFolder)
    End Function

    '########################################################################################################################################
    ' Funktion zum überprüfen einer Datei
    '########################################################################################################################################

    Private Function FileExists(ByVal FileName As String) As Boolean
        On Error Resume Next
        FileExists = Not CBool(GetAttr(FileName) And (vbDirectory Or vbVolume))
        On Error GoTo 0
    End Function

    '########################################################################################################################################
    ' Funktion zum überprüfen einer Datei auf dem FTP-Server
    '########################################################################################################################################

    Private Function ftpfileExists(ByVal FileName As String)

        If (My.Computer.Network.IsAvailable = True) Then
            MsgBox("Hat geklappt")
            Return (True)
            End
        Else
            MsgBox("Hat nicht geklappt")
            Return (False)
            End
        End If
    End Function

    '########################################################################################################################################
    ' Button Upload um Scanvorgang zu umgehen
    '########################################################################################################################################

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles einfacher_upload.Click

        MsgBox("Wählen Sie eine Datei aus, die Sie hochladen möchten.")
        upload()
    End Sub

    '########################################################################################################################################
    ' Funktion Upload einer Datei für den Button Upload
    '########################################################################################################################################

    Private Function upload() As Action

        ofd.InitialDirectory = "C:\Scanbilder\"
        ofd.Filter = "Gescannte Dokumente (*.jpg)|*.jpg"
        ofd.Title = "Datei zum Öffnen auswählen"

        If ofd.ShowDialog() = DialogResult.OK Then
            MsgBox("Datei wurde ausgewählt.")
        Else
            MsgBox("Abbruch durch User.")
            End
        End If

        ziel = ("FTPServer/ftpsonstige/Scanbilder/")
        If ftpfileExists(ziel) = True Then
            ziel = ("FTPServer/ftpsonstige/Scanbilder/" + ofd.SafeFileName)
            My.Computer.Network.UploadFile(ofd.FileName, ziel, user, pwd, True, 500)
            MsgBox("Erfolgreiches Hochladen!")
            End
        Else
            MsgBox("Der Zielordner zum Einfügen der gescannten Dokumente, ist nicht verfügbar.")
            MsgBox("Überprüfen Sie ob der Zielordner vorhanden ist.")
            End
        End If

    End Function

Hilft dir das weiter? :)
 
Hallo Freak,

naja ftpfileexists, sollte die Datei auf dem FTP-Server überprüfen aber da stimmt noch was nicht. Ich hatte eigentlich vor auf den FTP Server einen Zugriff zu erreichen aber irgendwie bin ich daran vorbeigekommen und dennoch funktioniert alles :D
Bist du der Meinung ich kann das anders gestalten?
 
Moin,

naja ftpfileexists, sollte die Datei auf dem FTP-Server überprüfen aber da stimmt noch was nicht. Ich hatte eigentlich vor auf den FTP Server einen Zugriff zu erreichen aber irgendwie bin ich daran vorbeigekommen und dennoch funktioniert alles :D
Bist du der Meinung ich kann das anders gestalten?

Nun ja, was Du dort prüfst, ist doch wohl nur dies her, oder ?
http://msdn.microsoft.com/de-de/library/d1e9b5cx(v=vs.90).aspx

Du übergibst zwar 'nen Dateinamen an die Funktion, machst da aber konkret nichts mit !!
Du solltest versuchen die Datei zu lesen, um zu schauen, ob sie vorhanden ist .... ;-)

Gruß
Klaus
 
Hey,

uff... :O da schauste mal was alles an einem vorbei geht... mist... Sollte ich aber FileExists verwenden, dann geht das ja nicht da die Funktion nur für Lokale Überprüfung gilt.
Wenn ich es mit einem Download versuchen sollte, dann TRUE zurück bekomme, sollte ich eigentlich auch eine Art überprüfung haben nicht wahr
 
Noch einmal: Bei FTP kannst du dir nicht sicher sein, dass nichts verloren geht.
Wenn das wirklich immer 100% sicher sein soll, kann man FTP vergessen.
 
Danke für die Info aber ich weiß in dem Falle ist FTP das sicherste da:
1. das FTP direkt am VPN ist
2. File Transport Protocoll sagt doch alles oder?
3. HTML / PHP usw... ist nicht gewünscht deswegen muss es FTP sein.

Eine PHP Variante habe ich bereits gemacht ist aber nicht erwünscht
 
Moin,

hier mal eine nette Übersicht der verfügbaren FTP-Befehle:
http://www.informatik.fh-luebeck.de/Seehusen/InternetFuerFrauen/node44.html
Mehr ist wirklich nicht ... ;-)

Du könntest natürlich neben dem Download versuchen, mit DIR das Verzeichnis aufzulisten und dann darin den Dateinamen zu suchen (ist aber bei vielen Einträgen auch nicht so wirklich lustig).

Gibt es denn nur einen Client, der diese Dateien speichern will oder mehrere? Weil: je mehr, desto unsicherer wird es, wie Sheel ja schon schrieb!

Oder bastle Dir eindeutigere Dateinamen - etwa Uhrzeit mit Hunderstel etc. !

Gruß
Klaus
 
Zurück