[VB.Net] Beschamend kopieer probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mavamaarten
  • Registratie: September 2009
  • Laatst online: 14:36

Mavamaarten

Omdat het kan!

Topicstarter
Beste medetweakers,

Vandaag besloten een simpel sync programmaatje te maken. Het is de bedoeling dat het met 1 druk op de knop 2 folders synct. Ik kan natuurlijk alle files gaan overwriten maar dit is onzinnig. Daarom dus dat hij alleen de files kopieert die nog niet bestaan, en alleen vervangt als het sourcebestand nieuwer is.

Maar het ding is... Ik kom er niet uit. Ik had een stukje C# dat ik gevonden had vertaald naar .Net, maar het overschreef gewoon alles. Verder valt er op google ook niets te vinden (en ja ik heb al wel even gezocht).

Wat mijn code nu (hij overschrijft alles) :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    Public Sub CopyFiles(ByVal Source As String, ByVal Destination As String)
        Dim sourcefiles() As String = Directory.GetFiles(Source)
        Dim destinationfiles() As String = Directory.GetFiles(Destination)

        For Each sourceFile As String In sourcefiles
            Dim destfilename = Destination + "\\" + New FileInfo(sourceFile).Name

            If IsStringInArray(destinationfiles, destfilename) Then
                If File.GetLastWriteTime(sourceFile) > File.GetLastWriteTime(destfilename) Then
                    File.Copy(sourceFile, destfilename, True)
                End If
            Else
                File.Copy(sourceFile, destfilename, True)
            End If
        Next
    End Sub

    Public Function IsStringInArray(ByVal Array As Array, ByVal Find As String) As Boolean
        For Each Str As String In Array
            If Str.Contains(Find) Then
                Return True
            Else
                Return False
            End If
        Next
    End Function


Dus

Doel : Folder kopieren, maar al bestande bestanden enkel vervangen als het bestand nieuwer is
Wat het fout doet : Hij vervangt alles ipv alleen de "verouderde bestanden".

Als er iemand mij kan helpen... ben ik hem zeer dankbaar _/-\o_

[ Voor 5% gewijzigd door Mavamaarten op 05-02-2011 19:46 ]

Android developer & dürüm-liefhebber


Acties:
  • 0 Henk 'm!

  • firebird_1979
  • Registratie: Januari 2004
  • Niet online
Ik kan je niet helpen met vb.net code, maar op *nix is er een programmaatje genaamd rsync wat precies doet wat jij wil. Ik heb even gegoogled, en rsync bestaat er ook voor windows.

Misschien is dat iets om naar te kijken? Of wil je het echt zelf coden? In dat geval is rsync natuurlijk geen echte oplossing...


Wikipedia: rsync

[ Voor 10% gewijzigd door firebird_1979 op 05-02-2011 19:55 . Reden: link toegevoegd ]


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 12-09 20:45

Onbekend

...

Kan je de waarden File.GetLastWriteTime(sourceFile) en File.GetLastWriteTime(destfilename) eens in een tabel zetten?
Ik ben wel benieuwd wat voor waarden je krijgt. (Ik heb wel een vermoeden hoor....)

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Als je toch code kopieert ipv het zelf uit te denken en te schrijven, waarom gebruik je dan niet gewoon, zeg, synctoy?

Allereerst: regel 12 zou niets moeten overschrijven. Dan moet je dus ook geen overwrite=True meegeven.

Verder: ga debuggen. Zet een breakpoint op regel 8 en ga testen met bestanden die al bestaan. Kijk wat er in je array staat. Kijk wat er in destfilename staat.

Of, als je liever vanuit de documentatie werkt: zoek eens op wat Directory.GetFiles precies retourneert, wat Filename.Name precies teruggeeft en natuurlijk wat Str.Contains nou precies doet.

[edit] En, zoals Onbekend opmerkt: wat File.GetLastWriteTime doet.

[ Voor 7% gewijzigd door ValHallASW op 05-02-2011 19:54 ]


Acties:
  • 0 Henk 'm!

  • barber
  • Registratie: Oktober 2001
  • Niet online
firebird_1979 schreef op zaterdag 05 februari 2011 @ 19:50:
Ik kan je niet helpen met vb.net code, maar op *nix is er een programmaatje genaamd rsync wat precies doet wat jij wil. Ik heb even gegoogled, en rsync bestaat er ook voor windows.

