Gå til innhold

Hjelp til System.IO.File.Copy..!


Anbefalte innlegg

"Hvordan bruker jeg flere threads?" er greit

"Hva er matrix klassen til?" er greit

"Er det bedre å bruke backgroundworker en å lage en ny thread?" er greit

"Kopierer jeg og limer inn den koden her?" er ikke greit :)

 

Vi vi hjelpe deg på et generelt plan, den eneste jeg vet om på forumet her som skriver ferdige løsninger, er aadnk :)

Lenke til kommentar
Videoannonse
Annonse

@jorn79: Hva tror du ellers forumet er til da? Få høre at man skal søke på google? Da kunne man likegjerne hatt en enkelt side på diskusjon.no hvor det stod:

 

Trenger du hjelp til noe..? Bruk Google!

 

 

"Hvordan bruker jeg flere threads?" er greit

"Hva er matrix klassen til?" er greit

"Er det bedre å bruke backgroundworker en å lage en ny thread?" er greit

"Kopierer jeg og limer inn den koden her?" er ikke greit :)

 

Vi vi hjelpe deg på et generelt plan, den eneste jeg vet om på forumet her som skriver ferdige løsninger, er aadnk :)

9058914[/snapback]

Nå var ikke triggerspm mitt strengt tatt et spm om jeg skal lime inn der eller ikke da...

Endret av AnaXyd
Lenke til kommentar
Hvis flere hadde googlet før de postet på forumet, hadde ikke C++ forumet vært gjennomsyret av folk som lurte på hvorfor console vinduet lukker seg så fort at man ikke rekker å lese noe.

9058951[/snapback]

Det der er sant... Og det er også utrolig mange andre eksempler på slikt.

Men, når folk spør dumt om noe, fyrer jeg ikke løs med all aggresjon og spetakkel, men tar det med ett smil og sier at det har blitt diskutert her før, men her har du svaret.

 

Jeg sitter som regel på forumet her for å hjelpe, skaffe informasjon, eller få hjelp. Det er jo mange bonusting, som å lese hvor mye rart som er i Humor tråden, eller lignende.

 

Men når jeg tenker meg om, handler dette forumet mest om å hjelpe, eller skaffe hjelp til noe. Det blir som å spørre i kantina på skolen, hvordan man skal koble den nye TV'en man fikk til jul.

 

EDIT: Nå føler jeg det kommer en skikkelig preken fra jorn79 her.. :p

Endret av AnaXyd
Lenke til kommentar
Han mener sikkert at noen (mis)bruker dette forumet bare de støter på litt motgang, mens andre vil helst spare seg for pinlige kunnskapsavsløringer og søker på Google først, FØR de evt spør her :)

9059186[/snapback]

 

Han spør på forumet FØR han møter motgang. AnaXyd kommer aldri til å lære noen ting når han ikke gidder å prøve selv.

 

Når man copy/paster en funksjon inni en annen funksjon, ikke har hørt om AND/OR i if-settninger, etc... Dette minner om EKSTREMT svake basiskunnskaper og copy/paste "programmering" av dimensjoner. Og det betyr at det faktisk er forumet her som programmerer for han, og han bare copy/paster inn koden i programmet sitt.

 

Hvis han ikke er interesert i å gjøre en liten innsats selv så syntes jeg han bør slutte å programmere. Dette begynner bare å bli irriterende...

Lenke til kommentar

Altså, jeg må jo lære ett sted også da? Som dere andre her, har dere sikkert utdannelse innenfor dette og jobber kanskje med det...

 

Jeg er helt selvlært gutt som begynte med en guide til å lage en simpel trojaner i VB6. Jeg meldte meg på Beta Experience til Micrisoft og fikk Visual Studio 2005 Beta i posten. Deretter har jeg skaffet meg den ferdige versjonen som jeg bruker nå.

 

 

Jeg har jo ikke kodet mye rart, men nå har jeg begynt for alvor med å prøve å få til noen litt mer avanserte programmer enn en knapp som får det til å komme tekst i en tekstboks!

 

Dere syntes sikkert jeg spør helt idiotiske spm, og jeg er helt lost i hue osv. Men tenk etter selv.. Har ikke dere vært på samme nivå en gang..?

Lenke til kommentar
Dere syntes sikkert jeg spør helt idiotiske spm, og jeg er helt lost i hue osv.

9059624[/snapback]

 

Nei, men jeg syntes du er jævelig egoistisk som ikke gidder å prøve å finne ut av noenting selv før du spør andre og bruker opp tiden deres. At du ikke har giddet å lese en tutorial for nybegynnere (og ikke kan de mest elementære tingene) -- og samtidig forventer du at vi skal komme opp med kode for avanserte ting.

 

Da vi andre startet så begynte vi med å lese en bok, tutorial, etc... Og når vi stod fast så spurte vi om ting vi lurte på. Du begynner på helt motsatt ende!

 

Du spurte om vi hadde gått på skole. Du vet at på skolen så må man lære alt selv, og så spør man læreren når man lurer på noe. Det er bare på barneskolen hvor man kan spørre om ALT uten å gjøre noe innsats selv. Hvor gammel er du egentlig?

