Newsgroup: it.comp.lang.visual-basic
Titolo: VB3 - come copiare files con wildcards ?

Con Win98 e Vb3 ho la necessità di eseguire un comando del tipo:
copy \miadir\*.  filenuovo_concatenato.txt
cioè unire tutti i files (ascii) che si trovano in una directory senza
estensione, in un unico file
(ascii).
Con Vb3 esiste in comando filecopy, ma non accetta wildcards (*.).
Una soluzione sarebbe richiamare con shell un file BAT che mi esegua il
comando di
 concatenamento, ma mi sembra una soluzione bruttina da vedere e poca
parametrizzabile
(non riesco a iniare al file bat variabili  di percorso ad esempio)
La domanda è: c'è un API win 3.1 che copia i file e che accetti wildcards?
Io ho trovato solo CopyLZFile ma se ho capito bene  a parte il fatto che
sembra sia ad hoc
solo per file compressi ,occorre prima passare degli handle....
Insomma avete capito il problema, voi come fareste?

 wrote in message 7gud56$17p$1...@nslave1.tin.it...

Tu dici: la domanda e'... ed io a quella domanda non so rispondere. O meglio
non ho una risposta "presentabile" e dovrei spendere un po' di tempo per
documentarmi. Vorrei pero' fare alcune considerazioni sulla prima parte del
tuo quesito, dove definisci "bruttina" e "poco parametrizzabile" la
soluzione del file BAT. Esamina questo esempio:
Concatena.BAT
@COPY /A %1 %2 /Y
Esecuzione:
Concatena *. pippo.txt
Effetto:
Crea, se non esiste, o sovrascrive, se gia' esistente, il file pippo.txt
quindi appende a questo file tutti i file senza estensione presenti nella
cartella. Puoi leggere il significato
di /A e /Y digitando, al Prompt di MS-DOS, copy /?
--
Ciao.
Maurizio

 --
Va bene, intanto grazie per la considerazione, ma continuando sul discorso
BAT,
per "poco parametrizzabile", intendevo dire che non posso passare da VB3
delle variabili da inserire come dici tu in %1 e %2 o almeno ignoro questa
arcana
possibilità....
Altro discorso per me bruttino è il controllo del ritorno della funzione
asincrona SHELL,
cioè da vb non posso controllare l'esito positivo o negativo della procedura
BAT.....
Mah, se hai altre considerazioni per me , sono qui!!!
Grazie!

 Grazie!
Prego. Ho letto il tuo messaggio ricevendo l'impressione che volessi
dimostrare fastidio per quello che ho detto o per come l'ho detto ed ho
risposto di conseguenza. Se ho interpretato male scusami.
--
Ciao.
Maurizio

 > BAT.....
