Avatar billede nicklasw Nybegynder
07. august 2005 - 15:59 Der er 12 kommentarer og
1 løsning

hvorfor virker den copy kode ikke?

Hej. Jeg har lavet denne kode

    Private Sub copy_file(ByVal fra As String, ByVal til As String)
        Dim read As Stream = New FileStream(fra, FileMode.Open, FileAccess.Read)
        Dim write As Stream = New FileStream(til, FileMode.Create, FileAccess.Write)
        Dim c As Integer
        Dim more As Boolean = True
        While more = True
            c = read.ReadByte
            If c > 0 Then
                write.WriteByte(CType(c, Byte))
            Else
                more = False
            End If
        End While
        read.Close()
        write.Close()
    End Sub

    Private Sub copy_dir(ByVal fra As String, ByVal til As String)
        Dim files As Array = IO.Directory.GetFiles(fra)
        For Each f As String In files
            If IO.Directory.Exists(til) = False Then
                IO.Directory.CreateDirectory(til)
            End If
            copy_file(f, til & "/" & f.Substring(fra.Length))
        Next
        Dim dirs As Array = IO.Directory.GetDirectories(fra)
        For Each d As String In dirs
            copy_dir(d, til & "/" & d.Substring(fra.Length))
        Next
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        copy_dir("c:\test", "c:\test2")
    End Sub


den copy'er en mappe og alle filerne i den. når man lige prøver koden af se det ud som om den virker, men det gør den ikke!
alle de filer som programmet har copy'ert virker ikke og har ikke den rigtige størlse. jeg har test programmet på en mappe der fylder 293 MB. og den copy'et mappe kommer til at fylde 336 KB. hvad kan der være galt?????
Avatar billede arne_v Ekspert
07. august 2005 - 16:01 #1
prøv:

If c >= 0 Then
Avatar billede nicklasw Nybegynder
07. august 2005 - 16:03 #2
prøver jeg af vil komme til at føle mig lidt dum vis det bare er det. HEHE
Avatar billede arne_v Ekspert
07. august 2005 - 16:05 #3
Iøvrigt vil du med 293 MB se en noget bedre performance med en application buffer.

Eksempel:

    Sub Copy(fnm1 As String, fnm2 As String)
        Dim f1 As Stream = New FileStream(fnm1, FileMode.Open, FileAccess.Read)
        Dim f2 As Stream = new FileStream(fnm2, FileMode.Create, FileAccess.Write)
        Dim b(100000) As Byte
        Dim actual As Integer
        Dim more as boolean = True
        While (more)
            actual = f1.Read(b, 0, b.Length)
            If actual > 0 then
                f2.Write(b, 0, actual)
            Else
                more = False
            End If
        End While
        f1.Close
        f2.Close
    End Sub
Avatar billede nicklasw Nybegynder
07. august 2005 - 16:06 #4
godt nok det virkede ;)
læg et svar. men hvad er forskellen mellem?
if c >= 0      og if c > 0
Avatar billede nicklasw Nybegynder
07. august 2005 - 16:07 #5
hvorfor skulle

    Sub Copy(fnm1 As String, fnm2 As String)
        Dim f1 As Stream = New FileStream(fnm1, FileMode.Open, FileAccess.Read)
        Dim f2 As Stream = new FileStream(fnm2, FileMode.Create, FileAccess.Write)
        Dim b(100000) As Byte
        Dim actual As Integer
        Dim more as boolean = True
        While (more)
            actual = f1.Read(b, 0, b.Length)
            If actual > 0 then
                f2.Write(b, 0, actual)
            Else
                more = False
            End If
        End While
        f1.Close
        f2.Close
    End Sub

være en bedre kode?
Avatar billede arne_v Ekspert
07. august 2005 - 16:07 #6
ReadByte returnerer et tal 0-255 alt efter hvilken byte du læser og -1 ved
end of file

>0 betyder at du stopper ved end of file eller den første nul byte

>=0 betyder at du kun stopper ved end of file
Avatar billede nicklasw Nybegynder
07. august 2005 - 16:08 #7
okay. Tak
Avatar billede arne_v Ekspert
07. august 2005 - 16:09 #8
ReadByte og WriteByte læser og skriver 1 byte af gangen

Read og Write som ovenfor læser og skriver 100 KB af gangen.

Begge virker.

Men jeg vil tro at den sidste er 10-100 gange hurtigere.
Avatar billede arne_v Ekspert
07. august 2005 - 16:09 #9
(og det betyder intet ved en fil på 500 byte, men ved 293 MB er der sikkert nogle
store filer iblandt og så kan det mærkes !)
Avatar billede arne_v Ekspert
07. august 2005 - 16:10 #10
og et svar
Avatar billede nicklasw Nybegynder
07. august 2005 - 16:11 #11
okay. vil jeg kigge på.

Lægger du et svar
Avatar billede arne_v Ekspert
07. august 2005 - 16:17 #12
hvis du interesserer sig for problematikken så læs evt.

http://groups.google.dk/group/comp.os.vms/msg/b516b4343df6744f?hl=da&

det er Java og er egentligt med et Windows versus VMS problem,
men vi kommer forbi præcis den samme problem stilling med
single byte read versus multi byte read (og Java koden er ikke
så forskellig fra .NET koden)
Avatar billede nicklasw Nybegynder
07. august 2005 - 16:19 #13
okay tak. kan godt lidt java. så nok ikke det store problem.
Men tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester