Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [VB 6] Rinominare file con un numero crescente

    Ciao a tutti! Sto lavorando a un programma che mi consenta di rinominare tutti i file presenti in una cartella con un numero crescente a partire da quello scritto in una TextBox preservando l'estensione. Finora le ho provate tutte ma non ho cavato un ragno dal buco a parte far conteggiare i file ed estrapolare l'estensione.
    Il codice non funzionante che ho usato è questo:

    Rinomina i file con un numero crescente a partire da quello scritto nella casella di testo fino a quello memorizzato nella variabile globale ind:

    codice:
    Dim ind as Integer
    
    Private Sub cmdRinFile_Click()
    On Error Resume Next
    Dim Estensione As Long
    Dim i As Integer
    Dim j As Integer
    
    Estensione = InStrRev(File1.FileName, ".")
    
      For i = txtNumber.Text To ind
      For i = 1 To ind
        For j = Count To ind
          Name Dir1.Path & "\" & File1.FileName As Dir1.Path & "\" & File1.List(i) & Mid$(File1.FileName, Estensione)
          File1.Refresh
        Next j
       
        lblOk.Caption = "Ok!"
      Next i
         
    End Sub
    Conteggia i file presenti nella cartella e salva il risultato nella variabile globale ind:

    codice:
    Private Sub Dir1_Change()
    Dim entry As String
    Dim ThePath As String
    
      File1.Path = Dir1.Path
      
      For ind = 0 To File1.ListCount - 1
        entry = ThePath + File1.List(ind)
      Next ind
    End Sub
    Il codice per estrapolare l'estensione dal nome del file è questo

    codice:
    Dim Estensione As Long
    
    Estensione = InStrRev(File1.FileName, ".")
    
    Mid$(File1.FileName, Estensione)
    PS: a pensarci bene non è una buona idea far finire la fase di rinomina dei file in base al valore salvato nella variabile, perché se nella cartella ci sono 10 file e nella TextBox scrivo "4" 6 file rimarrebbero con il nome originale.
    Cosa mi suggerite per risolvere il problema?

    Grazie mille!


    EDIT: Ho fatto un pò di confusione con il codice mettendone la versione vecchia con il FileListBox con quella nuova che usa il ListBox. Ora è a posto

  2. #2
    Up!
    Nessuno sa aiutarmi? Forse non ho spiegato bene il problema?

  3. #3
    Al di là di un doppio ciclo for in cui hai usato "i" come contatore, non capisco dove attribuisci un valore alla variabile globale "ind", nè tantomeno perchè usi tale valore come massimo per la rinomina progressiva dei file.

    Suddividi il problema in varie parti, con il codice corollario di correttezza:

    - elencare i file presenti in una cartella
    - per ognuno, estrapola il nome privo dell'estensione e l'estensione stessa
    - controlla che l'input immesso nella textbox sia ammissibile (es. numerico, e altri accorgimenti che - al momento - evito di scrivere)
    - rinomina i file

    A quale punto ti blocchi?
    "Memento audere semper"

    IBM Europe - Italy Group

  4. #4
    Grazie per la risposta.
    Il doppio ciclo è il risultato di infiniti esperimenti, dove le ho provate tutte (in base alle mie conoscenze ovviamente). L'idea iniziale era di usare il valore della variabile "ind" come valore finale del ciclo (in pratica "inizia ad assegnare i nomi dal numero scritto nella TextBox fino a quello memorizzato nella variabile incrementandolo di 1. Ovviamente mi sono accorto che è una procedura sbagliata).
    Mi blocco all'ultimo punto: non riesco a far "capire" a VB che una volta rinominato il primo file deve passare al successivo incrementando di 1 il valore nella casella di testo. Far accettare solo numeri dalla TextBox non è un problema.
    Per estrapolare nome e estensione uso questo codice:

    codice:
    Private Sub File1_Click()
    Dim Estensione As Long
    Dim Nome As Long
    
    Estensione = InStrRev(File1.FileName, ".")
    Nome = InStr(File1.FileName, ".")
    Text1.Text = Mid$(File1.FileName, Estensione)
    Text2.Text = Left$(File1.FileName, Estensione)
    End Sub

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    758
    Se non c'è la necessità di visualizzare i nomi dei file (e mi sembra che non ci sia), non occorre un controllo FileListBox.
    Dovresti usare la funzione Dir() che restituisce ciclicamente i nomi di tutti i file presenti in una cartella:
    codice:
        Dim sNomeIntero As String
        
        sNomeIntero = Dir("miacartella\*.*")
        While sNomeIntero <> vbNullString
            .......
            sNomeIntero = Dir()
        Wend
    Al posto dei puntini va il codice che separa il nome dall'estensione, aggiunge il numero, ricompone l'intero nome ed effettua la rinominazione.
    Meglio sarebbe se questo codice fosse isolato in una piccola funzione.

  6. #6
    Originariamente inviato da Harold
    Grazie per la risposta.
    Mi blocco all'ultimo punto: non riesco a far "capire" a VB che una volta rinominato il primo file deve passare al successivo incrementando di 1 il valore nella casella di testo.
    Il consiglio da seguire religiosamente è quello di utilizzare una variabile di tipo Integer come contatore, in quanto incrementare il contenuto della TextBox è ovviamente possibile, ma concettualmente sbagliato, oltre a necessitare delle opportune conversioni tra tipi di dati: in sostanza, la proprietà Text del TextBox ha un valore di tipo String e non è concesso fare operazioni algebriche tra String, come immagino tu sappia.
    Io farei così:
    codice:
    dim num as integer
    num = CInt(Textbox.text)
    
    nel tuo ciclo incrementi la variabile num dopo ogni rinomina del file semplicemente così:
    num = num + 1
    E' chiaro?

    Una volta risolto il problema, ti dirò quali modifiche sono necessarie per una programmazione difensiva applicata al tuo caso.

    Ciao
    "Memento audere semper"

    IBM Europe - Italy Group

  7. #7
    Scusate l'assenza, non mi sono dimenticato di voi.
    Combinando i precedenti suggerimenti sono arrivato a una soluzione:

    codice:
    Private Sub Command1_Click()
    Dim est As String
    Dim Estensione As String
    Dim num As Integer
    Dim sNomeIntero As String
    
      num = CInt(txtNumber.Text)
      sNomeIntero = Dir(Dir1.Path & "\*.*")
    
      While sNomeIntero <> vbNullString
        Estensione = InStrRev(sNomeIntero, ".")
        est = Mid$(sNomeIntero, Estensione)
        Name Dir1.Path & "\" & sNomeIntero As Dir1.Path & "\" & num & est
        num = num + 1
        sNomeIntero = Dir()
      Wend
    
    End Sub
    Solo che dà qualche problema: se i file da rinominare sono più di 100 inizialmente nessun problema. Se provo a rinominarli nuovamente (es: in una cartella ci sono 170 file correttamente rinominati e io nella TextBox scrivo '171') il programma inizia da 1000. Se provo a rimettere le cose a posto scrivendo '1' nella casella di testo il primo file effettivamente prende nome '1', il secondo '10', il terzo '100' e tutti gli altri da '101' in poi.
    Come risolvo questa cosa?

    PS: per far accettare solo numeri dalla casella di testo uso questo codice, magari a qualcuno serve:

    codice:
    Private Sub txtNumber_KeyPress(KeyAscii As Integer)
      If (KeyAscii < 48 Or KeyAscii > 57) And KeyAscii <> 8 Then
        KeyAscii = 0
      End If
    End Sub

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.