Newsgroup: it.comp.lang.visual-basic
Titolo: [vb6] nomi di file invalidi

Salve. Per Windows i nomi di file devono essere lunghi al massimo 255
bytes e non possono contenere i caratteri \/?:*"><|
In vb6, secondo le mie esperienze, le cose cambiano: il massimo e* 228
in qualche occasione e 218 in altre occasioni e, ai caratteri invalidi
per Windows, si deve aggiungere il !.
Risulta anche a voi?
Il problema mi si e* presentato quando ho tentato di correggere una
serie di nomi di file di tipo .eml invalidi per Windows prodotti da
Mozilla Thunderbird. Data la quantita* volevo realizzare un
programmino, ma non ci sono riuscito perche* qualunque operazione su
tali file produceva un errore 53 (file not found).
Avete qualche idea? Grazie.
Lazzaro
 
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
http://www.avast.com
 
 

 Avete qualche idea? Grazie.
 
Capitai su questo problema un po' di anni fa; persi
un po' di tempo a cercare di risolvere con VB, poi
ricordo che tagliai corto usando le API.
 
Bye, G.

 ricordo che tagliai corto usando le API.
 
A proposito... ce le metti già le virgolette
ai nomi di file, sì?
 
Bye, G.

 Avete qualche idea? Grazie.
 
Il problema penso che sia questo:
Non è tanto il nome del file, ma l'intero percorso a non dover essere 
più lungo di 255 caratteri.
 
Per cui le cose cambiano molto se invece di essere in C:\Temp\ il file 
si trova d esempio in C:\Documents and Settings\Daniele\Documenti\Temp\
 
:-)
 
Credo che sia *anche* per questo che Microsoft da Vista in poi ha 
cambiato "Documents and Settings" in "Users"
 
 
-- 
Daniele Pinna
DAPINNA.COM
 
(leva oops per rispondere)
-----
Utente Skype: dapinna
DAPINNA.COM
        :  
http://www.dapinna.com
 
Il Docfa in Pillole:  
http://www.ildocfainpillole.it
 - Sito Aggiornato!!!
DAPINNA.COM
 su Facebook: 
https://www.facebook.com/dapinnadotcom
 
BLOG: 
http://storielaboratorioinformatica.wordpress.com
 

...
Questo mi sembra molto interessante. Vado subito a controllare.
Invece - scusa se lo dico qui, ma credo che chi legge un thread legga
tutto (e* una bacheca) - non ho capito la domanda di Paperino sulle
virgolette. Paperino, puoi chiarire, per favore? Grazie.
Lazzaro
 
---
Questa e-mail e stata controllata per individuare virus con Avast antivirus.
http://www.avast.com
 
 


Il mio controllo ha dato esito negativo, anche se oggi il nome di file
era lungo 230 caratteri (probabilmente avevo sbagliato ieri). Variando
la lunghezza dei nomi del percorso il risultato non cambiava: il nome
da 230 passava per un FileCopy indenne da errore 53, mentre un nome da
231 prendeva l'errore. Ecco il nome da 230 caratteri che ho usato per
il test:
"Soggetto_qualunque_lungo_lungo_lungo_lungo_lungo_lungo_lungo_lungo_lungo_lungo_lungo_lungo_lungo_(
biancaba...@gmeil.com
)_-_2013-02-27_1851________________________________________________________________________.eml"
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
http://www.avast.com
 
 

 "Soggetto_qualunque_lungo_lungo_lungo_lungo_lungo_lungo_lungo_lungo_lungo_lungo_lungo_lungo_lungo_(
biancaba...@gmeil.com
)_-_2013-02-27_1851________________________________________________________________________.eml"
 
OK, ma in quale percorso lo stavi salvando?
 
 
 
 
 
-- 
Daniele Pinna  (leva oops. per rispondere)
Utente Skype: dapinna
Sito Web: 
http://www.dapinna.com
 
