[VB.NET] file renamen

Pagina: 1
Acties:

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
Ik wil een heel eenvoudige actie uitvoeren, en dat is namelijk een aantal bestanden renamen.
Ik ben bezig om een fotoboek te maken, en heb allerlei *.jpg bestanden in meerdere folders zitten.
Alle files hebben een volgnummer, dus bijvoorbeeld 0.jpg, 1.jpg, enz..
Dit zorgt jammer genoeg voor sorteringsproblemen, dus wil ik graag de fotos hernoemen naar 000.jpg en 001.jpg. (ik heb nergens meer als 1000 fotos)

Ik heb nu deze code:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        Dim diParent As New IO.DirectoryInfo(Server.MapPath("photoAlbum"))
        Dim arrDir As IO.DirectoryInfo() = diParent.GetDirectories()
        Dim diItem As IO.DirectoryInfo
        For Each diItem In arrDir
            Dim diChild As New IO.DirectoryInfo(Server.MapPath("photoAlbum/" & diItem.ToString))
            Dim fiPics As IO.FileInfo() = diChild.GetFiles("*.jpg") 
            Dim fiItem As IO.FileInfo
            For Each fiItem In fiPics
                If Len(fiItem.ToString) < 7 Then
                    Rename(fiItem.ToString, "0" & fiItem.ToString)
                End If
            Next

        Next


Ik krijg de volgende foutmelding:
Procedure call or argument is not valid.

Jammer genoeg zeggen de foutmeldingen in .NET mij bijzonder weinig (misschien heeft iemand hier tips voor), maar ik weet zeker dat het iets onbenulligs is....
heb al gegoogled en op GoT gezocht, maar niets kunnen vinden gek genoeg. Heb ook een voorbeeld van MSDN geprobeerd, werkte ook niet. |:(

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:38
Op welke lijn krijg je die foutmelding ?

Ik zie trouwens dat je ook oude VB functies gebruikt (zoals Len bv). Waarom doe je dat ? Waarom gebruik je de member methods van de string class niet ?
Rename is trouwens ook geen .NET method; waarom gebruik je bv. de File.Move method niet om je file te renamen ?

https://fgheysels.github.io/


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
de foutmelding krijg ik op de regel met de Rename() functie.

Ik heb geen VB ervaring, dus ik was me niet bewust dat het eigenlijk een oude functie is. Ik dacht van Rename dat het wel een .NET functie was, omdat dit mi toch logischer is als een .Move methode....maar dan zit ik er dus naast. Ik zal voortaan goed controleren of het .NET functies zijn...

ik krijg de .Move ook niet echt aan de praat:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        Dim diParent As New IO.DirectoryInfo(Server.MapPath("photoAlbum"))
        Dim arrDir As IO.DirectoryInfo() = diParent.GetDirectories()
        Dim diItem As IO.DirectoryInfo
        For Each diItem In arrDir
            Dim diChild As New IO.DirectoryInfo(Server.MapPath("photoAlbum/" & diItem.ToString))
            Dim fiPics As IO.FileInfo() = diChild.GetFiles("*.jpg") 'optionele param ".extension"
            Dim fiItem As IO.FileInfo
            For Each fiItem In fiPics
                If Len(fiItem.ToString) < 7 Then
                    Dim strOld As String = fiItem.ToString
                    Dim strNew As String = "0" & fiItem.ToString
                    Response.Write(fiItem.ToString & " > ")
                    File.Move(strOld, strNew)
                    Response.Write(fiItem.ToString & "<br>")
                End If
            Next
        Next


Foutmelding:
Could not find file "00.jpg".

Dit is de target, die hoeft toch helemaal niet te bestaan?!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:38
Ipv een 0 te appenden, doe je beter een PadLeft van die string; daarbij: je doet een ToString() op een FileInfo object. Ben je dan wel zeker dat dit ook de naam van je file geeft ? Je gebruikt beter de Name property.
Je zult wel het volledige path moeten opgeven bij je target.

code:
1
2
3
4
5
6
foreach( FileInfo fi in fiPics )
{
     File.Move (fi.FullName, System.IO.Path.Combine (fi.DirectoryName, 
                                                    System.IO.Path.GetFileNameWithoutExtension (fi.Name).PadLeft (3, '0')) +
                                                    System.IO.Path.GetExtension (fi.Name)));
}


Ik zou het ongeveer zo doen; de code is wel in C#, niet getest (ff zo uitgeschreven), maar ik denk dat je 't wel zou moeten snappen.

https://fgheysels.github.io/


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
Ik dacht dat het volledige pad niet nodig was. klein detail :)
tnx voor de tips...nu moet ik er wel uitkomen jah.