Avatar billede dollas Nybegynder
03. juni 2004 - 14:51 Der er 44 kommentarer

hjælp til console write.

Kan i huske i de virkelig gamle dage med locate funktionen så man kunne bestemme hvor den skulle skrive?

Sådan en "dims" søger jeg til console write

Hjælp
Avatar billede arne_v Ekspert
03. juni 2004 - 15:15 #1
Du vil skrive til en bestemt position i console vinduet ?
Avatar billede dollas Nybegynder
03. juni 2004 - 15:18 #2
Ja, eller jeg vil gerne blive hvor jeg er... Dette reletere lidt til det andet spørgsmål du er igang med at besvare.

Jeg vil gerne kunne :

åbne en fil.
læse antal byte
lave en for / next for hver byte og så skrive ud..

f.eks

for i = 0 to totalbyte

console.write på bestemt location, blive på, 0,0 og skriver byte ud

next


er det til at forstå?
Avatar billede arne_v Ekspert
03. juni 2004 - 15:28 #3
Ja

Det er dog nok ikke helt simpelt.

Jeg har et par ideer.

Men jeg skal lige eksperimentere lidt først.
Avatar billede dollas Nybegynder
03. juni 2004 - 15:30 #4
Okay, glæder mig til at se det...

Det store af det lange er at jeg skal lave en copy funktion til binære filer, men jeg vil gerne kunne vise infomation om hvor lang den er nået efterhånden som den får overført data.

Vi taler mange gigabyte i hver fil, så den skal kunen holde til det, hvis du forstår
Avatar billede dollas Nybegynder
03. juni 2004 - 16:29 #5
Hvornår regner du med at have noget? Jeg smider gerne nogle flere point..
Avatar billede arne_v Ekspert
03. juni 2004 - 16:40 #6
Jeg får desværre først kigget på det i aften.

En gang imellem skal jeg også bestille lidt på arbejde.
Avatar billede dollas Nybegynder
03. juni 2004 - 16:43 #7
okay.... Kan du hurtigt lige forklare mig hvordan jeg kan tage hver byte i et loop... Den du lavede på den anden fungere ikke...
Avatar billede arne_v Ekspert
03. juni 2004 - 16:47 #8
Hvordan "fungerer ikke" ?

Det er copy pastet udfra noget kode der virker.
Avatar billede dollas Nybegynder
03. juni 2004 - 16:50 #9
Det her:

---
  Dim path = "c:\temp.tmp"
        Dim binf As Stream = New FileStream(path, FileMode.Open)
        Dim c As Integer
        While (c = binf.ReadByte) >= 0
            'Console.Write(c)
            Console.Write(binf.ReadByte)
        End While
        binf.Close()

---

Den skriver 75000 men filen er på 56,09 MB
Avatar billede dollas Nybegynder
03. juni 2004 - 16:50 #10
Hvor arbejder du ?
Avatar billede arne_v Ekspert
03. juni 2004 - 17:05 #11
While (c = binf.ReadByte) >= 0
    Console.WriteLine(c)
End While

burde skrive 56 millioner linier ud.

Men jeg formoder egentligt at bytene skal skrive stil output filen og at du bare vil
hav een tæller ksrevet ud på skærmen. Korrekt ?
Avatar billede dollas Nybegynder
03. juni 2004 - 17:07 #12
Det er korrekt...
Avatar billede dollas Nybegynder
03. juni 2004 - 17:07 #13
Og den kan du først have parat til i aften?
Avatar billede arne_v Ekspert
03. juni 2004 - 18:10 #14
Giv mig lige 30 minutter !
Avatar billede dollas Nybegynder
03. juni 2004 - 18:16 #15
Det kan du tro... Mange tak...
Avatar billede arne_v Ekspert
03. juni 2004 - 18:38 #16
Først selve kopieringen:

Imports System
Imports System.IO