Misschien is dat iets om naar te kijken? Of wil je het echt zelf coden? In dat geval is rsync natuurlijk geen echte oplossing...
Of als je niet wilt programmeren gebruik je robocopy dat standaard meegeleverd wordt vanaf Windows Vista, 2008 en hoger (en als download beschikbaar voor oudere versies van windows) en ook efficient 2 lokaties in sync kan houden.
En als je een commandline tool eng vindt, dan is er ook nog RichCopy (ook van MS)

Acties:
  • 0 Henk 'm!

  • Mavamaarten
  • Registratie: September 2009
  • Laatst online: 14:36

Mavamaarten

Omdat het kan!

Topicstarter
Bedankt voor de tips !
Ik heb zelf nog een hele tijd op mijn code liggen staren, en kwam erachter dat ik wat fout deed met de IsStringInArray. Een "My.Computer.Filesystem.FileExists" deed de truuk :)

Deze code werkt perfect :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    Public Sub CopyFiles(ByVal Source As String, ByVal Destination As String)
        Dim sourcefiles() As String = Directory.GetFiles(Source)
        Dim destinationfiles() As String = Directory.GetFiles(Destination)

        For Each sourceFile As String In sourcefiles
            Dim destfilename = Destination + New FileInfo(sourceFile).Name

            If My.Computer.FileSystem.FileExists(destfilename) Then
                Label1.Text = "Source : " & File.GetLastWriteTime(sourceFile) & vbCrLf & "Desti. : " & File.GetLastWriteTime(destfilename)
                If File.GetLastWriteTime(sourceFile) > File.GetLastWriteTime(destfilename) Then
                    File.Copy(sourceFile, destfilename, True)
                    ListBox1.Items.Add("Replaced : " & destfilename)
                Else
                    ListBox1.Items.Add("NOT replaced : " & destfilename)
                End If
            Else
                File.Copy(sourceFile, destfilename, False)
                ListBox1.Items.Add("Copied : " & destfilename)
            End If
        Next
    End Sub

Android developer & dürüm-liefhebber


Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 13:25

Reptile209

- gers -

Voeg in je For Each sourcefile-lusje nog even een DoEvents() toe, of zet het geheel in een backgroundworker. Dan loopt het ook nog een beetje soepel als je enorme hoeveelheden of grote files hebt en wordt je listbox netjes geüpdate.

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • Mavamaarten
  • Registratie: September 2009
  • Laatst online: 14:36

Mavamaarten

Omdat het kan!

Topicstarter
Inderdaad, ik wou er eigenlijk net een vraag over stellen.
Ik heb ondertussen een progressbar toegevoegd (hij moet grote aantallen mp3's syncen) maar deze loopt vast na een tijdje. DoEvents helpt niet echt goed.

Als ik alle code naar een backgroundworker verplaats krijg ik echter het probleem dat ik mijn labels, progressbar en listbox niet meer kan aansturen. Hoe los ik dit op ? :?

EDIT: Progress is duidelijk wel mogelijk, deze werkt nu met ReportProgress. Maar hoe zorg ik ervoor dat telkens er een file geprocessed wordt, er een item bij in mijn listbox komt ?

EDIT2: Ik heb momenteel de listbox laten vullen met een public string die telkens changet bij ProgressChanged. Wel is het mij opgevallen dat ik een error krijg als het kopieren voltooid is : ... Whoops, innerexception maakte duidelijk dat "value 101" niet juist was... Tuurlijk gaat een progressbar maar tot 100 7(8)7

Alles werkt nu naar behoren. Bedankt voor jullie tips d:)b

Hier is een screenshot van het tooltje aan het werk. Nog niet helemaal klaar : Er komt nog een logo, een zieke skin (allemaal handwerk in photoshop :) ) en waarschijnlijk ook wel een progress label. Oh, en hij replacet best veel omdat ik veel tags heb liggen editen en veel album art heb zitten toevoegen.

Afbeeldingslocatie: http://img810.imageshack.us/img810/5810/3515115953orig1.jpg

[ Voor 60% gewijzigd door Mavamaarten op 05-02-2011 21:16 ]

Android developer & dürüm-liefhebber

Pagina: 1