Newsgroup: it.comp.lang.visual-basic
Titolo: CurrentDb

Ambiente VBA di Access
 
L'istruzione 
FileName = CurrentDb.Name
 
mi restituisce il nome completo del Database che sto usando in quel
momento.
Come mai su alcuni PC (non riesco piu` a riprodurlo ma ho avuto
l'impressione che avvenisse anche sullo stesso PC in modo apparentemente
casuale) il percorso mi viene restituito in formato 8.3 (anche se poi il
nomefile e` in formato lungo) e su altri in formato nomi lunghi?
C'e` modo di farsi restituire in modo certo o l'uno o l'altro o di fare una
conversione dall'uno all'altro?
L'esigenza nasce dal fatto di volere verificare che il nome file che mi
viene restituito con l'API
GetOpenFileName Lib "comdlg32.dll"
sia nella stessa directory in cui e` presente il .mdb che sto usando.
Magari esiste un sistema piu` efficente per far cio` che non sia un
confronto tra le variabili restituite dalle due chiamate (decurtate
ovviamente del filename)?
 
Il percorso potrebbe essere anche un percorso di rete tipo
\\server\databases\....
Chi mi da` due dritte?
Grazie,
--
Ciao,
      Peppo
 
ICQ    : UIN 5709387
Fidonet: 2:331/301.45

nomefile e` in formato lungo) e su altri in formato nomi lunghi?
a volte windows NT si comporta cosi'.  non hocapito bene perche',
anche se una volta provarono a spiegarmelo sulo ng di nt.
va smanettato qualcosa sui registry, ma non ti so dire bene.
prova a fare una ricerca con dejanews dei messaggi su it.comp.win-nt
di cui sono il mittente, e seguine i thread, ce ne saranno 4 o 5 al
max.
---------
vuoi partecipare alla II cena di it.comp.database.access?
vai qui: 
http://ntpub01.blunet.it:700/lbo/cenaicda.asp
---------
togli .NOSPAM per rispondermi via email.

max.
provero` anche questa strada che se basta modificare qualcosa nel registry
e` meglio. Mi lascia perplesso l'apparente casualita`...


      Peppo
ciao Peppo,
beccati questo codice che fa giusto al caso tuo !!!
(PS.: non e' mio l'ho preso dal sito di Dev Hashis)
Private Const MAX_PATH& = 260
Private Const INVALID_HANDLE_VALUE = -1
Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type
Type WIN32_FIND_DATA  '  318  Bytes
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReservedŻ As Long
    dwReserved1 As Long
    cFileName As String * MAX_PATH
    cAlternate As String * 14
End Type
Private Declare Function apiFindFirstFile Lib "kernel32" Alias
"FindFirstFileA" _
    (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function apiFindClose Lib "kernel32" Alias "FindClose" _
    (ByVal hFindFile As Long) As Long
Private Declare Function apiGetShortPathName Lib "kernel32" Alias
"GetShortPathNameA" _
    (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal
cchBuffer As Long) As Long
Function fGetShortName(ByVal stLongPath As String) As String
'[ opposite of fGetLongName() ]
'Usage Examples:
'?fGetShortName("D:\Internet Explorer 4.0 Setup\This folder is safe to
delete.txt")
'D:\INTERN~1.0SE\THISFO~1.TXT''?fGetShortName(currentdb.Name)
'C:\PROGRA~1\MICROS~2\Office\Samples\SOLUTI~1.MDB'
    Dim stShortPath As String
    Dim lngBuffer As Long, lngRet As Long
    stShortPath = String$(MAX_PATH, 0)
    lngBuffer = Len(stShortPath)
    lngRet = apiGetShortPathName(stLongPath, stShortPath, lngBuffer)
    fGetShortName = Left(stShortPath, lngRet)
End Function
Function fGetLongName(ByVal strFilename As String) As String
''Usage Examples:
'?fGetLongName("D:\INTERN~1.0SE\THISFO~1.TXT")
'D:\Internet Explorer 4.0 Setup\This folder is safe to delete.txt'
'?fGetLongName(currentdb.Name)
'C:\Program Files\Microsoft Office\Office\Samples\Solutions.mdb'
'?fGetLongName("C:\PROGRA~1\MICROS~2\Office\Samples\Northwind.mdb")
'C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb'
    Dim lpFindFileData As WIN32_FIND_DATA
    Dim strPath As String, lngRet As Long
    Dim strFile As String, lngx As Long, lngY As Long
    Dim strTmp As String
    strTmp = ""
    Do While Not lngRet = INVALID_HANDLE_VALUE
        lngRet = apiFindFirstFile(strFilename, lpFindFileData)
        strFile = Left$(lpFindFileData.cFileName,
InStr(lpFindFileData.cFileName, vbNullChar) - 1)
            If Len(strFilename) > 2 Then
                strTmp = strFile & "\" & strTmp
                strFilename = fParseDir(strFilename)
            Else
                strTmp = strFilename & "\" & strTmp
                Exit Do
            End If
        Loop
    fGetLongName = Left$(strTmp, Len(strTmp) - 1)
    lngY = apiFindClose(lngRet)
End Function
Private Function fParseDir(strInFile As String) As String
    Dim intLen As Long, boolFound As Boolean
    Dim i As Integer, F As String, strDir As String
    intLen = Len(strInFile)
    If intLen > 0 Then
        boolFound = False
        For i = intLen To 1 Step -1
            If Mid$(strInFile, i, 1) = "\" Then
                F = Mid$(strInFile, i + 1)
                strDir = Left$(strInFile, i - 1)
                boolFound = True
                Exit For
            End If
        Next i
    End If
    If boolFound Then
        fParseDir = strDir
    Else
        fParseDir = strInFile
    End If
End Function
ciao
Luca

Ottima la soluzione di Dev Hashis suggerita da LP!
Per quanto riguarda la funzione "fGetShortName" č perfetta perchč fa uso di
una apposita API ("GetShortPathNameA")
Invece non esiste una API specifica per ottenere il percorso lungo di un
file (di cui si dispone solo il percorso DOS). Quindi Dev Hashis ha usato
una combinazione di due funzioni piů due funzioni API per ottenere la
funzione "fGetLongName".
Io tempo fa ho avuto la tua stessa esigenza č non conoscendo questa
soluzione, ho ideato anch'io una funzione "GetLongPathName".
Vi posto (con un po' di orgoglio) anche la mia funzione perchč contiene meno
codice, e nessuna API!
-----------
Public Function GetLongPathName(ByVal ShortPathName As String) As String
   Dim Pos1 As Long
   Dim Pos2 As Long
   Dim strParziale As String
   Dim strContinua As String
   Dim strConvertDirFile As String
   strContinua = ShortPathName
   Do
      Pos1 = InStr(1, strContinua, "\")
      strParziale = strParziale & Left$(strContinua, Pos1)
      Pos2 = InStr(Pos1 + 1, strContinua, "\")
      If Pos2 = 0 Then Pos2 = Len(strContinua) + 1
      strConvertDirFile = Mid$(strContinua, Pos1 + 1, (Pos2 - Pos1) - 1)
      strContinua = Right$(strContinua, (Len(strContinua) - Pos2) + 1)
      strParziale = strParziale & Dir(strParziale & strConvertDirFile,
vbDirectory)
   Loop Until strContinua = ""
   GetLongPathName = strParziale
End Function
--------------
Tutta qui! Bella no?
 _    _
 >    <
    []
 \___/......(Ciao!)
Pasquale
mine...@libero.it

Tutta qui! Bella no?
decisamente meglio, grazie.
