Discussione:
Copia file con SHFileOperation
(troppo vecchio per rispondere)
Federico
2005-04-27 20:19:08 UTC
Permalink
Ciao *.*,
sto cercando di eseguire una copia di alcuni file da una cartella che ne
contiene quasi mille.
Il criterio di selezione che ho bisogno di applicare è che tutti i file che
hanno la quinta lettera del nome uguale ad es. a "b" sono da copiare da
un'altra parte.
Con SHFileOperation ho impostato .pFrom = "\\server\cartella\????b*.*" &
Chr$(0) ma ho il problema che questa chiamata mi preleva i file basandosi sul
nome corto dei file, quello in formato 8.3.
Per farvi capire l'inghippo, mi copia nella cartella di destinazione i file:
aredb-5standard.txt (OK) e clie-stdperbanca.txt (???).
Facendo da dos: dir ????b*.* /x nella cartella di partenza, ottengo la
seguente risposta:

01/02/2001 14.17 41 AREDB-~2.TXT aredb-5standard.txt
25/09/2003 10.10 90 CL42B6~1.TXT clie-stdperbanca.txt

dove è palese che entrambi nel nome corto hanno la b, purtroppo.
Ragazzi, se vi viene in mente qualcosa, anche il suggerimento più vago, è il
benvenuto, perché l'alternativa per me è copiare a mano ***una valle*** di
file in una quarantina di cartelle diverse.
Ciao e grazie in anticipo,
Federico
GbC|
2005-04-28 14:11:47 UTC
Permalink
Post by Federico
sto cercando di eseguire una copia di alcuni file da una cartella che ne
contiene quasi mille.
Il criterio di selezione che ho bisogno di applicare è che tutti i file che
hanno la quinta lettera del nome uguale ad es. a "b" sono da copiare da
un'altra parte.
Con SHFileOperation ho impostato .pFrom = "\\server\cartella\????b*.*" &
Chr$(0) ma ho il problema che questa chiamata mi preleva i file basandosi sul
nome corto dei file, quello in formato 8.3.
aredb-5standard.txt (OK) e clie-stdperbanca.txt (???).
Facendo da dos: dir ????b*.* /x nella cartella di partenza, ottengo la
01/02/2001 14.17 41 AREDB-~2.TXT aredb-5standard.txt
25/09/2003 10.10 90 CL42B6~1.TXT
clie-stdperbanca.txt
Post by Federico
dove è palese che entrambi nel nome corto hanno la b, purtroppo.
Ragazzi, se vi viene in mente qualcosa, anche il suggerimento più vago, è il
benvenuto, perché l'alternativa per me è copiare a mano ***una valle*** di
file in una quarantina di cartelle diverse.
ho appena provato velocemente e la shfileoperation non mi sembra usi i nomi
8+3

almeno da disco a disco nello stesso pc, quindi usando una lettera per
identificare il drive (d:\pippo > f:\test)

quell'api è piena di parametri
sei certo delle impostazioni?

qui c'è il codice di ciò che ho provato:
http://www.gbcdepot.com/free/vb_esempi/samples_files_SHFileOperation.zip

hola

-> GbC|
www.gbcweb.com
Federico
2005-05-02 16:11:05 UTC
Permalink
Ciao e grazie per la risposta,
ho scaricato e provato l'esempio, ma il problema rimane.
In particolare il sorgente di esempio (che è molto completo e documentato
:-) ) copia o un solo file per volta o una cartella intera.
Con questo uso non ci sarebbe nessun problema ed il supporto per i file
lunghi c'è.
Ma se provi a specificare una mask per selezionare i file, ti accorgi che
zoppica.
Tra l'altro imposto i parametri in modo molto simile a quello
dell'operazione di copia dell'esempio:

---snip---
FileOp.hWnd = 0
FileOp.wFunc = FO_COPY
FileOp.pFrom = "F:\Rpt\????b*.*" & Chr$(0)
FileOp.pTo = "\\storage\Temp8GB\Aggiornamenti\taco\rpt\" & Chr$(0)
FileOp.fFlags = FOF_ALLOWUNDO Or FOF_NOCONFIRMATION Or FOF_NOCONFIRMMKDIR
lRetVal = SHFileOperation(FileOp)
If lRetVal <> 0 Then
MsgBox Err.LastDllError, vbCritical
Else
If FileOp.fAnyOperationsAborted Then
MsgBox "Operazione di copia interrotta.", vbExclamation
End If
End If
---snap---

