Newsgroup: it.comp.lang.visual-basic
Titolo: Open For Input e spazi nel path

Ciao. Credevo di aver già inviato questo messaggio, ma evidentemente non è
partito.
Se poi arriva doppio, ignorate pure il primo.
Dunque, uso il codice seguente
    f = FreeFile
    Open (FilePath) For Input Access Read Lock Read As #f
Questo codice funziona a modo, ma se sposto il file da aprire sul desktop il
suo path diventa "C:\Documents and settings\...", cioè contiene degli spazi,
e l'istruzione Open For Input mi restituisce un errore 52, cioè Nome file
non valido.
Esiste un trucco per aggirare questo problema?
Grazie per le risposte che arriveranno.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Grazie per le risposte che arriveranno.
trucchi non saprei. esistono le virgolette.
ciao, a. 


Ciao Andrea, grazie per la risposta, ma non sono riuscito anche tentando con
le virgolette, o meglio con il sistema seguente:
   Open Chr(39) & FilePath & Chr(39) For Input Access Read Lock Read As #f
E' sbagliato? Se si, come bisogna fare?
Grazie ancora per la disponibiltà



Niente, non va né con Chr(39) né con Chr(34), e nemmeno con le API
PathQuoteSpaces o GetShortPathNames.
Non so davvero più che pesci pigliare, e mi sa che se non mi aiutate voi non
ne vengo fuori...
Grazie ancora in advance



Strano...
AFAIK nella Open non servono virgolette né apici, non è come per Shell.
Controlla bene che FilePath corrisponda ad un file esistente, perché ad questo
codice esempio non mi dà alcun tipo di problema:
    FilePath = Environ("HOME") & "\Desktop\miofile.txt"
    f = FreeFile
    Open (FilePath) For Input Access Read Lock Read As #f
Controlla pure il valore di f al momento della open, non si sa mai... (visto che
errore 52 dice bad file name or *number*)
-- 
Bye
Raf
-----------------------------------------------------
Funk: cooler than the other side of the pillow.


Ciao Raf, si l'errore è quello ma il numero lo assegno con FreeFile.
Ti posto il codice:
Public Sub Main()
    Dim cnt As Long
    Dim filetext As String, txt As String
    Dim msg As String
    Dim f As Long
    Dim FilePath As String
    VB_Ide = OnIDE
    ' carica il testo del file in una variabile
    If VB_Ide Then
        FilePath = App.Path & "\Prova CharsCounter.txt"
    Else
        FilePath = Command$
    End If
    MsgBox FilePath
    If FilePath = vbNullString Then End
    f = FreeFile
    Open FilePath For Input Access Read Lock Read As #f
    Do While Not EOF(f)
        ' legge i caratteri uno per uno dal file
        filetext = Input(1, #f)
        ' aggiunge il carattere letto alla stringa di confronto
        ' siccome il ritorno a capo vbCrLf è in realtà composto da due caratteri
        ' omette di aggiungerne uno dei due alla stringa di confronto
        If Not filetext = vbLf Then txt = txt & filetext ' vbCr = Chr(13), vbLf =
Chr(10)
    Loop
    Close #f
    msg = "Caratteri nel file: " & Len(txt)
    MsgBox msg, vbInformation + vbOKOnly, "CharsCounter: " & FilePath
    End
End Sub
Public Function OnIDE() As Boolean
On Error Resume Next
    Debug.Print 1 / 0
    OnIDE = (Not Err.Number = 0)
End Function
Questo è un semplice programmino per contare i caratteri in un file di
testo. Trascino il file sull'eseguibile e lui restituisce una msgbox. La
riga App.Path... c'è per fare i test dentro l'IDE.
Funziona tutto, ma se copio il file di testo e l'eseguibile sul desktop mi
tira il chiodo. E vorrei evitare anche ENVIRON, perché vorrei riuscirci da
qualunque directory, con spazi o senza.
Cosa c'è di sbagliato?


 End Function
grazie 

 l'istruzione Open For Input mi restituisce un errore 52
Prima di perderti da altre parti, prova a vedere, al run time, che cosa
c'è dentro a FilePath
-- 
Salutoni
Sergio
C'è il giorno in cui nasci e quello in cui scegli di vivere
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it


Credo che dovresti prima provare se il file esiste, ad esempio con
GetFileAttributes, che ti evita errori di runtime:
Declare Function GetFileAttributes Lib "kernel32.dll" Alias "GetFileAttributesA"
(ByVal lpFileName As String) As Long
If GetFileAttributes(MyFile) > 0 then
........
End If
--
ciao
  Stefano

 grazie
Questa serve per verificare se sto facendo girare l'eseguibile o sto facendo
girare il progetto dentro Visual Basic. L'ho trovata tempo fa su questo NG,
mi sembra.


 Sergio
Grazie Sergio, ma se leggi il codice che ho postato nell'altro thread,
vedrai che lo faccio già con una msgbox, prima di tentare l'apertura del
file.


 testo. Trascino il file sull'eseguibile e lui restituisce una msgbox.
Capito: è che Windows quando la cartella origine di un'operazione drag & drop
contiene spazi, aggiunge lui le virgolette.
E queste danno noia a Open.
In pratica le virgolette non le devi mettere, LE DEVI LEVARE!
     If VB_Ide Then
         FilePath = App.Path & "\Prova CharsCounter.txt"
     Else
         FilePath = Replace(Command$, Chr(34), "")
     End If


 End If
Ma pensa. Ora devo andare via, ma stasera provo subito appena torno e vi so
dire. Grazie Raf.


confermo:
l'evento drag & drop di win mette le virgolette
ma con il doppio click sul file che si vuole aprire (impostando le 
estenzione dal regedit)
le virgolette non compaiono!
Bella Raf
ciao 

mi sembra.
Non mi piacciono le routines che usano ON ERROR 
Per sapere se il programma è usato da IDE uso questa:
Private Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineA"
() As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString
As Long) As Long
Private Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" (pDst As
Any, pSrc As Any, ByVal ByteLen As Long)
Private Function GetCommLine() As String
    Dim RetStr As Long, SLen As Long
    'Get a pointer to a string, which contains the command line
    RetStr = GetCommandLine
    'Get the length of that string
    SLen = lstrlen(RetStr)
    If SLen > 0 Then
        'Create a buffer
        GetCommLine = Space$(SLen)
        'Copy to the buffer
        CopyMemory ByVal GetCommLine, ByVal RetStr, SLen
    End If
