2015-02-26 1 views
0

Так я использую Visual Studio 2013 (Community)Загрузить/сохранить документы на сервер SFTP Linux с VB.NET

И до сих пор я построить программу, которая может создавать файлы, используя текстовые поля и так далее.

Это экономит XML, и мы надеемся, читает XML (Даже если я получаю доступ запрещен)

Пришло время для применения, чтобы поговорить с сервером, в котором будут храниться все файлы, и читать из.

Сервер является Linux Server Edition (последний), и его работа прекрасна. Я хочу, чтобы мое приложение подключилось к нему, войдите в систему, а затем просто просмотрите и прочитайте файлы с сервера.

До сих пор это делается немного.

Private Sub Loginbutton_Click(sender As Object, e As EventArgs) Handles Loginbutton.Click 

    Dim mySessionOptions As New SessionOptions 
    With mySessionOptions 
     .Protocol = Protocol.Sftp 
     .HostName = "192.168.0.247" 
     .UserName = "username" - these are default on purpose 
     .Password = "password" 
     .SshHostKeyFingerprint = "ssh-rsa 2048 [Hidden]" 
    End With 
    Using mySession As Session = New Session 
     ' Connect 
     mySession.Open(mySessionOptions) 
    End Using 
    Form1.Show() 
    Me.Close() 

End Sub 

Это работает как шарм, и оно движется дальше.

После Form1 загружен, его показывает мне правильные файлы из папки сервера ..

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    For Each i As String In Directory.GetFiles("\\192.168.0.247\Database") 
     Objectlist1.Items.Add(Path.GetFileName(i)) 
    Next 
    Objectlist1.Refresh() 

End Sub 

И когда я сохранить файлы на него