Lenke til kommentar

Jeg er 17 år..

 

Og ja, jeg inrømmer at jeg har misbrukt litt av hjelpen jeg kan få her... Det er ikke til å stikke under en stol!

 

Men, som jeg har prøvd å si en del ganger, fyrte du av på et omtrent vanlig spm. Jeg hadde kanskje ikke lest så mye om akkurat den tingen, men jeg tenkte at dere kunne forklare kort og enkelt hva det var fornoe. Det er så mye enklere å forstå! :)

Lenke til kommentar

Jeg har egentlig bare en ting å si.

 

Wrox Beginning Visual Basic 2005

 

Les den - når du har gjort det kan du komme tilbake å spørre om ting du lurer på.

 

 

Alle andre her har lært seg programmering ut ifra å lese bøker og/eller tutorials, samt learning by doing. Ingen grunn til at du ikke skal kunnet gjøre det samme.

 

 

 

Beklager om dette ble litt harskt.

Lenke til kommentar

Takk for tips! Skal se om jeg får tak i den.. :) Har også en annen beginner guide, så jeg får kjøre igjennom den i morra.. :) Får håpe jeg har litt mer kunnskap da..! :D

 

Jeg lurer på en liten ting i den rekursive funksjonen.

 

Når den kopierer, trodde jeg at den skulle vise hver enkelt fil den kopierte. Det ser ihvertfall slik ut i koden. Men, det som skjer, er at det er kun den siste filen som blir vist. (Vist i en Label)

 

Hvis noen av dere gidder, kan dere se på koden her. (Denne formen har en button, og en label)

 

