FTP Problém v přejmenovávání souboru   otázka

VB.NET, I/O operace

Dobrý den všem,

prosím o pomoc při řešení problému s přejmenováváním souboru na FTP.

Snažim se soubor nejprve přečíst a po přečtení jej přejmenovat. Přečtení je OK, ale při pokusu přejmenovat me mi vrátí exception message : The remote server returned an error: (550) File unavailable (e.g., file not found, no access).

Je problém v mém kódu, nebo na tom FTP serveru ?

Když se na FTP server připojím přes Exporer Windowsu tak jej přejmenuju.

Na serveru wz.cz s tím problém nemám, tam mi níže uvedené funguje OK.

' Nejprve si vytvořím seznam souborů na FTP

Dim SeznamSouboru As New Collections.Generic.List(Of String)
Dim Ftp1 As FtpWebRequest = WebRequest.Create("ftp://path/")
Ftp1.Credentials = New NetworkCredential("UID", "PWD")
Ftp1.KeepAlive = False
Ftp1.Method = WebRequestMethods.Ftp.ListDirectory
Using Response1 As FtpWebResponse = CType(Ftp1.GetResponse, FtpWebResponse)
    Using Reader1 As New IO.StreamReader(Response1.GetResponseStream(), System.Text.Encoding.Default)
        Dim Pole() As String = Reader1.ReadToEnd().Split(vbNewLine)
        For Each Str1 As String In Pole
           SeznamSouboru.Add(Str1)
        Next
        Reader1.Close()
        Reader1.Dispose()
    End Using
    Response1.Close()
End Using
Ftp1 = Nothing

' Poté procházím v kolekci 'SeznamSouboru' soubor po souboru ...

For Each Soubor As String In SeznamSouboru

    ' Najprve si každý soubor jednotlivě přečtu ...

    If Soubor.EndsWith(".txt") = True Then

        Dim Ftp2 As FtpWebRequest = WebRequest.Create("ftp://path/")
        Ftp2.Credentials = New NetworkCredential("UID", "PWD")
        Ftp2.KeepAlive = False
        Ftp2.Method = WebRequestMethods.Ftp.DownloadFile
        Using Response2 As FtpWebResponse = CType(Ftp2.GetResponse, FtpWebResponse)
            Using Reader2 As New IO.StreamReader(Response2.GetResponseStream(), System.Text.Encoding.Default)
                ' Nějaké akce
                Reader2.Close()
                Reader2.Dispose()
            End Using
            Response2.Close()
        End Using
        Ftp2 = Nothing

        ' A poté se jej snažím přejmenovat, abych ho příště nečetl znovu

        Dim Ftp3 As FtpWebRequest = WebRequest.Create("ftp://path/")
        Ftp3.Credentials = New NetworkCredential("UID", "PWD")
        Ftp3.Method = WebRequestMethods.Ftp.Rename
        Ftp3.KeepAlive = True
        Ftp3.RenameTo = Soubor & ".completed"
        Using Response3 As FtpWebResponse = DirectCast(Ftp3.GetResponse, FtpWebResponse)
            Response3.Close()
        End Using
        Ftp3 = Nothing

    End If

Next

Předem díky za vaší pomoc. Pert

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

První věc: pokud děláte více dotazů na stejnou adresu pak doporučuju mít proměnou s heslem, uživ. jménem a hostingem

když potřebujete měnit stačí to na jednom místě

problém vašeho kódu je jednoduchý, dám příklad,.

máme adresář

ftp://server.dev/test

ve složce test jsou sobory

.              '' odkaz na sebe
..             '' odkaz na nadřazenou složku
test.txt
test2.txt
test3.cmd

problémem je že si do listu SeznamSouboru dáváte název souboru přímo tak jak vám to vrátí ten požadavek

ale vůbec vlastně neřešíte co vám vrací ?!

to co vy jste přidával

 SeznamSouboru.Add(Str1)

vám vrátí

test/.              
test/..             
test/test.txt
test/test2.txt
test/test3.cmd

takže vám tam pak vznikne cesta

ftp://server.dev/test/test/.

.

.

.

ftp://server.dev/test/test/test3.cmd

ale ta přece neexistuje,. a pak vám server vrátí "500 not found"

 
 Dim pass As String = "password"
        Dim uid As String = "Username"
        Dim ftpPath As String = "ftp://server.dev/test"

        Dim SeznamSouboru As New Collections.Generic.List(Of String)
        Dim Ftp1 As FtpWebRequest = WebRequest.Create(ftpPath)
        Ftp1.Credentials = New NetworkCredential(uid, pass)
        Ftp1.KeepAlive = False
        Ftp1.Method = WebRequestMethods.Ftp.ListDirectory
        Using Response1 As FtpWebResponse = CType(Ftp1.GetResponse, FtpWebResponse)
            Using Reader1 As New IO.StreamReader(Response1.GetResponseStream(), System.Text.Encoding.Default)
                Dim Pole() As String = Reader1.ReadToEnd().Split(vbNewLine)
                For Each Str1 As String In Pole
                    SeznamSouboru.Add(Str1.Split("/")(Str1.Split("/").Length - 1).Trim()) ''řešení !!!
                Next
            End Using
        End Using

        ' Poté procházím v kolekci 'SeznamSouboru' soubor po souboru ...

        For Each Soubor As String In SeznamSouboru

            ' Najprve si každý soubor jednotlivě přečtu ...

            If Soubor.EndsWith(".txt") = True Then

                Dim Ftp2 As FtpWebRequest = WebRequest.Create(ftpPath + "/" + Soubor) ''řešení !!!
                Ftp2.Credentials = New NetworkCredential(uid, pass)
                Ftp2.KeepAlive = False
                Ftp2.Method = WebRequestMethods.Ftp.DownloadFile
                Using Response2 As FtpWebResponse = CType(Ftp2.GetResponse, FtpWebResponse)
                    Using Reader2 As New IO.StreamReader(Response2.GetResponseStream(), System.Text.Encoding.Default)
                        ' Nějaké akce
                    End Using
                End Using

                ' A poté se jej snažím přejmenovat, abych ho příště nečetl znovu

                Dim Ftp3 As FtpWebRequest = WebRequest.Create(ftpPath + "/" + Soubor)
                Ftp3.Credentials = New NetworkCredential(uid, pass)
                Ftp3.Method = WebRequestMethods.Ftp.Rename
                Ftp3.KeepAlive = True
                Ftp3.RenameTo = Soubor & ".completed"
                Using Response3 As FtpWebResponse = DirectCast(Ftp3.GetResponse, FtpWebResponse)
                End Using

            End If
        Next
nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Smažte tenhle příspěvek, protože se toho spamu nedokážete zbavit a díky tomu se to pořád ukazuje jako aktualizované...

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

spam je tu na celom fóre

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback