[vb.net]files uit 1 dir verplaatsen naar meerdere

Pagina: 1
Acties:

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:30
Hoi,

Situatie
Ik heb een directory op een server waar een zeer groot aantal files instaan. Dit zijn er zoveel dat de windows verkenner op zijn bek gaat tijdens het openen.
Deze moeten verplaatst worden naar directorys die ingedeeld zijn per maand + jaar. Bijvoorbeeld: f:\1-2004

Mogelijke oplossing
Een vb.Net appje die de creationdate van een file pakt, en deze dan naar de juiste dir moved.
Dit werkt wel, alleen met een klein aantal files.

Probleem
Door het grote aantal files gaat dit appje ook onderuit met de melding:
code:
1
2
3
4
5
6
7
8
Unhandled Exception: System.IndexOutOfRangeException: Index was outside the boun
ds of the array.
   at System.Array.InternalGetValue(Int32 index1, Int32 index2, Int32 index3)
   at System.Array.GetValue(Int32 index)
   at Microsoft.VisualBasic.CompilerServices.LateBinding.LateIndexGet(Object o,
Object[] args, String[] paramnames)
   at DirCleaner.Module1.CopyFilesToMonth()
   at DirCleaner.Module1.Main()


Ik heb even snel wat in elkaar gezet om dit voor elkaar te krijgen, met de volgende code:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        Dim di As New DirectoryInfo("F:\uploads\hr")
        Dim afi As FileInfo() = di.GetFiles("*.jpg")
        Dim fi As FileInfo
        Dim i As Integer
        Dim bestandsnaam As String
        Dim bestandsdatum As DateTime
        Dim MaandSplit As String
        Dim MaandSplitArray As Array
        Dim JaarSplit As String
        Dim foldernaam as String

        For Each fi In afi
            bestandsnaam = fi.Name
            bestandsdatum = fi.CreationTime
            MaandSplitArray = Split(bestandsdatum, "-")
            MaandSplit = MaandSplitArray(1)
            JaarSplit = Left(MaandSplitArray(2), 4)
            foldernaam = MaandSplit & " - " & Jaarsplit
            fi.MoveTo("F:\" & foldernaam & "\" & bestandsnaam)
        Next

Nu neem ik aan dat het appje eerst alles in probeert te lezen, vervolgens probeert te kopiëren.

Hoe kan ik dit nu anders oplossen?

Het is misschien niet de allerbeste code, maar dat heeft meer met mijn kennis van .Net te maken :)

[ Voor 3% gewijzigd door TeeDee op 03-06-2004 12:07 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:59

gorgi_19

Kruimeltjes zijn weer op :9

Op welke regel gaat hij onderuit? En hoeveel bestanden zijn het wel niet, als je buiten de int32 komt? :X

En anders moet je het gaan opsplitsen in gedeeltes. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:30
1: hoe bedoel je? Het is een Console appje, en die foutmelding die ik gaf, is het enige wat ik krijg.
En ja, het zijn vrij veel bestanden :X
2: Opslitsen in gedeeltes? Dus nog met een loop van 1-5000 oid en in die loop het e.e.a. uitvoeren?

Heart..pumps blood.Has nothing to do with emotion! Bored


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:59

gorgi_19

Kruimeltjes zijn weer op :9

TeeDee schreef op 03 juni 2004 @ 12:17:
1: hoe bedoel je? Het is een Console appje, en die foutmelding die ik gaf, is het enige wat ik krijg.
Met debuggen moet je wel een regel te voorschijn kunnen toveren waar die fout gaat :)
2: Opslitsen in gedeeltes? Dus nog met een loop van 1-5000 oid en in die loop het e.e.a. uitvoeren?
jups.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Returnt di.GetFiles("*.jpg") geen array? Als dat zo is dan treed je daar buiten de maximale index en zit daar waarschijnlijk je probleem. Ik ben niet echt thuis in VB, maar volgens mij heeft het daarmee te maken.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:30
gorgi_19 schreef op 03 juni 2004 @ 12:18:
[...]
Met debuggen moet je wel een regel te voorschijn kunnen toveren waar die fout gaat :)
[...]
jups.
Uhm, het probleem is dus dat ik het op de server uitvoer.
Lokaal gaat het dus goed, en om nu lokaal ook zo'n dir te maken e.d.
of snap ik je niet?

Het gedoe met loopen ga ik eens proberen.

@NMe84: yup, daar dacht ik zelf ook aan. :)

Heart..pumps blood.Has nothing to do with emotion! Bored


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:53
GetFiles returned een string[], maar als je met een foreach door die array loopt, dan kan je toch moeilijk buiten de bounds gaan...

Meer dan 2 miljard bestanden lijkt me ook sterk, dus ik denk dat het misschien wel eens met die Split functies kan misgaan.
Ik zie dat je daar split op een '-', en dat je dan het element met subscript 1 uitleest. Wie zegt dat die array dan zoveel elementen bevat ?