End Function
  If InStr(LCase(GetCommLine), "vb6.exe") = 0 Then
  ...'NOT IN IDE


  End If
Ammazza che complicazione! ;-)
Questa č molto piů "light", API-free e non usa On Error (cosě da non resettare
Err)
Public Function InDesign() As Boolean
Static CallCount    As Integer
Static Res          As Boolean
    CallCount = CallCount + 1
    Select Case CallCount
    Case 1
        Debug.Assert InDesign()
    Case 2
        Res = True
    End Select
    InDesign = Res
    CallCount = 0
End Function
(Ad un'occhiata superficiale potrebbe sembrare completamente priva di senso, ma
garantisco che ce l'ha eccome)


garantisco che ce l'ha eccome)
Forse sono superficiale io ma non ci arrivo  8=))
--
ciao
  Stefano

Forse sono superficiale io ma non ci arrivo  8=))
Ho capito, dipende dal fatto che Debug.Assert non viene compliata, e quindi è
solo nell'IDE.
Molto furbo,
--
ciao
  Stefano

 Grazie ancora per la disponibiltà
scusa del ritardo, arrivo solo adesso ai ng
Private Sub Command1_Click()
    Dim fName As String
    fName = "C:\Documents and Settings\<user>\Desktop\Nuovo Documento di 
testo.txt"
    Dim fNum As Long: fNum = FreeFile
    Open fName For Input As #fNum
    Text1 = Input(LOF(fNum), fNum)
    Close #fNum
End Sub
text1 ->
contenuto di Nuovo Documento di testo.txt
contenuto di Nuovo Documento di testo.txt
contenuto di Nuovo Documento di testo.txt
contenuto di Nuovo Documento di testo.txt
contenuto di Nuovo Documento di testo.txt
ciao, a.

 Molto furbo,
Molto.
Oh beh, non io... in realtà quel codice l'ho preso dal libro "Advanced Visual
Basic 6.0"!


 dire. Grazie Raf.
Fantastico Raf, funziona alla grandissima. Scusa il ritardo ma sono tornato
solo ora. Grazie tantissimo per la dritta e grazie a tutti per
l'interessamento.


 >>

Beh, anche questa sembra piuttosto complicata, anche se non usa le API.
Comunque la Debug.Print 1/0 č presente anche sui Trucchi di Balena. Anche io
la uso, č semplice e funziona, e non mi sono mai posto il problema
dell'azzeramento dell'oggetto Err, che comunque si puň evitare la piccola
variazione che segue:
Public Function OnIDE() As Boolean
On Error GoTo ErrFunc
Debug.Print 1 / 0
Exit Function
ErrFunc:
If Err.Number = 11 Then OnIDE = True
End Function
... sebbene, dopo aver generato artificialmente un errore, io preferisca che
l'oggetto Err venga svuotato, altrimenti se continuando l'esecuzione il
codice passa da un'alra istruzione On Error avviene un salto ingiustificato.
Anche questa č basata sul fatto che le istruzioni Debug non vengono eseguite
quando gira l'eseguibile.
E' solo un'osservazione, che nulla toglie alla funzione citata da Rafunk.
