Gå til innhold

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


Anbefalte innlegg

Skrevet (endret)

{0} erstattes med den første parameter, {1} med den andre, og så videre. Se f.eks. på denne koden:

Dim A As String = "er", B As String = "test"

MsgBox(String.Format("Dette {0} en {1}.", A, B))

Her blir sluttresultatet «Dette er en test.»

Endret av aadnk
Videoannonse
Annonse
Skrevet

Aah.. Så, det blir nesten det samme som:

 

 

MsgBox(String.Format("Dette" & A & "en" & B & ".")

 

Eller har jeg misforstått litt? :)

Skrevet

Det er .NET vi snakker?

 

I så fall, drit i MsgBox()

 

MessageBox.Show er korrekt i .NET.

 

Ingen vits i å lære AnaXyd vranglære vel? :p

Skrevet (endret)

MsgBox() Er gammel vb6-shit... Akkurat som VbCrLf og slike ting. Det er en stygg uvane og en uting å bruke det i et .net-prosjekt.

 

MessageBox.Show() og Environment.NewLine er .net-funksjonen/-propertyen.

Endret av Manfred
Skrevet
Ingen vits i å lære AnaXyd vranglære vel? :p

9067503[/snapback]

Nei, det gikk litt fort i svingene der, gitt. Beklager.

 

MsgBox() er inkludert for bakoverkompatibilitet med Visual Basic 6 og lavere. Funksjonen kalles på samme måte, og forenkler dermed overgangen. For programmer en utvikler i .NET er dette derimot helt unødvendig og fører kun til tregere kode (MsgBox() kaller MessageBox.Show() internt).

 

Men det er jo raskere å skrive MsgBox() da. :tease:

Skrevet
Ingen vits i å lære AnaXyd vranglære vel? :p

9067503[/snapback]

Nei, det gikk litt fort i svingene der, gitt. Beklager.

 

MsgBox() er inkludert for bakoverkompatibilitet med Visual Basic 6 og lavere. Funksjonen kalles på samme måte, og forenkler dermed overgangen. For programmer en utvikler i .NET er dette derimot helt unødvendig og fører kun til tregere kode (MsgBox() kaller MessageBox.Show() internt).

 

Men det er jo raskere å skrive MsgBox() da. :tease:

9067689[/snapback]

Ja, det er mye raskere ja.. :) Hehe.. :)

Skrevet

Jeg lurer på en ting igjen... Går det ann å eksludere noen filer fra kopieringa?

Har nemlig noen filer som er skrivebeskyttet(ja de må være det), og de fungerer å bli kopiert over, men ikke bli overskrevet på nytt. Da blir det error..

 

Filen heter MEMSTICK.IND, hvis det er til hjelp! :)

Skrevet

Du kan jo gjøre det litt mer generelt ved å legge en try/catch rundt selve setningen som kopierer fila over. I catchen tar du vare på (legge til en stringe feks) filnavnet som feilet og eventuelt feilmeldinga stom oppstod på den fila.

Skrevet (endret)

Okay, jeg skal se om jeg får til noe! :)

 

Mens vi er i siget her nå:

 

Jeg kopierte kopieringsfunksjonen inn i en annen form i samme prosjekt, og får denne erroren:

 

'Callback' cannot expose type 'Progress' outside the project through class 'frmDG'.

 

Og enda en ting som jeg tror er ganske enkelt å løse:

 

Når den kopierer, viser den hele banen til fila som blir kopiert. Hvordan kan jeg kutte litt ned på denne, slik at den bare viser litt av banen?

 

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

 

Er veldig hyggelig at dere hjelper meg! :)

Endret av AnaXyd
Skrevet

Legg først funksjonen inn i en klassemodul og endre Public Sub til Public Shared Sub:

Klikk for å se/fjerne innholdet nedenfor
Public Class Files

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

 

    Public Shared Sub Copy(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

Deretter kan funksjonen kalles ifra alle former med navnet Files.Copy:

Public Class Form1

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

        Files.Copy("D:\Temp\A", "D:\Temp\B", True, , AddressOf ProgressUpdater)

    End Sub

 

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

 

        ' Oppdaterer merknadsboks (viser kun selve filnavnet)

        Me.Text = String.Format("Copying file {0}.", IO.Path.GetFileName(File))

 

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

        Application.DoEvents()

 

    End Sub

End Class

Skrevet
...

Og enda en ting som jeg tror er ganske enkelt å løse:

 

Når den kopierer, viser den hele banen til fila som blir kopiert. Hvordan kan jeg kutte litt ned på denne, slik at den bare viser litt av banen?

 

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

 

Er veldig hyggelig at dere hjelper meg! :)

9068552[/snapback]

 

Sjekk String.Substring()

Skrevet

Å kutte ned er egentlig litt komplisert, fordi du må kutte bort deler av banen som kanskje ikke er så viktig, man er kanskje uansett interresert i å vite hvilken fil det er, men ikke nødvendigvis hele filbanen.

Mange programmer bytter ut flere mapper i filnavnet med "..." men beholder disk bokstaven og filnavnet.

Skrevet (endret)

Er nok ikke veldig vansklig å få til nei.

 

Ingen ta å si hvordan, la han tenke selv. Please :)

 

Først definerer vi ett sett med regler.

 

La oss ta ett fiktivt filnavn med bane.

 

C:\Programmer\Lol\Lol.exe

 

 

Banen starter med stasjonsbokstav:\

Deretter kommer noe uvesentlig (som skal erstattes med ...) fulgt av \

En gang til.

Deretter kommer filnavn fulgt av . filendelse.

 

 

Bruk de reglene til å lage filteret.

 

Er ganske enkelt med noen looper av en eller annen form.

 

 

 

 

Detta ble ganske dårlig forklart, men jeg er trøtt nå, så bær over med meg.

Endret av ze5400
Skrevet

Nå gjør dere det unødvendig komplisert:)

 

Aadnk har jo allerede fikset dette:

Me.Text = String.Format("Copying file {0}.", IO.Path.GetFileName(File))

 

Der viser bare filnavnet.

 

IO.Path.GetPathRoot(File) & "...\" & IO.Path.GetFileName(File)

 

Dette viser feks "C:\...\Fil.exe".

 

Ta heller en kikk på IO.Path-namespacet, du;)

Skrevet (endret)

Ah, en smule enklere!

 

Jeg prøvde meg på denne String.Split, men vanskelig å finne ut noe om den når IDE'n min ikke sier noe om den engang. Men jeg tviler på at jeg hadde fått den til uansett... :nei:

 

EDIT: Oj! Fungerer perfecto også! Nydelig! Nå må jeg bare sette meg ned og se om jeg forstår hva den koden egentlig gjør... :roll:

 

IO.Path.GetPathRoot(File) & "...\" & IO.Path.GetFileName(File)

Hvordan kan egentlig denne kutte ned på filbanen da? Jeg skjønner ikke helt det. Hvorfor blir det ikke bare "hele filbanen + "...\" + "filnavn"?

Endret av AnaXyd

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...