Alhoewel, als jij zegt dat het met een klein aantal files wel lukt...

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:59

gorgi_19

Kruimeltjes zijn weer op :9

TeeDee schreef op 03 juni 2004 @ 12:22:
[...]

Uhm, het probleem is dus dat ik het op de server uitvoer.
Lokaal gaat het dus goed, en om nu lokaal ook zo'n dir te maken e.d.
of snap ik je niet?

Het gedoe met loopen ga ik eens proberen.

@NMe84: yup, daar dacht ik zelf ook aan. :)
Als je bereidt bent om een kleine 'test' toe te voegen, dan kan je tussen door items gaan wikkelen in try-catch statements en je eigen exception messages gooien. Misschien werkt Console.WriteLine trouwens ook wel. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:53
TeeDee schreef op 03 juni 2004 @ 12:22:
[...]

Uhm, het probleem is dus dat ik het op de server uitvoer.
Lokaal gaat het dus goed, en om nu lokaal ook zo'n dir te maken e.d.
of snap ik je niet?

Het gedoe met loopen ga ik eens proberen.

@NMe84: yup, daar dacht ik zelf ook aan. :)
Dan kan je eens met Trace etc aan de slag, en bepaalde informatie outputten.
Je kan ook eens checken of er wel goed gesplit wordt.
Bij jou wordt er misschien '-' gebruikt als scheidingsteken in een datum, op de server is dat misschien '/'.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:59

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 03 juni 2004 @ 12:24:
[...]


Dan kan je eens met Trace etc aan de slag, en bepaalde informatie outputten.
Je kan ook eens checken of er wel goed gesplit wordt.
Bij jou wordt er misschien '-' gebruikt als scheidingsteken in een datum, op de server is dat misschien '/'.
ERhm, nu ik dit zo lees.. Waarom gebruik je niet de standaard datum functie van .Net? :X Month, Day en Year zijn allemaal properties.

[ Voor 5% gewijzigd door gorgi_19 op 03-06-2004 12:25 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:53
gorgi_19: idd.

Ik ging net zeggen dat je beter zou splitten op System.Threading.CurrentThread.CurrentCulture.DateTimeFormatInfo.DateSeparator ipv op een hardcoded '-' of '/'.

https://fgheysels.github.io/


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:30
Whoami: Bij jou wordt er misschien '-' gebruikt als scheidingsteken in een datum, op de server is dat misschien '/'.
Die dir namen zijn al zo gemaakt. Trace vind ik nog even te ver gaan omdat ik daar nog niet veel van af weet.

Ik ben nu even bezig om in een loop het e.e.a. uit te proberen.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:59

gorgi_19

Kruimeltjes zijn weer op :9

TeeDee schreef op 03 juni 2004 @ 12:27:
[...]

Die dir namen zijn al zo gemaakt. Trace vind ik nog even te ver gaan omdat ik daar nog niet veel van af weet.
Hij heeft het niet over de dirnamen, maar over fi.CreationTime

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:53
gorgi_19 schreef op 03 juni 2004 @ 12:28:
[...]

Hij heeft het niet over de dirnamen, maar over fi.CreationTime
Idd, maar gebruik maken van die Day / Month properties is zowiezo mooier (en minder error-prone). :)

Daarnaast ben ik wel verwonderd dat VB.NET dit zomaar toelaat:

code:
1
Split ( blaat , '-');

waarbij blaat een DateTime is. Ik had toch verwacht dat je die minstens zou moeten converten naar een string.

[ Voor 29% gewijzigd door whoami op 03-06-2004 12:33 ]

https://fgheysels.github.io/


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:30
Ik heb nu inderdaad het split gebeuren eruit gehaald. Even helemaal vergeten dat ik bestandsdatum als Datetime had gedaan.
Nu inderdaad met month en year opgelost.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:59

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 03 juni 2004 @ 12:32:
code:
1
Split ( blaat , '-');

waarbij blaat een DateTime is. Ik had toch verwacht dat je die minstens zou moeten converten naar een string.
Impliciet converten wordt toegestaan als Option Strict uit staat, wat normaliter het geval is. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:30
Het lijkt erop dat er het e.e.a. uitgevoerd wordt \0/

Wat heb ik gedaan:
- het split gebeuren eruitgehaald
- op de server ook folders aangemaakt voor 2002 en 2003
- console.writeline na een filemove gedaan.

Het appje loopt in ieder geval wel :)

ik zie dat ik nog veel moet leren ivm debuggen van win apps e.d. :)
edit:
het ging om 789314 files :)

[ Voor 7% gewijzigd door TeeDee op 03-06-2004 14:01 ]

Heart..pumps blood.Has nothing to do with emotion! Bored

Pagina: 1