Module Main
    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 c As Integer
        Dim n As Integer = 0
        Dim more as boolean = True
        While (more)
            c = f1.ReadByte
            If c >= 0 then
                f2.WriteByte(CType(c, Byte))
                n = n + 1
                If (n Mod 10000) = 0 Then
                    Console.WriteLine(n)
                End If
            Else
                more = False
            End If
        End While
        f1.Close
        f2.Close
        Console.WriteLine(n)
    End Sub
    Sub Main()
        Copy("C:\z1.dat", "C:\z2.dat")
    End Sub
End Module
Avatar billede arne_v Ekspert
03. juni 2004 - 18:45 #17
Og med en lidt smartere tæller:

Imports System
Imports System.IO

Module Main
    Sub Copy(fnm1 As String, fnm2 As String)
        Dim cr As String = Convert.ToChar(13)
        Dim f1 As Stream = New FileStream(fnm1, FileMode.Open, FileAccess.Read)
        Dim f2 As Stream = new FileStream(fnm2, FileMode.Create, FileAccess.Write)
        Dim c As Integer
        Dim n As Integer = 0
        Dim more as boolean = True
        While (more)
            c = f1.ReadByte
            If c >= 0 then
                f2.WriteByte(CType(c, Byte))
                n = n + 1
                If (n Mod 100000) = 0 Then
                    Console.Write(cr & n)
                End If
            Else
                more = False
            End If
        End While
        f1.Close
        f2.Close
        Console.WriteLine(cr & n)
    End Sub
    Sub Main()
        Copy("C:\z1.dat", "C:\z2.dat")
    End Sub
End Module
Avatar billede arne_v Ekspert
03. juni 2004 - 18:46 #18
OK ?
Avatar billede dollas Nybegynder
03. juni 2004 - 18:47 #19
Det var LIGE det jeg skulle bruge...

Hvis vi så kan udvide den til at kunne tage alt fra f.eks c:\david

Og her er det både dirs og filer
Avatar billede dollas Nybegynder
03. juni 2004 - 18:47 #20
Du skal nok få nogle flere point.
Avatar billede dollas Nybegynder
03. juni 2004 - 18:49 #21
2 tillægs spørgsmål...

1. Er det muligt at putte hele byte størrelsen ned af filen før vi kopier?
2. Hvordan læser jeg variabler/parametre på min exe fil? f.eks copy.exe c:\david.aaa c:\peder.aaa
Avatar billede arne_v Ekspert
03. juni 2004 - 18:58 #22
Alt kan lade sig gøre - stay tuned.
Avatar billede dollas Nybegynder
03. juni 2004 - 18:59 #23
Lækkert arne...

Jeg takker mange gange for din hjælp.
Avatar billede arne_v Ekspert
03. juni 2004 - 19:05 #24
Her er en version med " af ":

Imports System
Imports System.IO

Module Main
    Sub Copy(fnm1 As String, fnm2 As String)
        Dim cr As String = Convert.ToChar(13)
        Dim size As Integer = (new FileInfo(fnm1)).Length
        Dim f1 As Stream = New FileStream(fnm1, FileMode.Open, FileAccess.Read)
        Dim f2 As Stream = new FileStream(fnm2, FileMode.Create, FileAccess.Write)
        Dim c As Integer
        Dim n As Integer = 0
        Dim more as boolean = True
        While (more)
            c = f1.ReadByte
            If c >= 0 then
                f2.WriteByte(CType(c, Byte))
                n = n + 1
                If (n Mod 100000) = 0 Then
                    Console.Write(cr & n & " af " & size)
                End If
            Else
                more = False
            End If
        End While
        f1.Close
        f2.Close
        Console.WriteLine(cr & n & " af " & size)
    End Sub
    Sub Main()
        Copy("C:\z1.dat", "C:\z2.dat")
    End Sub
End Module
Avatar billede arne_v Ekspert
03. juni 2004 - 19:11 #25
Sub Main(ByVal args As String())
        Copy(args(0), args(1))
    End Sub
Avatar billede dollas Nybegynder
03. juni 2004 - 19:12 #26
Ja men hvis jeg skal have dem fra exefilen? er det sådan så?
Avatar billede arne_v Ekspert
03. juni 2004 - 19:13 #27
Ja

Ovenstående er dog kun med fulde filnavne