Public Class Form1

 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        RecursiveCopyFiles("G:\1", "G:\2", True, True)

    End Sub

 

    ' Recursively copy all files and subdirectories from the

    ' specified source to the specified destination.

    Private Sub RecursiveCopyFiles( _

    ByVal sourceDir As String, _

    ByVal destDir As String, _

    ByVal fRecursive As Boolean, ByVal overWrite As Boolean)

 

        Dim i As Integer

        Dim posSep As Integer

        Dim sDir As String

        Dim aDirs() As String

        Dim sFile As String

        Dim aFiles() As String

 

        ' Add trailing separators to the supplied paths if they don't exist.

        If Not sourceDir.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString()) Then

            sourceDir &= System.IO.Path.DirectorySeparatorChar

        End If

 

        If Not destDir.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString()) Then

            destDir &= System.IO.Path.DirectorySeparatorChar

        End If

 

        ' Recursive switch to continue drilling down into dir structure.

        If fRecursive Then

 

            ' Get a list of directories from the current parent.

            aDirs = System.IO.Directory.GetDirectories(sourceDir)

 

            For i = 0 To aDirs.GetUpperBound(0)

 

                ' Get the position of the last separator in the current path.

                posSep = aDirs(i).LastIndexOf("\")

 

                ' Get the path of the source directory.

                sDir = aDirs(i).Substring((posSep + 1), aDirs(i).Length - (posSep + 1))

 

                ' Create the new directory in the destination directory.

                System.IO.Directory.CreateDirectory(destDir + sDir)

 

                ' Since we are in recursive mode, copy the children also

                RecursiveCopyFiles(aDirs(i), (destDir + sDir), fRecursive, overWrite)

            Next

 

        End If

 

        ' Get the files from the current parent.

        aFiles = System.IO.Directory.GetFiles(sourceDir)

 

 

        ' Copy all files.

        For i = 0 To aFiles.GetUpperBound(0)

 

            ' Get the position of the trailing separator.

            posSep = aFiles(i).LastIndexOf("\")

 

            ' Get the full path of the source file.

            sFile = aFiles(i).Substring((posSep + 1), aFiles(i).Length - (posSep + 1))

            Try

 

 

                ' Copy the file.

                System.IO.File.Copy(aFiles(i), destDir + sFile, False)

                Label1.Text = ("Copied " & sFile & " to " & destDir)

            Catch ex As Exception

                If overWrite = False Then

                    Label1.Text = (ex.Message)

                    Label1.Text = ("Skipping..." & ex.Message)

                Else

                    System.IO.File.Copy(aFiles(i), destDir + sFile, True)

                    Label1.Text = ("Overwriting old " & sFile & " in " & destDir)

                End If

 

            End Try

        Next i

 

    End Sub

End Class

 

 

Noe må vel være galt? Eller skal det være sånn?

Endret av AnaXyd
Lenke til kommentar

Om jeg forstod deg riktig:

 

Labelen vil vise den filen som sist ble kopiert. Når kopieringsprosessen er over, vil da den siste filen være den som viser.

 

Dersom du vil at alle kopierte filer skal viser, kan du for eksempel gjøre som følger:

 

Før du starter kopieringen (feks under Button1_click):

   Label1.Text = "" 

 

I kopieringssuben, erstatt

   Label1.Text = ("Copied " & sFile & " to " & destDir)

med

   Label1.Text &= "Copied " & sFile & " to " & destDir & Environment.Newline

 

Da vil alle kopierte filer vise.

Endret av Degeim
Lenke til kommentar

Kanskje noe som følger er bedre (en kan også kalle CopyFiles fra en BackgroundWorker og dermed unngå DoEvents):

Public Class Form1

    Delegate Sub Progress(ByVal File As String, ByVal Percentage As Double)

 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        CopyFiles("D:\Temp\A", "D:\Temp\B", True, , AddressOf ProgressUpdater)

    End Sub

 

    Public Sub ProgressUpdater(ByVal File As String, ByVal Precentage As Double)

 

        ' Oppdaterer merknadsboks

        Me.Text = String.Format("Copying file {0}. {1}% done.", File, Precentage)

 

        ' Lar hendelser kjøres (slik at teksten oppdateres)

        Application.DoEvents()

 

    End Sub

 

    Public Sub CopyFiles(ByVal Source As String, ByVal Destination As String, ByVal SubDirectories As Boolean, _

    Optional ByVal SearchPattern As String = "*.*", Optional ByVal Callback As Progress = Nothing)

 

        ' Lag en liste over alle filene vi skal kopiere

        Dim aFiles() As String = IO.Directory.GetFiles(Source, SearchPattern, IIf(SubDirectories, _

        IO.SearchOption.AllDirectories, IO.SearchOption.TopDirectoryOnly))

 

        ' Kopier hver av dem til destinasjonsmappen

        For Index As Integer = 0 To aFiles.Length - 1

            Try

                Dim sNewPath As String = IO.Path.Combine(Destination, _

                aFiles(Index).Substring(Source.Length).TrimStart("\"))

 

                ' Forsøk å kopiere filen

                IO.Directory.CreateDirectory(IO.Path.GetDirectoryName(sNewPath))

                IO.File.Copy(aFiles(Index), sNewPath, True)

 

                ' Informer om progresjonen

                If Callback IsNot Nothing Then

                    Callback(aFiles(Index), Index / aFiles.Length)

                End If

 

            Catch ex As Exception

                ' Du bør selv bestemme hvordan du vil reagere på feil

                Callback("Error: " & ex.ToString, (Index + 1) / aFiles.Length)

            End Try

        Next

 

    End Sub

End Class

Endret av aadnk
Lenke til kommentar

Wow... Takk!

Og her burde det vel være lett å legge til en progressbar funksjon også?

Og er denne en erstatning til den rekursive koden? :)

 

 

Forresten, når jeg husker det: Hva gjør et Callback? :)

 

Takk igjen! Du er til stor hjelp!

Lenke til kommentar
Forresten, når jeg husker det: Hva gjør et Callback? :)

9064866[/snapback]

I denne koden er den en delegate - en funksjonspeker som brukes for at CopyFiles skal kunne rapportere tilbake til kalleren om progresjonen. Det er såklart ikke alltid nødvendig - en kunne fint lagt inn Label1- og ProgressBar1-oppdateringene direkte inn i CopyFiles, men med den konsekvens at funksjonen blir knyttet fullstendig opp mot formen og må modifiseres om den limes inn annetsteds. Det er aldri dumt å håndheve modularitet og abstraksjon i koden, slik at den kan stå for seg selv.

 

Og er denne en erstatning til den rekursive koden?

9064866[/snapback]

Ja, dette er en erstatning til den forrige, rekursive funksjonen. Når du vil ha en progresjon over operasjonen, må du lage en liste over alle filene for å finne ut hvor mange du skal kopiere. Dersom dette ikke er nødvendig, er den rekursive funksjon å foretrekke.

 

Og her burde det vel være lett å legge til en progressbar funksjon også?

9064866[/snapback]

Det burde være lett å slenge inn en progresjonskontroll om du bruker Precentage-argumentet. Endret av aadnk
Lenke til kommentar

Takk igjen! Da har jeg lært litt om Callback og Delegates også.. :)

 

Dette ble jo bare skikkelig bra!

 

Slik gjorde jeg det med progressbaren:

 

' Oppdaterer progressbar

ProgressBar1.Maximum = 100

ProgressBar1.Value = Precentage * 100

 

Måtte gange Precentage med 100 for å få riktig.. :)

 

Men en ting til..

 

' Oppdaterer merknadsboks

        Label1.Text = String.Format("Copying file {0}. {1}% done.", File, Precentage)

 

Når jeg fjerner Precentage fra denne, funker ikke koden. Jeg vil gjerne ha vekk denne, da jeg har en progressbar allerede.. :)

Ser ut som den må være med, av en eller annen grunn?

Endret av AnaXyd
Lenke til kommentar
Når jeg fjerner Precentage fra denne, funker ikke koden. Jeg vil gjerne ha vekk denne, da jeg har en progressbar allerede.. :)

Ser ut som den må være med, av en eller annen grunn?

9064960[/snapback]

Les litt på System.String-metoden. Du må fjerne {1} for å kunne fjerne parameter nummer to:

' Oppdaterer merknadsboks

        Label1.Text = String.Format("Copying file {0}.", File)

Endret av aadnk
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...