ed entrambi i pc coinvolti sono dei Win2000 in ntfs.
Post by GbC|
ho appena provato velocemente e la shfileoperation non mi sembra usi i nomi
8+3
almeno da disco a disco nello stesso pc, quindi usando una lettera per
identificare il drive (d:\pippo > f:\test)
quell'api è piena di parametri
sei certo delle impostazioni?
http://www.gbcdepot.com/free/vb_esempi/samples_files_SHFileOperation.zip
hola
-> GbC|
www.gbcweb.com
GbC|
2005-05-03 06:43:12 UTC
Permalink
"Federico" scrive...
Post by Federico
Ciao e grazie per la risposta,
ho scaricato e provato l'esempio, ma il problema rimane.
In particolare il sorgente di esempio (che è molto completo e documentato
:-) ) copia o un solo file per volta o una cartella intera.
Con questo uso non ci sarebbe nessun problema ed il supporto per i file
lunghi c'è.
Ma se provi a specificare una mask per selezionare i file, ti accorgi che
zoppica.
[snip]

Effettivamente non avevo provato impostando una mask ma solo indicando nomi
di cartelle

Magari ti conviene copiare tutto e poi eliminare quello che non vuoi
localmente :)

Buona giornata


-> GbC|
www.gbcweb.com
Andrea Palazzi
2005-05-03 07:41:33 UTC
Permalink
Post by Federico
Ciao *.*,
sto cercando di eseguire una copia di alcuni file da una cartella che ne
contiene quasi mille.
Il criterio di selezione che ho bisogno di applicare è che tutti i file che
hanno la quinta lettera del nome uguale ad es. a "b" sono da copiare da
un'altra parte.
Con SHFileOperation ho impostato .pFrom = "\\server\cartella\????b*.*" &
Chr$(0) ma ho il problema che questa chiamata mi preleva i file basandosi sul
nome corto dei file, quello in formato 8.3.
aredb-5standard.txt (OK) e clie-stdperbanca.txt (???).
Facendo da dos: dir ????b*.* /x nella cartella di partenza, ottengo la
01/02/2001 14.17 41 AREDB-~2.TXT aredb-5standard.txt
25/09/2003 10.10 90 CL42B6~1.TXT
clie-stdperbanca.txt
Post by Federico
dove è palese che entrambi nel nome corto hanno la b, purtroppo.
Ragazzi, se vi viene in mente qualcosa, anche il suggerimento più vago, è il
benvenuto, perché l'alternativa per me è copiare a mano ***una valle*** di
file in una quarantina di cartelle diverse.
Ciao e grazie in anticipo,
Federico
l'unica mi sembra un dir$(), che ti restituisce i nomi lunghi.

riprovato ora, in un prog carico un listview coi file usando dir$() e mi dà
\\pc\cartellacondivisa\LoadLogTextFormat.txt

debug:
? mid$("LoadLogTextFormat.txt",10,1) ---> "x"

quindi fai un if su quella matrice e copi solo quelli che ti servono, tipo

s=dir(fromPath, *.*)
while s<>""
if lcase(mid$(s,5,1))="b" then .pfrom=fromPath & s

ciao, a.
Federico
2005-05-03 09:31:17 UTC
Permalink
Ciao Andrea,
mi sa che farò proprio così, grazie per il tuo consiglio.
Questo comportamento strano di una API che nel 2005 zoppica ancora coi file
corti mi lascia un pochino basito...
Chissà quale potrebbe essere la chiamata API che fa Windows quando selezioni
più di un file col CTRL premuto e poi clicchi sul bottone "Copia in".
Forse che i guru Microsoft giocano anche loro coi cicli for? :-P
Federico
Post by Federico
Post by Federico
Ciao *.*,
sto cercando di eseguire una copia di alcuni file da una cartella che ne
contiene quasi mille.
Il criterio di selezione che ho bisogno di applicare è che tutti i file
che
Post by Federico
hanno la quinta lettera del nome uguale ad es. a "b" sono da copiare da
un'altra parte.
Con SHFileOperation ho impostato .pFrom = "\\server\cartella\????b*.*" &
Chr$(0) ma ho il problema che questa chiamata mi preleva i file basandosi
sul
Post by Federico
nome corto dei file, quello in formato 8.3.
Per farvi capire l'inghippo, mi copia nella cartella di destinazione i
aredb-5standard.txt (OK) e clie-stdperbanca.txt (???).
Facendo da dos: dir ????b*.* /x nella cartella di partenza, ottengo la
01/02/2001 14.17 41 AREDB-~2.TXT aredb-5standard.txt
25/09/2003 10.10 90 CL42B6~1.TXT
clie-stdperbanca.txt
Post by Federico
dove è palese che entrambi nel nome corto hanno la b, purtroppo.
Ragazzi, se vi viene in mente qualcosa, anche il suggerimento più vago, è
il
Post by Federico
benvenuto, perché l'alternativa per me è copiare a mano ***una valle*** di
file in una quarantina di cartelle diverse.
Ciao e grazie in anticipo,
Federico
l'unica mi sembra un dir$(), che ti restituisce i nomi lunghi.
riprovato ora, in un prog carico un listview coi file usando dir$() e mi dà
\\pc\cartellacondivisa\LoadLogTextFormat.txt
? mid$("LoadLogTextFormat.txt",10,1) ---> "x"
quindi fai un if su quella matrice e copi solo quelli che ti servono, tipo
s=dir(fromPath, *.*)
while s<>""
if lcase(mid$(s,5,1))="b" then .pfrom=fromPath & s
ciao, a.
Andrea Palazzi
2005-05-03 09:48:36 UTC
Permalink
usare i nomi corti puo' avere senso, hai un pattern limitato e puo' essere
comodo.