Il Docfa in Pillole:  
http://www.ildocfainpillole.it
 
DAPINNA.COM
 su Facebook: 
https://www.facebook.com/dapinnadotcom
 
Blog - Storie di un Laboratorio di Informatica:
http://storielaboratorioinformatica.wordpress.com
 
-----
*** Powered by Linux KUbuntu 14.04 LTS "Trusty Tahr" ***

...
Ragazzi, mi vergogno! Ho fatto altri test e ho scoperto che la mia
premessa era sbagliata :-(. La lunghezza massima dei nomi per windows
non e* 255, ma, come dice Daniele, dipende anche dal percorso.
Il mio test manuale l'ho fatto modificando la lunghezza di un nome di
file che stava nel percorso "E:\email\email_2013\".
In queste condizioni, con windows 7, ho potuto estendere il nome fino
a 250 caratteri, ma ogni tentativo di trasferimento in "E:\email\" e*
fallito fino al limite di 230: il trasferimento del file con nome
lungo 230 caratteri e* stato accettato da windows 7; windows xp ha
accettato anche 231.
Il trasferimento in E:\ , con windows 7, del file con nome lungo 250
e* stato accettato! Ma il tentativo di allungarlo ancora non ha avuto
successo.
Nei test fatti con vb6 mi e* sembrato che il percorso non fosse
influente, ma devo ripetere il test. Vi faro* sapere. 
 
Grazie per l'assistenza.
Lazzaro.


 Lazzaro.
 
Scusa l'OT e per la domanda :-)
Come mai al posto dell'Appostrofo usi l'asterisco?
 
 
-- 
Daniele Pinna
DAPINNA.COM
 
(leva oops per rispondere)
-----
Utente Skype: dapinna
DAPINNA.COM
        :  
http://www.dapinna.com
 
Il Docfa in Pillole:  
http://www.ildocfainpillole.it
 - Sito Aggiornato!!!
DAPINNA.COM
 su Facebook: 
https://www.facebook.com/dapinnadotcom
 
BLOG: 
http://storielaboratorioinformatica.wordpress.com
 


Ah :-) Non ci crederai, ma una volta qualcuno mi ha fatto la stessa
domanda... al contrario. Da allora uso l'asterisco. Sono troppo
remissivo :-(. Mo' basta, pero*.
Intanto ho ripetuto i test con vb6 e windows xp. La conclusione e* che
vb6 e*  coerente con le regole (pazzesche) di Windows e tiene conto
del percorso. Ma non sono sicuro della regolarita*. Per es. ho messo
in e:\ un file con nome da 255 (quindi diciamo che la lunghezza della
route non conta!) che poi ho trasferito a programma in
e:\email\email_2013\, naturalmente senza successo, finché non l'ho
accorciato a 239.  Ma il percorso di arrivo senza la route (e:\) e* di
17 caratteri e 239 + 17 fa 256, non 255.
Bah, il caso e* chiuso.
Rimane il fatto che non posso trattare come meritano questi nomi
invalidi che piacciono tanto a Thunderbird, il quale non ha nessuna
difficolta* a metterli dove l'utente vuole, fregandosene dei limiti di
Windows.
Paperino dice di ricordarsi che uso* le API. Questo vorrebbe dire che
le API di windows non seguono le regole di windows. D'altra parte
Thunderbord in qualche modo riesce a farli questi nomi invalidi.
Devo riuscirici anch'io. Ciao
Lazzaro
 
---
Questa e-mail e stata controllata per individuare virus con Avast antivirus.
http://www.avast.com
 
 

 Devo riuscirici anch'io. Ciao
 
 
 


...
Ti ringrazio delle informazioni. Ho dato un'occhiata anch'io, poi mi
sono messo a cercare le API e a provare CopyFile e DeleteFile, ma non
ho risolto.
Ora credo che dovro* imparare un linguaggio che si possa usare con
Linux-Ubuntu. Sto vedendo Gambas, che sembra il piu* simile a VB. Ho
trovato un solo newsgroup su questo linguaggio, vuoto. Dovrň
accontentarmi delle notizie ed esempi che trovo sul Web.


 Lazzaro
 
Mi fanno impazzire quelli che, come te ma nulla di personale, non sanno 
come si dice una parola, ma piuttosto di impegnarsi per riuscirci 
cambiano lingua!
Per una sola parola!
Non lo capitò mai. E' un mio limite :(
 
-- 
Greg
 
 


Caro Greg,
questa volta davvero non ho capito niente di quello che dici. Quale e*
la parola che mi avrebbe indotto a cambiare linguaggio?
Forse sono io che non mi sono spiegato bene: io non voglio cambiare
linguaggio, voglio cambiare sistema operativo, perche* windows (xp o
7) e di conseguenza vb6, fino a prova contraria, non mi mermette di
realizzare quello che voglio. E voglio veramente una cosa semplice: un
modo per correggere i nomi dei file .eml che altrimenti non posso
utilizzare.


 Lazzaro
 
Nessun problema. E' che mi sembra esagerato cambiare linguaggio, o 
addidrittura sistema operativo perchè si incotra un intoppo.
Ca sosa bella fi questo ng è che di fornte ad un problema che appare 
insormontabile, si trovano delle soluzioni alternative segne di 
ammirazione, oppure si fanno dei compromessi accettabili....
 
Leggere/scrivere nomi di file stralunghi, ti aveva gia detto Paperino 
che è posisbile, tu stesso hai detto che se lo fa thunderbird puoi 
farlo anche tu e che quindi non ci sono problemi lato sistema 
operativo...e allora mi chiedo: perchè cambiare sistema operativo?
 
Tornando al tuo problmea, se è proprio impossibile gestire questi nomi 
extra, hai considerato la possiblità di salvarli sul disco con un nome 
corto e su un database il relativo nome extralungo?
 
-- 
Greg
 
 

Greg
Bene. Il mio problema dei nomi lunghi si e* rivelato inconsistente:
alla fine Daniele Pinna mi ha fatto capire che insieme alla lunghezza
del solo nome di file si deve tener conto della lunghezza delle varie
cartelle che compongono il percorso. E poi ho visto che tra i miei
file .eml nessuno e* piu* lungo di 220 bytes. La lunghezza, in ogni
caso si puo* accorciare a programma. Rimangono i caratteri invalidi
che provocano l'errore 53 sia in lettura che in scrittura, non per
colpa di vb6 ma per "colpa" di Windows. In Linux, dei 9 caratteri
invalidi per Windows, e* invalida solo la barra normale. Questo e*
quello che io credo di sapere, e se le cose stanno veramente cosi*, ne
posso uscire solo lavorando in Linux.
Che ne dici?


Che ne dici?
 
Che è meglio cercare di capire il problema, cambiare SO non è detto che sia la
soluzione giusta.
 
Meglio approfondire
 
 
-- 
ciao
  Stefano

...

Ok. I caratteri invalidi sono tutti presenti sulla tastiera:
"\" = ascii 92
"/" = 47
"*" = 42
"?" = 63
"<" = 60
">" = 62
"|" = 124
":" = 58
'"' = 34
Questa e* la routine attuale con cui io cerco di correggere i nomi con
caratteri invalidi:
 
Private Sub Command1_Click()
'...
'Correzione nomi di file nella cartella gestita col controllo 'File1'
'p$ = directory dell'applicazione
'pat$ = directory della cartella
'msgboxm() e* una msgbox adattata da me
'
Dim x%,ix%,ne%
Open p$ & "logerr.txt" For Output As #1  'file per elencare gli errori
Close 1
Open p$ & "logerr.txt" For Output As #1
ne%=0  'numero di errori
For x% = 0 To File1.ListCount - 1
   nomei$ = File1.List(x%)
   nome2$ = nomei$
   'cerca i caratteri invalidi nel nome del file
   For ix% = 1 To Len(nome2$)
      If Mid(nome2$, ix%, 1) = "\" Or Mid(nome2$, ix%, 1) = "/" _
       Or Mid(nome2$, ix%, 1) = "*" Or Mid(nome2$, ix%, 1) = "?" Or
Mid(nome2$, ix%, 1) = """" _
       Or Mid(nome2$, ix%, 1) = "<" Or Mid(nome2$, ix%, 1) = ">" Or
Mid(nome2$, ix%, 1) = "|" Then
         Mid(nome2$, ix%, 1) = "_"
      End If
   Next ix%
   On Error GoTo errfi
   Name pat$ & nomei$ As pat$ & nome2$
tornaerr:
Next x%
Close 1
On Error GoTo 0
Exit Sub
errfi:
if ne% = 0 then
   Call msgboxm("Errore " & Format(Err, "#0") & " " & Err.Description
& " " & pat$ & nomei$ _
    & ". Tutti gli errori saranno elencati nel file '" & p$ &
"logerr.txt'.", 0)
End If
ne% = ne% + 1
Print #1, Format(x%, "#0") & ". Errore " & Format(Err, "#0") & " " &
Err.Description & " " & pat$ & nomei$
Resume tornaerr
End Sub


'"' = 34
 
E' coerente con le regole di windows
 
http://docs.attachmate.com/reflection/2014/r1/tshelp/it/user-html/6503.htm
 
 
leggi anche le note sulla lunghezza massima
 
poi considera che ci sono molti caratteri proibiti in Windows, Linux e Mac os 
 
http://www.mtu.edu/umc/services/web/cms/characters-avoid/
 
 
http://en.wikipedia.org/wiki/Filename
 
paragrafo  "Reserved characters and words"
 
E devi anche considerare che "\" in Windows e "/" in Linux servono per il path.

Funziona, ma per velocizzare la routine di confronto farei una Mid sola e userei
valori numerici costanti per il confronto invece che stringhe, credo che così
sia parecchie volte + rapida
 
 
Const BckS = 92, FwdS = 47, Star = 42, QuM = 63, Lft = 60, Rgt = 62, Pip = 124,
Col = 58, Dqu = 34
 
   For ix% = 1 To Len(nome2$):     Cm% = Asc(Mid$(nome2$, ix%, 1))
     If Cm% = BckS Or Cm% = FwdS Or Cm% = Star _
      Or Cm% = QuM Or Cm% = Lft Or Cm% = Rgt _
      Or Cm% = Pip Or Cm% = Col Or Cm% = Dqu Then
         Mid(nome2$, ix%, 1) = "_"
      End If
   Next ix%
 
 
-- 
ciao
  Stefano

  Stefano
Grazie del consiglio. Lo provero*.
Intanto, penso - e credo che lo pensi anche tu - che per la correzione
non ci sia una soluzione con vb6.
Ora do' una notizia ai lettori di questo thread, pur supponendo che
non sia molto interessante: attualmente l'ultima versione di
Thunderbird non genera piu* gli errori. Fa esattamente quello che
avrei voluto fare io: sostituisce i caratteri invalidi con "_". E lo
fa in Windows, non so come. Il problema per me non persisterebbe se
non avessi un migliaio di file .eml, non tutti scorretti,
collezionati dal 2011 al 2014. Piano piano, con Ubuntu, li sto
correggendo a mano.
Ciao
Lazzaro



Benissimo. Ho provato a seguire il tuo metodo di confrontare il codice
ascii invece del carattere e ho risparmiato 1 secondo per
l'elaborazione di 4267 file, cioe* ho avuto (su 6 prove consecutive)
una durata di 3 secondi contro 4. Il mio computer risale al 2005 con
una velocita* di 2,8 ghz, e il vantaggio mi sembra notevole, utile per
elaborazioni piu* sostanziose. Grazie.
Ciao
Lazzaro.
