Discussione chiusa
Pagina 2 di 3 primaprima 123 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 27

Controllo se file esiste

  1. #11
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Post
    16,804
    Like Inviati  
    0
    Like Ricevuti  
    23
    Quote Originariamente inviato da MarcoGG Visualizza il messaggio
    E' proprio questo il punto, invece.
    Quella Const va considerata eccome, perchè, come penso, se lui ha fatto casino tra percorso della Const e percorso reale del check, si spiega il perchè non dia il risultato sperato.
    Ora, ripeto, io penso che lui per testare il suo check vada in "\carmelina\" a mettere/togliere il file.
    Solo che in "C:\" ha lasciato lo stesso file ini ! Probabilmente frutto di un check precedente.
    E allora è ovvio che gli restituisce sempre "ESISTE". Non so se mi spiego.
    Solo quando correggerà quel check così :
    If esiste = Dir(INIFileName) Then
    ...
    


    si renderà conto che funziona.
    Si quello che scrivi era ovvio fin dall'inizio... ho contestato il fatto che tu, a parte referenziare il file corretto, hai scritto un codice UGUALE dicendo che il suo era sbagliato... ed il tuo giusto.
    NO, entrambi sono uguali, il tuo funziona perchè hai referenziato il file nella posizione corretta, bastava sostituire nel SUO il riferimento al File INI dichiarato nella Costante...!

    Quote Originariamente inviato da MarcoGG Visualizza il messaggio
    Per questo parlo di errore logico, o se preferisci "errore occulto", che sta alla base di tutto.
    Il mio codice potrà essere sintatticamente equivalente, ma non uguale ( io non mi sogno di creare una String vuota da usare al posto di un semplice "", e non creo variabili per lasciarle inutilizzate ), e soprattutto non è uguale il suo utilizzo, ossia le condizioni di test.

    In ogni caso la Function Dir() è già più che sufficiente, perchè l'hanno inventata apposta.
    Si.
    Quote Originariamente inviato da MarcoGG Visualizza il messaggio
    Non c'è alcun bisogno di fare una Len su Dir,
    Quì, volendo scendere nel tecnico veramente, ci sarebbe da parlare a ragion veduta...!
    Nel dare la risposta che hai dato ora... hai tenuto conto delle ottimizzazioni che il codice esegue nella comparazione di Stringhe piuttosto che di numeri...?

    Mi spiego meglio, secondo te il codice più veloce è quello di comparazione di 2 Stringhe o quello di Conteggio del numero di caratteri...??

    Se ti sei posto il problema la tua risposta devi motivarla tecnicamente, se non ti sei posto il problema tecnicamente hai scritto una cosa sbagliata perchè i confronti
    tra Stringhe è risaputo siano MOLTO meno efficienti.

    Siccome stiamo parlando di cose tecniche io non parto mai dal minimizzare queste considerazioni, parto dal conoscerle ed in base a questo posso decidere quale usare.
    Tecnciamente parlando pertanto Len(Dir(...))>0 è meglio che confrontare 2 stringhe, così come usare la costante vbNullString è meglio che usare "" ...!
    Puoi farlo, non farlo, ritenere siano pippe... non importa tecnicamente è così.

    Che poi anche la tua soluzione sia equivalente come risultato non ci piove... ognuno poi è libero di scegliere quando le cose le affronta in modo tecnico, ma quando si sostiene che una cosa è meglio di un'altra l'unica strada per farlo è quella della dimostrazine tecncia non a sensazione.
    Quote Originariamente inviato da MarcoGG Visualizza il messaggio
    e tantomeno tirare in ballo una GetAttr() per vedere se va in errore...
    Vale la stessa considerazione... non banalizziamo MAI quello che suggeriscono altri, potrebbero avere informazioni che ci sfuggono, chiediamo piuttosto perchè la soluzione proposta
    potrebbe essere meglio... magari si impara qualche cosa di nuovo...!
    ℹ️ Leggi di più su @Alex ...

  2. #12
    Post
    1,608
    Blogs
    33
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Si quello che scrivi era ovvio fin dall'inizio...
    Ovvio non direi. Non esiste solo la sintassi, ma anche la logica e la semantica di quello che si fà. Direi invece che la mia interpretazione del problema, codice a parte, alla fine si è rivelata quella giusta, come sottolineato dallo stesso utente che ha aperto il thread.

    Quote Originariamente inviato da @Alex Visualizza il messaggio
    ho contestato il fatto che tu, a parte referenziare il file corretto, hai scritto un codice UGUALE dicendo che il suo era sbagliato... ed il tuo giusto.
    Ed esattamente dove avrei scritto "giusto" e "sbagliato" ?
    Non mi risulta di aver mai scritto che il mio codice è "quello giusto", bensì che "il codice essenziale per il check su esistenza file è...".
    L'utente pazienza ha fatto una chiara richiesta del tipo "ditemi dove sta l'errore nel mio codice".
    E io gli ho risposto semplicemente che non c'è niente di male ad usare Dir(), ma che andava rivisto sul piano logico/semantico. Cosa che poi si è rivelata vera.

    Quote Originariamente inviato da @Alex Visualizza il messaggio
    NO, entrambi sono uguali, il tuo funziona perchè hai referenziato il file nella posizione corretta,
    Codici equivalenti non significa uguali. Almeno non per me.
    E torno a ripetere che dichiarare una Stringa senza inizializzarla, per usarla poi in un confronto, sapendo che è vuota, è inutile e prolisso.
    Una cosa è scrivere :
        Dim a As String
        If funzione() = a Then
    
    E una cosa è scrivere :
    If funzione() = "" Then
    
    Ognuno ha i suoi "gusti", ma a casa mia la prima si chiama "scrivere codice inutile".

    Quote Originariamente inviato da @Alex Visualizza il messaggio
    bastava sostituire nel SUO il riferimento al File INI dichiarato nella Costante...!
    Sì, grazie. Questo l'ho già detto io qualche post fa.

    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Siccome stiamo parlando di cose tecniche io non parto mai dal minimizzare queste considerazioni, parto dal conoscerle ed in base a questo posso decidere quale usare.
    Tecnciamente parlando pertanto Len(Dir(...))>0 è meglio che confrontare 2 stringhe, così come usare la costante vbNullString è meglio che usare "" ...!
    Puoi farlo, non farlo, ritenere siano pippe... non importa tecnicamente è così.
    Mi rendo perfettamente conto del discorso tecnico.
    Penso nessuno si offenda se esprimo il mio personalissimo e opinabilissimo punto di vista :
    se qualcuno mi chiede come controllare se UN file esiste oppure no, in UNA posizione nota, continuo a consigliare Dir() nudo & crudo. Il resto sono "pippe".
    In casi come questo preferisco di gran lunga semplificare il codice al massimo, piuttosto che sperare in qualche milionesimo di secondo, o in qualche byte di memoria risparmiato.

    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Che poi anche la tua soluzione sia equivalente come risultato non ci piove... ognuno poi è libero di scegliere quando le cose le affronta in modo tecnico, ma quando si sostiene che una cosa è meglio di un'altra l'unica strada per farlo è quella della dimostrazine tecncia non a sensazione.
    Ma più che altro la mia soluzione è esattamente quella richiesta da pazienza.
    ℹ️ Leggi di più su MarcoGG ...

  3. #13
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Post
    16,804
    Like Inviati  
    0
    Like Ricevuti  
    23
    Quote Originariamente inviato da MarcoGG Visualizza il messaggio
    ...

    Mi rendo perfettamente conto del discorso tecnico.
    Penso nessuno si offenda se esprimo il mio personalissimo e opinabilissimo punto di vista :
    se qualcuno mi chiede come controllare se UN file esiste oppure no, in UNA posizione nota, continuo a consigliare Dir() nudo & crudo. Il resto sono "pippe".
    In casi come questo preferisco di gran lunga semplificare il codice al massimo, piuttosto che sperare in qualche milionesimo di secondo, o in qualche byte di memoria risparmiato.
    Si si capisco, infondo genete che scrive codice ne abbiamo tanta... genete che capisce cosa significa scrivere codice ottimizzato in modo coscenzioso meno... "basta che funzioni"...
    Ci sono in giro scrittori di VB che non sanno la differenza tra sommare stringhe con il + o con & ... che non dichiarano e non distruggono oggetti, che controllano con Is Null le stringhe... e tutto funziona...

    Io non approvo questo modo miope e riduttivo di vedere le cose... se il codice ha una sua logica, quella è il DOGMA ed il resto gira attorno.
    Sono consapevole infatti che chi legge con conoscenza di causa, capisce.... e quì mi pare ci sia poco da spiegare.
    Quote Originariamente inviato da MarcoGG Visualizza il messaggio
    Ma più che altro la mia soluzione è esattamente quella richiesta da pazienza.
    Era la soluzione meno ottimizzata che svolgeva un lavoro equivalente, tu continua a vederla come "pippa"... io continuo a fare le cose con cognizione.
    ℹ️ Leggi di più su @Alex ...

  4. #14
    Post
    1,608
    Blogs
    33
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Si si capisco, infondo genete che scrive codice ne abbiamo tanta... genete che capisce cosa significa scrivere codice ottimizzato in modo coscenzioso meno... "basta che funzioni"...
    Ci sono in giro scrittori di VB che non sanno la differenza tra sommare stringhe con il + o con & ... che non dichiarano e non distruggono oggetti, che controllano con Is Null le stringhe... e tutto funziona...

    Io non approvo questo modo miope e riduttivo di vedere le cose... se il codice ha una sua logica, quella è il DOGMA ed il resto gira attorno.
    Sono consapevole infatti che chi legge con conoscenza di causa, capisce.... e quì mi pare ci sia poco da spiegare.
    "C'è in giro tanta gente che", non mi fa caldo nè freddo. Non è il mio caso. Se è una velata critica al sottoscritto, non importa : non pervenuta.

    Potrò anche essere un "Neofita della community", limitatamente a questo Forum, ma è bene non generalizzare e giudicare un utente solo da questo. Cosa che personalmente non faccio mai.

    Chi legge questa discussione con conoscenza di causa capisce che già al mio post #6 avevo individuato il vero problema dell'utente pazienza.
    Consigliare una Len(Dir()) anzichè una Dir(), e NON accennare minimamente ai vizi logici insiti nel suo test, francamente la vedo una soluzione irrilevante. Che ti piaccia o no, è dopo i miei interventi che pazienza ha risolto.
    Quando dico "Evidentemente ti è sfuggito l'errore logico più importante...", parlo proprio del fatto che il vero grande problema del suo check sia di natura logica, e non del fatto che sta usando Dir() invece che Len(Dir()).
    Mettiamo pure che avesse usato Len(Dir()) nel suo codice : in QUELLE condizioni di test si sarebbe trovato nella stessa situazione. Perciò PRIMA si mette a posto la logica/semantica di quello che si vuole fare, POI si pensa all'ottimizzazione.

    Posso essere d'accordo che LEN(DIR()) sia meglio di DIR().
    In un semplice check di singolo file in posizione nota ( non c'è nemmeno bisogno di andare in giro a cercarlo... ) personalmente è una cosa che non farei, perchè se non ho risultati prestazionali tangibili, ripeto, la mia personale ed opinabile tendenza è quella di prediligere la pulizia del codice ( meno ne scrivo, meglio sto ). E in questo caso la differenza prestazionale tra una LEN(DIR()) e una DIR() è impercettibile.
    Se poi per te questo basta a precipitarmi nell'inferno di quelli-che-basta-che-funziona, non so che farci : sopravviverò...

    Dire che "Sì, vabbeh, questo era ovvio fin dall'inizio...", solo DOPO che pazienza ha candidamente ammesso che il vero problema stava in quanto avevo previsto, mi pare molto poco corretto, dal momento che tu ti sei limitato solo a consigliare Len(Dir()).
    Evidentemente per quell'utente tanto ovvio non era, sennò perchè mai avrebbe aperto il thread per chiedere aiuto ?

    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Era la soluzione meno ottimizzata che svolgeva un lavoro equivalente, tu continua a vederla come "pippa"... io continuo a fare le cose con cognizione.
    Beh, intanto c'è già un miglioramento : da soluzione uguale sei passato ad equivalente.

    Se puoi suggerire un codice di test che metta in luce il reale risparmio di tempo e risorse, in presenza di molte stringhe, utilizzando Len(), ovviamente sarò ben felice di provarlo.

    Personalmente non ho altro da dire. Sono lieto di aver dato un contributo, credo decisivo, alla soluzione del problema.
    ℹ️ Leggi di più su MarcoGG ...

  5. #15
    Post
    635
    Blogs
    2
    Like Inviati  
    0
    Like Ricevuti  
    0
    Personalmente non mi fiderei mai di dir,sopratutto qunado il progetto è qualcosa di piu complesso,ovvio che in questo caso si può utilizzare benissimo dir()="" che magari risulta anche piu veloce di len(dir())>0.
    Ma forse bisogna usare un codice logico e riutilizzabile,con una perfetta gestione degli errori,per farvi capire del perchè del mio codice analizzate il codice seguente.

    Option Explicit
    
    Public Function EsisteFile(ByVal str As String) As Boolean
        On Error Resume Next
        EsisteFile = (GetAttr(str) And vbDirectory) = 0
    End Function
    
    Private Sub Form_Load()
        On Error Resume Next
            If EsisteFile("Ciao Mondo") Then
                MsgBox "Che diavolo di computer ho?"
            Else
                MsgBox Err.Description
            End If
        On Error GoTo 0
    End Sub
    
    Certo che in un progetto "semplice" potrebbe sembrare uno spreco di codice,ma in un progetto complesso e ben organizzato l'aggiunta di codice ritornerà sicuramente utile.
    ℹ️ Leggi di più su vbExtreme ...

  6. #16
    Post
    635
    Blogs
    2
    Like Inviati  
    0
    Like Ricevuti  
    0
    [DIMENTICAVO]

    Se pensate che non sia abbastanza,provate ad analizzare anche il seguente stralcio di codice.

    Option Explicit
    
    Public Function EsisteFile(ByVal str As String) As Boolean
        On Error Resume Next
        EsisteFile = (GetAttr(str) And vbDirectory) = 0
    End Function
    
    Private Sub Form_Load()
        On Error Resume Next
            If EsisteFile("c:\programmi") Then
                MsgBox "Che diavolo di computer ho?"
                
            ElseIf Not Err.Number = 0 Then
                MsgBox Err.Description
                
            Else
                MsgBox "Cavolo ma mi hai scritto una directory!"
            End If
        On Error GoTo 0
    End Sub
    
    [/DIMENTICAVO]
    ℹ️ Leggi di più su vbExtreme ...

  7. #17
    Post
    1,608
    Blogs
    33
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da vbExtreme Visualizza il messaggio
    Personalmente non mi fiderei mai di dir,sopratutto qunado il progetto è qualcosa di piu complesso...
    ...
    Vorrei che tu motivassi quanto stai affermando.
    Perchè non ti fideresti mai di Dir() ?
    Se non ti fidi della Function in sè allora non capisco la distinzione che fai : in un progetto "semplice" mi fido / in un progetto "complesso" non mi fido...

    Qui c'è la pagina Msdn che tratta Dir() in VS6.0 :
    Dir Function

    Qui svariati esempi di utilizzo :
    Dir Function Example
    ℹ️ Leggi di più su MarcoGG ...

  8. #18
    Post
    635
    Blogs
    2
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ecco perchè:
    Primo errore:
        If Dir("") = "" Then
            MsgBox "Non esiste"
        Else
            MsgBox "Esiste"
        End If
    
    Se non passi nessun parametro dovrebbe restituire non esiste,invece il codice presenta un bug,prova ad immaginare se per comodità sintattica implementeresti un codice tipo questo:

    Option Explicit
     
    Public Function EsisteFile(ByVal str As String) As Boolean
        If Not Dir(str) = "" Then EsisteFile = True
    End Function
     
    Private Sub Form_Load()
     
        MsgBox EsisteFile("")
     
    End Sub
    
    Questo è un bug della funzione "esistefile".
    Secondo la funzione dir accetta * e se in alcuni casi è un piacere in altri è una pecca.
    quindi se hai un file "Pippo.txt" ,e vuoi sapere se nella tua directory hai un file dal nome "Pippo.jpg" il programmatore potrebbe essere indotto nell'usare il carattere * commettendo cosi un grave errore!

    Option Explicit
     
    Public Function EsisteFile(ByVal str As String) As Boolean
        If Not Dir(str) = "" Then EsisteFile = True
    End Function
     
    Private Sub Form_Load()
     
        MsgBox EsisteFile("c:\Pippo.*")
     
    End Sub
    
    A mio avviso una funzione deve servire solo ed esclusivamente per uno scopo,tale scopo,dovrà essere svolto nei migliori dei modi.
    Come Spiega bene il nome della funzione essa dovrà solo ed esclusivamente dire se il nome del file passato esiste oppure no.Deve poi essere il piu portabile possibile,se non sono riuscito ancora a spiegarti la portabilità della funzione prova ad Analizzare il seguente codice:

    Problema:Leggere un file INI contenuto in un archivio di massa usb con lettera J:,tale file contiene salvate delle impostazioni del programma.
    Option Explicit
     
    Public Function EsisteFile(ByVal str As String) As Boolean
        On Error Resume Next
        EsisteFile = (GetAttr(str) And vbDirectory) = 0
    End Function
     
     
     
    Private Sub Form_Load()
     
        Const FILE_INI As String = "j:\dati.ini"
     
        Const ERR_PERIFERICA_SCOLLEGATA As Long = &H4C
        Const ERR_FILE_NOT_FOUND As Long = &H35
     
        On Error Resume Next
            If EsisteFile(FILE_INI) Then
                'file esiste faccio qualcosa
     
            ElseIf Err.Number = ERR_PERIFERICA_SCOLLEGATA Then
                MsgBox "Collega la periferica J: prima di aprire il programma"
     
            ElseIf Err.Number = ERR_FILE_NOT_FOUND Then
                'creo il file con le opzoni di default
     
            Else
                MsgBox "Errore imprevisto"
            End If
        On Error GoTo 0
    End Sub
    
    Usando la tua funzione rimarresti al buio e ti complicheresti la vita in chissà quale modo.

    [DIMENTICAVO]

    La stessa casa M non si fida di dir e lo spiega cosi:
    Quote Originariamente inviato da DAL TUO LINK
    ' Ignore the current directory and the encompassing directory.
    If MyName <> "." And MyName <> ".." Then
    ' Use bitwise comparison to make sure MyName is a directory.
    If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then
    Debug.Print MyName ' Display entry only if it
    End If ' it represents a directory.
    End If
    Potrebbe saltare fuori qualche pasticcio se usassimo solo dir per controllare il nome di qualcosa!
    Ultima modifica di vbExtreme; 05-12-2010 12:35 
    ℹ️ Leggi di più su vbExtreme ...

  9. #19
    Post
    1,608
    Blogs
    33
    Like Inviati  
    0
    Like Ricevuti  
    0
    La funzione Dir() ha un suo scopo e una sua logica di utilizzo.

    Se qualcuno mi dice "non mi fido di Dir()", per me equivale a "non so/voglio usare Dir()".

    Se iniziamo ad uscire dallo scopo di utilizzo della presente discussione, esplorando ogni caso possibile, allora non finiamo più. Potremmo usare infinite soluzioni per infiniti problemi.
    Potrei usare una soluzione simile a quella che proponi. Potrei costruire una Function attorno a Dir(). Potrei usare Microsoft.Scripting.Runtime. Potrei... Potrei...

    Mi vengono in mente un paio di discussioni su altro Forum in cui utenti chiedevano un semplice consiglio su un database locale per applicazione stand-alone. Il primo consiglio è Access, poi arriva il secondo che dice "ma Access ha il limite di 2GB", poi il terzo : "ma Access non c'ha i trigger", poi il quarto : "ma Access ha scarso supporto alla concorrenza degli accessi", e così via. Insomma alla fine il povero Cristo di turno si sente consigliato di mettere su Oracle, così sa a priori che avrà tutto quello che gli serve.

    Di Function avanzate su file e directory se ne possono fare a migliaia, a seconda delle esigenze.
    Personalmente mi fido di Dir(), perchè ne conosco l'uso e i limiti.

    Ipotizzare un uso come Dir(""), EsisteFile(""), e quant'altro è assurdo. Che senso ha chiedere a VB "Dimmi se il file stringa-vuota esiste" ?!?
    E' semplicemente illogico. Il controllo sul fatto che il parametro da dare in pasto a Dir() NON deve essere una stringa vuota va fatto a monte, oppure basterà includere Dir() in una Function che controlli il parametro fullpath in ingresso e agisca di conseguenza, esattamente come si fa di prassi con una moltitudine di altre funzioni VB...

    Quando dici : se hai un file "Pippo.txt" ,e vuoi sapere se nella tua directory hai un file dal nome "Pippo.jpg" ... Non capisco cosa intendi.
    Se voglio sapere se esiste un file "pippo.txt" :
        If Dir("C:\pippo.txt") = "" Then
            MsgBox "non esiste"
        Else
            MsgBox "esiste"
        End If
    
    Se in C:\ ho 2 file ( "pippo.txt" e "pippo.bmp" ) e voglio sapere se esiste almeno un file di nome pippo ed estensione qualsiasi :
        If Dir("C:\pippo.*") = "" Then
            MsgBox "non esiste"
        Else
            MsgBox "esiste"
        End If
    
    E funziona come desiderato. Non mi risulta ci sia niente di anormale, a patto di conoscere esattamente cosa è in grado di offrire Dir(), il quando e il come usarla...
    ℹ️ Leggi di più su MarcoGG ...

  10. #20
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Post
    16,804
    Like Inviati  
    0
    Like Ricevuti  
    23
    Quote Originariamente inviato da vbExtreme Visualizza il messaggio
    Ecco perchè:
    .....

    Potrebbe saltare fuori qualche pasticcio se usassimo solo dir per controllare il nome di qualcosa!
    Questo è l'approccio che mi piace.

    Anche se non ho sostenuto fosse questione di ms, ma di allocazione di memoria usata cosa fortemente non capita..., ho fatto questi test su 100 iterazioni, lasciano il tempo che trovano anche per la viariabilità di cui sono affetti ma giusto per ho mediato ...
    Len(Dir(....))>0 -----> 16,16 ms
    Dir(...)="" ----> 16,83 ms
    Dir(...)=vbNullstring ----> 16,16 ms
    GetAttr(...) ----> 10,05 ms
    API(...) ----> 15,45 ms
    
    La funzione API è questa Determine if a File Exists Using the Windows API
    ℹ️ Leggi di più su @Alex ...

Discussione chiusa
Pagina 2 di 3 primaprima 123 ultimoultimo

Potrebbero interessarti anche ...

  1. HTML esiste un codice che consenta il download di file txt?
    Da Francesco53 nel forum HTML, CSS e JavaScript
    Risposte: 5
    Ultimo Post: 08-04-2018, 15:14
  2. Risposte: 5
    Ultimo Post: 13-06-2014, 21:20
  3. come vedere se esiste un file in una cartella
    Da mattoneo nel forum Visual Basic 6
    Risposte: 7
    Ultimo Post: 20-02-2008, 21:47
  4. Generare un evento se in una directory il file esiste
    Da nightingales nel forum Visual Basic .Net
    Risposte: 3
    Ultimo Post: 22-02-2006, 09:52
  5. Verifica se esiste file
    Da malibu nel forum Visual Basic 6
    Risposte: 2
    Ultimo Post: 18-01-2006, 14:55