[...]
Ti chiedo molto umilmente perdono. Butta via senza neanche leggerlo il mio
post al quale, con questo, rispondo. Ti accusavo di non leggere bene le
risposte (ma in parte era un'accusa corretta) e ci sono cascato anch'io con
la tua frase qui sopra che, a prima vista, senza riflettere, ho interpretato
come se quel "esito positivo o negativo" volesse dire "chiusura della
finestra Prompt di MS-DOS", tratto in inganno dalla parola "asincrona" e,
soprattutto, con l'oggetto del tuo post: VB3!!! Mi dispiace, il mio esempio
usa chiamate di Win32. Chissa' che ci sia qualche anima buona che lo voglia
"correggere" per VB3...
--
Ciao.
Maurizio
P.S. Magari non buttarlo subito subito, dacci prima un'occhiata che forse
c'e' comunque qualcosa che ti puo' interessare. E fammi sapere.

(ascii).
A parte la soluzione con il file batch di cui ti parla R.B., potresti
usare una procedura magari macchinosa ma che ti darebbe il controllo totale:
Apri un file temporaneo in output, apri in input uno per uno quelli che vuoi
concatenare, leggine il contenuto e copialo nel tuo file. Esempio pratico:
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''
Option Explicit
    Dim intFileInOutput As Integer
    Dim intFileInInput As Integer
    Dim strNomeDelFileInUscita As String
    Dim strNomeDelFileInIngresso As String
    Dim strNomeDelFileTemporaneo As String
    Dim DirInput As String
    Dim strTemp As String
    strNomeDelFileInUscita = "Concatenato.txt"
    strNomeDelFileTemporaneo = "-_-_-_-_-_.---"
    intFileInOutput = FreeFile
    Open DirInput & strNomeDelFileTemporaneo For Output As intFileInOutput
    DirInput = "C:\"
    strNomeDelFileInIngresso = Dir$(DirInput & "*.TXT")
    Do While strNomeDelFileInIngresso <> ""
        intFileInInput = FreeFile
        Open DirInput & strNomeDelFileInIngresso For Input As intFileInInput
        Do While Not EOF(intFileInInput)
            Line Input #intFileInInput, strTemp
            ' in questo punto puoi anche inserire dei controlli sulla riga
che leggi
            ' e filtrarla se è necessario
            Print #intFileInOutput, strTemp
        Loop
        Close intFileInInput
        strNomeDelFileInIngresso = Dir$
    Loop
    Close intFileInOutput
    Name DirInput & strNomeDelFileTemporaneo As DirInput &
strNomeDelFileInUscita
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''
L'esempio è scritto al volo e appena controllato, e manca anche il controllo
di errore,
ma per cominciare dovrebbe bastarti.
P.S. Con il VB5 il Do-Loop più interno non sarebbe necessario, potresti
inserire tutto il file
nella variabile stringa in un colpo solo.
Buon lavoro !
------------------------------------------------
In questa signature ci andrebbe una bella frase,
appena ne trovo una buona ce la metto...
------------------------------------------------
Real E-address: 
gaet...@hotmail.com

Ok! grazie 1000 finalmente cosě mi piace!
Saluti.

 concatenare, leggine il contenuto e copialo nel tuo file. Esempio pratico:
[...]
E' curioso notare cosa ciascuno di noi intenda per macchinoso: a me sembrava
macchinosa la soluzione da me proposta.
Vorrei anche osservare che cio' che proponi e' ottimo quando, come dici, e'
necessario operare esclusioni o conversioni, oltre al puro e semplice
concatenamento, ma credo che il metodo che implementa l'uso del comando Copy
sia piu' veloce quando i file sono di dimensioni considerevoli. Io ho
provato a concatenare 4 file di circa 400KB coi due metodi ottenendo un
rapporto di 1:6 a favore di Copy.
--
Ciao.
Maurizio

rapporto di 1:6 a favore di Copy.
  Bisogna anche vedere se esiste, e questo bisognerebbe chiederlo a
Sceriffo,
  una priorità sulla velocità di programmazione o su quella di esecuzione.
  Mi spiego meglio: se nel suo prog ha bisogno di concatenare 4 o 5 files
  da 3 Kb   l'uno è un discorso, e la differenza fra i due metodi risulta
minima,
  ovviamente se ne deve concatenare 5 da un mega l'uno, con la mia routine
  fa in tempo ad andare a prendere un caffè e ritorno... :-(
  Il problema comunque è il VB3, come dicevo anche a lui, il VB5-6 può
mangiare
  tutto un file con una unica input, e la velocità, secondo delle prove che
  feci un paio di anni fa, è quasi identica a quella del FileCopy.
  Esiste poi un'altra soluzione possibile, è ancor più macchinosa, ma molto
più
  veloce: leggere il file come binario, a blocchi di almeno 32K con la
funzione
  InputB e scriverli su un altro file in binario; la rogna è quella della
gestione
  dei blocchi, ma funziona a tutta birra. Non sono sicuro per il VB3, ma in
VB4
  andava bene.
  P.S.: Il bello del NG è anche (soprattutto ?) quello di confrontare stili
  diversi e soluzioni diverse per gli stessi problemi.
  Poi, se a qualcuno serve un "Quick & dirty trick", beh, c'è anche quello !
  Ciao :-)
  Gaetano


   imparare a richiamare delle API a 32 bit da un programma VB3...
[...]
Concordo anch'io con te in tutto, anche con quello che ho tagliato per
abbreviare, tranne per la faccenda della finestra Dos. Se dai un'occhiata al
codice che ho postato quella finestra non si vede, si chiude da sola e
l'elaborazione attende la sua chiusura.
Con questo non vorrei dare l'impressione di voler difendere quel codice.
Anche a me non piace molto e mi pare di aver anche chiesto soluzioni
alternative.
--
Ciao.
Maurizio