Private Sub Savebutton_Click(sender As Object, e As EventArgs) Handles Savebutton.Click 

    If IO.File.Exists(Pholderbox.Text) = False Then 

     Dim settings As New XmlWriterSettings() 
     settings.Indent = True 

     Dim XmlWrt As XmlWriter = XmlWriter.Create("\\192.168.0.247\Database\" + Pholderbox.Text, settings) 
     With XmlWrt 

Все, что работает, как предполагалось.

Я хочу отметить, что папка в вопросе, или «Share» в вопросе о сервере, защищен паролем, и имя пользователя и пароль вставлены в Вход кодекса (Temporary)

Моя проблема приходит сюда когда я дважды щелкнул файл (активировать), чтобы ПРОЧТИТЬ его.

Private Sub Objectlist1_ItemActivate(sender As Object, e As EventArgs) Handles Objectlist1.ItemActivate 
    Caseworker.Show() 

    Me.Objectlist1.MultiSelect = False 

    Dim selectedListViewItem As String 
    selectedListViewItem = Me.Objectlist1.SelectedItems.Item(0).ToString 
    Const basepath As String = "\\192.168.0.247\Database" 
    Dim xmlpath = IO.Path.Combine(basepath, Objectlist1.SelectedItems.Item(0).Text) 
    If (IO.File.Exists(xmlpath)) Then 

     Dim document As XmlReader = New XmlTextReader(basepath) 

     Dim mySessionOptions As New SessionOptions 

     While (document.Read()) 
     ' - This little bugger screams out everytime 
     ' "An unhandled exception of type 'System.UnauthorizedAccessException' occurred in System.Xml.dll 
     ' Additional information: Access to the path '\\192.168.0.247\Database' is denied." 

Что в этом нет, не так ли? Я бы предположил, так как он может перечислить содержимое этой папки, и для тестирования я дал EVERYONE Полный доступ к этой папке (User, Group, Other) FULL Access в Linux (0777)

Я так сказал, чтобы проверить, если это поможет.

Возможно, это из-за вашей экспертизы, поскольку оно связано с библиотекой WinSCP и фактически является сервером Linux.

Будучи единственной функцией «Чтение XML», которая отрицает это, я должен быть очень близок?

Я вижу, что очень многие полагают, что другие сторонние библиотеки, лучшие для меня, будут решением на простом VB.NET, если это возможно.

+0

О порядке. Если кто-то задается вопросом, или если это помогает, это мои Импорт; Импорт System.IO Импорт System.Xml Импорт System.Windows.Forms.VisualStyles.VisualStyleElement.TaskbarClock Импорт System.Windows.Forms Импорт System.Xml.XmlReader Импорт System.Windows.Forms.TextBox Импорт системы Imports System.Windows.Forms.ListView Imports System.Net Импорт WinSCP – PiperMp3

+0

Если вы закроете свое приложение, перезапустите его и попытайтесь открыть файл, не сохраняя его первым, работает ли он? –

+0

Остановить отладку, начать отладку, открыть файл, который был сохранен/создан ранее, вы имеете в виду? Я не могу проверить до завтра, так как офис закрыт. Но я отдам тебе дорогу и вернусь к тебе! – PiperMp3

ответ

1

Вы комбинируете вход SFTP с доступом к удаленному ресурсу через UNC-путь. Это не сработает. Либо используйте только SFTP (что вы можете использовать для сборки WinSCP .NET), либо войдите в систему на удаленном сервере (Samba?), Чтобы вы могли использовать только UNC-пути.

Далее следует SFTP-решение. Я не знаю VB.NET, поэтому извиняюсь за ошибки в синтаксисе. Также обратите внимание, что вам необходимо сделать mySession глобальным, чтобы вы могли получить к нему доступ из других функций.

Загрузка списка удаленных файлов:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    For Each i As RemoteFileInfo In mySession.ListDirectory("/Database").Files 
     Objectlist1.Items.Add(i.Name) 
    Next 
    Objectlist1.Refresh() 

End Sub 

Ссылка: https://winscp.net/eng/docs/library_session_listdirectory

Saving:

Private Sub Savebutton_Click(sender As Object, e As EventArgs) Handles Savebutton.Click 

    Dim settings As New XmlWriterSettings() 

    settings.Indent = True 

    Dim TempPath As String = IO.Path.Combine(IO.Path.GetTempPath, Pholderbox.Text); 
    Dim XmlWrt As XmlWriter = XmlWriter.Create(TempPath , settings) 
    With XmlWrt 
    End With 

    mySession.PutFiles(TempPath, "/Database/").Check() 

End Sub 

Ссылка: https://winscp.net/eng/docs/library_session_putfiles

Загрузка:

Private Sub Objectlist1_ItemActivate(sender As Object, e As EventArgs) Handles Objectlist1.ItemActivate Caseworker.Show() 

    Me.Objectlist1.MultiSelect = False 

    Dim selectedListViewItem As String 
    selectedListViewItem = Me.Objectlist1.SelectedItems.Item(0).ToString 

    Dim xmlpath = IO.Path.Combine(IO.Path.GetTempPath, Objectlist1.SelectedItems.Item(0).Text) 

    mySession.GetFiles("/Database/" + Objectlist1.SelectedItems.Item(0).Text, xmlpath).Check(); 

    If (IO.File.Exists(xmlpath)) Then 

     Dim document As XmlReader = New XmlTextReader(basepath) 

     Dim mySessionOptions As New SessionOptions 

     While (document.Read()) 

Ссылка: https://winscp.net/eng/docs/library_session_getfiles

+0

Aaaah, я вижу, что вы там делали. Вы помогли мне продолжить, и я благодарен за это. Рассмотрите этот случай закрытым. Спасибо, миллион Мартин. – PiperMp3

+0

Извините, что беспокою, но я столкнулся с проблемами с приведенными примерами кода. «Для каждого i As String в mySession.ListDirectory ("/ Database") "дает мне" ListDirectory, а не член String "Я пытался DIM, я пытался добавить его в открытый модуль, нет. Кроме того, WinSCP - плохая программа для задницы. используется здесь на стороне, чтобы поговорить с сервером;) – PiperMp3

+0

Я могу использовать mySession.ListDirectory в форме входа. Как и это: каталог RemoteDirectoryInfo = session.ListDirectory ("/ home/martin/public_html") ;. Как вы видите на WinSCP. net, но использование этого в другой форме дает мне строчную ошибку.То есть что-то, что я наблюдаю здесь, или отсутствует. Модуль создан для mySession, который, похоже, работает. Импорт также является WinSCP. – PiperMp3

Смежные вопросы