sono "documents and settings" e "program files" che non ce l'hanno :)

a prop dei cicli for e di selezione in explorer,
se selezioni 10 file e copi,
hai badato che la copia è
n2, n3..., n10, n1
eè una stupidaggine, ma potrebbe creare qualche casinetto.

ciao, a.
Post by Federico
Ciao Andrea,
mi sa che farò proprio così, grazie per il tuo consiglio.
Questo comportamento strano di una API che nel 2005 zoppica ancora coi file
corti mi lascia un pochino basito...
Chissà quale potrebbe essere la chiamata API che fa Windows quando selezioni
più di un file col CTRL premuto e poi clicchi sul bottone "Copia in".
Forse che i guru Microsoft giocano anche loro coi cicli for? :-P
Federico
Post by Federico
Post by Federico
Ciao *.*,
sto cercando di eseguire una copia di alcuni file da una cartella che ne
contiene quasi mille.
Il criterio di selezione che ho bisogno di applicare è che tutti i file
che
Post by Federico
hanno la quinta lettera del nome uguale ad es. a "b" sono da copiare da
un'altra parte.
Con SHFileOperation ho impostato .pFrom = "\\server\cartella\????b*.*" &
Chr$(0) ma ho il problema che questa chiamata mi preleva i file basandosi
sul
Post by Federico
nome corto dei file, quello in formato 8.3.
Per farvi capire l'inghippo, mi copia nella cartella di destinazione i
aredb-5standard.txt (OK) e clie-stdperbanca.txt (???).
Facendo da dos: dir ????b*.* /x nella cartella di partenza, ottengo la
01/02/2001 14.17 41 AREDB-~2.TXT
aredb-5standard.txt
Post by Federico
Post by Federico
Post by Federico
25/09/2003 10.10 90 CL42B6~1.TXT
clie-stdperbanca.txt
Post by Federico
dove è palese che entrambi nel nome corto hanno la b, purtroppo.
Ragazzi, se vi viene in mente qualcosa, anche il suggerimento più vago, è
il
Post by Federico
benvenuto, perché l'alternativa per me è copiare a mano ***una valle*** di
file in una quarantina di cartelle diverse.
Ciao e grazie in anticipo,
Federico
l'unica mi sembra un dir$(), che ti restituisce i nomi lunghi.
riprovato ora, in un prog carico un listview coi file usando dir$() e mi dà
\\pc\cartellacondivisa\LoadLogTextFormat.txt
? mid$("LoadLogTextFormat.txt",10,1) ---> "x"
quindi fai un if su quella matrice e copi solo quelli che ti servono, tipo
s=dir(fromPath, *.*)
while s<>""
if lcase(mid$(s,5,1))="b" then .pfrom=fromPath & s
ciao, a.
AlessandroD
2005-05-03 09:25:23 UTC
Permalink
"Federico" <***@discussions.microsoft.com> ha scritto nel messaggio news:3E79BA0D-D49E-4D52-B50F-***@microsoft.com...
Prova anche a dare un occhio qui:
http://www.microsoft.com/resources/documentation/Windows/2000/server/reskit/en-us/Default.asp?url=/resources/documentation/Windows/2000/server/reskit/en-us/regentry/28231.asp
e

qui:
http://weblogs.asp.net/savanness/archive/2003/06/09/8445.aspx

Ma mi pare di capire che i file li devi ricreare oppure come suggerito nel
secondo link rinominarli 2 volte.
Ciao, Alessandro
Continua a leggere su narkive:
Loading...