Directory kommer senere
Avatar billede dollas Nybegynder
03. juni 2004 - 19:14 #28
Jeg har lige prøvet at lave en variant der skriver hver gang een helt procent af det hele er kopiret, men den vil hverken det ene eller den andet...
Avatar billede dollas Nybegynder
03. juni 2004 - 19:15 #29
Er det ikke mjuligt at putte flere point på spørgsmålet, så du kan få noget mere for dit "arbejde"???
Avatar billede arne_v Ekspert
03. juni 2004 - 19:18 #30
Sub Main(ByVal args As String())
        Dim files As String() = Directory.GetFiles(args(0))
        For Each f As String In files
            Copy(f, args(1) & f.Substring(args(0).Length))
        Next
    End Sub
Avatar billede arne_v Ekspert
03. juni 2004 - 19:19 #31
Avatar billede dollas Nybegynder
03. juni 2004 - 19:21 #32
super... Jeg har sat det til 100, er det okay?
Avatar billede arne_v Ekspert
03. juni 2004 - 19:32 #33
Helt fint
Avatar billede arne_v Ekspert
03. juni 2004 - 19:33 #34
For filer større end 2 GB skal:

Dim n As Integer = 0

ændres til:

Dim n As Long = 0
Avatar billede dollas Nybegynder
03. juni 2004 - 19:33 #35
Ok... Kan den ikke bare være long fra starten...

Er du sød at stable det sammen til 1 kode?

Og det med dirs det virker også for subdirs?
Avatar billede arne_v Ekspert
03. juni 2004 - 19:33 #36
Og til så store filer vil jeg klart anbefale at læse ind i en 100KB eller 1MB buffer
af gangen fremfor kun at læse en enkelt byte af gangen.
Avatar billede dollas Nybegynder
03. juni 2004 - 19:35 #37
hmmm, måske man så skulle lave et check på hvor stor filen er til at starte med og så derefter vælge buffer... Men det skalder vel også noget kode til..
Avatar billede arne_v Ekspert
03. juni 2004 - 19:41 #38
Jeg prøver at lave en kombineret og forbedret udgave senere i aften ...
Avatar billede dollas Nybegynder
03. juni 2004 - 19:43 #39
lækkert... Jeg sider lige og prøver at lave lidt guf, men siden nu med garanti er bedre end mig, så venter jeg med glæde :)

tak.
Avatar billede dollas Nybegynder
03. juni 2004 - 21:17 #40
Hvordan står det til?
Avatar billede arne_v Ekspert
03. juni 2004 - 22:30 #41
Her er et eksempel med Long og 100KB buffer:

Imports System
Imports System.IO

Module Main
    Sub Copy(fnm1 As String, fnm2 As String)
        Dim cr As String = Convert.ToChar(13)
        Dim size As Integer = (new FileInfo(fnm1)).Length
        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 n As Long = 0
        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)
                n = n + actual
                Console.Write(cr & n & " af " & size)
            Else
                more = False
            End If
        End While
        f1.Close
        f2.Close
        Console.WriteLine(cr & n & " af " & size)
    End Sub
    Sub Main()
        Copy("C:\z1.dat", "C:\z2.dat")
    End Sub
End Module
Avatar billede arne_v Ekspert
03. juni 2004 - 23:01 #42
Sub CopyDir(dir1 As String, dir2 As String)
        Dim files As String() = Directory.GetFiles(dir1)
        For Each f As String In files
            Copy(f, dir2 & f.Substring(dir1.Length))
        Next
        Dim dirs As String() = Directory.GetDirectories(dir1)
        For Each d As String In dirs
            CopyDir(d, dir2 & d.Substring(dir1.Length))
        Next
    End Sub
    Sub Main(ByVal args As String())
        CopyDir(args(0), args(1))
    End Sub
Avatar billede arne_v Ekspert
03. juni 2004 - 23:01 #43
Den sidste processer directories rekursivt.

Du må lige selv splejse dem sammen.
Avatar billede arne_v Ekspert
16. juni 2004 - 22:17 #44
Tid at få lukket spørgsmålet ?
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