Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: [VB .NET] Paras ratkaisu tiedoston kopioimiseen verkkojaolle

K_L [06.03.2009 14:51:53]

#

Tervehdys,

Rakentelen ohjelmaa, joka kopioi tiedostoja domainista toiseen. Ohjelma toimii nyt siten, että ohjelma käynnistää net.exe prosessin, jolle argumentteina annetaan halutut kohdepalvelimet ja niiden autentikointii tarvittavat tiedot. Itse kopiointi suoritetaan file.copy -metodilla. Lopuksi käynnistetään uusi prosessi net.exe:lle, joka deletoi jaon.

Tämä toimii noin pääsääntöisesti ihan hyvin, mutta mielestäni tämä ei ole oikea/ paras tapa ratkaista asia. Kun net.exe käynnistetään, niin en osaa ottaa mitään palautetta siltä vastaan. Välillä komennon suorittaminen epäonnistuu, ja sitten vika ilmenee vasta kopioinnissa.

Välillä taas delete epäonnistuu, joka sitten taas aiheuttaa turhia avoimia yhteyksiä.

Koitin googletella parempia ratkaisuja, mutta niitä ei tuntunut löytyvän. Pitkälti löydetyt ratkaisut oli tehty samalla tavalla kuin minun.

neau33 [07.03.2009 16:08:04]

#

Heippa K_L!

parhaasta ratkaisusta en tiedä...mutta et copy/pastettaisi tänne koodiasi..?

Imports System
Imports System.IO
Imports Microsoft.VisualBasic

Public  Class Form1

   '...

   Sub AliOhjelma(ByVal FileName As String)

      Dim getInfo As System.IO.DriveInfo()
      getInfo = System.IO.DriveInfo.GetDrives
      Dim DriveArray(0) As String
      Dim cnt As Integer = -1

      For Each info As System.IO.DriveInfo In getInfo
        cnt += 1
        Redim Preserve DriveArray(cnt)
        DriveArray(cnt) = info.name
      Next

      Try
         Kill("C:\Net_Session.bat")
      Catch ex As Exception
      End Try
      Try
         Kill("C:\ready.txt")
      Catch ex As Exception
      End Try

      FileOpen(1,"C:\Net_Session.bat", _
      OpenMode.Output, OpenAccess.Write)
      PrintLine(1,"@echo off")
      PrintLine(1,"NET SESSION DELETE")
      PrintLine(1,"NET USE " + Chr(34) + "\\kone" _
      + Chr(34) + "\resurssi\asema  pwd")
      PrintLine(1,"NET USE " + Chr(34) + "\\kone" _
      + Chr(34) + "\resurssi\asema  pwd")
      PrintLine(1,"NET USE " + Chr(34) + "\\kone" _
      + Chr(34) + "\resurssi\asema  pwd")
      Rem jne...
      PrintLine(1,"echo ready >C:\ready.txt")
      PrintLine(1,"Exit")
      FileClose(1)

      Do While Dir("C:\Net_Session.bat") = ""
         Application.DoEvents
      Loop

      Shell("C:\Net_Session.bat", AppWinStyle.Hide)

      Do While Dir("C:\ready.txt") = ""
         Application.DoEvents
      Loop

      getInfo = System.IO.DriveInfo.GetDrives
      Dim DriveArray2(0) As String
      cnt = -1
      For Each info As System.IO.DriveInfo In getInfo
         cnt += 1
         Redim Preserve DriveArray2(cnt)
         DriveArray2(cnt) = info.name
      Next

      If DriveArray.Length < DriveArray2.Length Then
         For i As Integer = 0 To DriveArray2.GetUpperBound(0)
            Dim IsLocal As Boolean = False
            For j As Integer = 0 To DriveArray.GetUpperBound(0)
               If DriveArray(j) = DriveArray2(i) Then
                  IsLocal = True: Exit For
               End If
            Next j
            If Not IsLocal Then
               Try
                  FileCopy(FileName, DriveArray2(i) + "\" + FileName)
                  Do While Dir(DriveArray2(i) + "\" + FileName) = ""
                     Application.DoEvents
                  Loop
               Catch ex As Exeption
               End Try
               'jne...
            End If
         Next i
      Else
         msgbox("Ei yhdistettyjä verkkoasemia...")
      End If
   End Sub

End Class

neau33 [08.03.2009 00:56:20]

#

Heippa taas K_L!

toinen vaihtoehto on käyttää WNetAddConnection2 API'a

neau33 [08.03.2009 02:46:44]

#

Heippa taas K_L!

eipä tietenkään kahta ilman kolmatta...

Option Strict Off

Imports System.IO
Imports Microsoft.VisualBasic
Imports System.Runtime.InteropServices

Public Class Form1

   Friend WithEvents objNetWork As Object = _
   CreateObject("Wscript.Network")

   '...

   Private Sub Form1_Load(sender As System.Object, _
   e As System.EventArgs) Handles MyBase.Load
      Dim asema As String = "X:"
      Dim jako As String = "\\Kone\JakoNimi"
      Dim tunnus As String = "tunnus"
      Dim passu As String = "passu"
        Select Case Connect(asema, jako, _
        "FALSE", tunnus, passu).Length
         Case Is > 0
            Dim filu As String = "testi.txt"
            FileCopy(filu, asema + "\" + filu)
            Do While Dir(asema + "\" + filu) = ""
               Application.DoEvents
            Loop
            MsgBox(Disconnect(asema))
         Case Is = 0
            MsgBox("Verkkoasemaan yhdistäminen resurssista  " _
            + jako + " ei onnistunut")
      End Select
   End Sub

   Function Connect(ByVal asema As String, _
   ByVal jako As String, ByVal pysyvä As String, _
   ByVal tunnus As String, ByVal passu As String) As String
      Try
         objNetWork.MapNetworkDrive(asema, jako, pysyvä, tunnus, passu)
      Catch ex As Exception
         Return String.Empty
         Exit Function
      End Try
      Return "Toimii!"
   End Function

   Function Disconnect(ByVal asema As String) As String
      Try
         objNetwork.RemoveNetworkDrive(asema)
      Catch ex As Exception
         Return "Yhteyden katkaisu ei onnistunut"
         Exit Function
      End Try
      Return "Yhteyden katkaisu onnistui"
   End Function

End Class

K_L [09.03.2009 07:43:18]

#

Terve,

Kiitoksia kolmesti.

Tuo ensimmäinen ratkasu on lähellä ideaa joka minulla oli, mutta paljon paremmin toteutettu. Tämä viimeinen on juuri se, mitä minulla oli mielessä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta