Posts mit dem Label UNC Pfadnamen werden angezeigt. Alle Posts anzeigen
Posts mit dem Label UNC Pfadnamen werden angezeigt. Alle Posts anzeigen

Freitag, 25. Juni 2010

Erzeugen von UNC Pfadnamen / Creating UNC Pathnames (Revisited)

Nachdem ich heute zufälligerweise in eine alte Funktion von mir reingeschaut habe (Erzeugen von UNC-Pfadnamen), gab es auch gleich Verbesserungsbedarf. Im Blogeintrag vom September 2008 konnte nur ein Laufwerksbuchstabe (bspw. H:) übergeben werden. Die neue Funktion habe ich nun dahingehend erweitert, dass es jetzt sowohl reine Laufwerksbuchstaben, als auch komplette Verzeichnis- und/oder Dateinamen sein dürfen. Die verschiedenen Möglichkeiten sind im vorgelagerten Funktionstest zu ersehen.

* // Funktionstest Start    
CLEAR 
?GetFullUNCPath( [H:] )
?GetFullUNCPath( [H:\] )
?GetFullUNCPath( [H:\Foxprogs] )
?GetFullUNCPath( [H:\Foxprogs\] )
?GetFullUNCPath( [H:\Foxprogs\mware71] )
?GetFullUNCPath( [H:\Foxprogs\mware71\] )
?GetFullUNCPath( [H:\Foxprogs\mware71\konf.exe] )
* // Funktionstest Ende        

FUNCTION GetFullUNCPath as String
LPARAMETERS vMappedName as String
    * // Datendeklaration und Initialisierung            
    LOCAL    lcUNCBuffer as String, liLength as Integer, ;
            lcUNCName as String, llContinue as Boolean, ;
            lcMessage as String, lcPath as String
    lcUNCBuffer    = []
    liLength    = 0
    lcUNCName    = []
    llContinue    = .T.
    lcMessage    = []
    vMappedName    = IIF(DIRECTORY( vMappedName ) , ADDBS( vMappedName ) , vMappedName )
    lcPath        = IIF( LEN( vMappedName ) > 2 , SUBSTR( vMappedName , 3 ) , [] )
    vMappedName    = JUSTDRIVE( vMappedName )
    * // Deklaration der API-Funktion                    
    TRY
        DECLARE INTEGER WNetGetConnection IN WIN32API ;
            STRING @ lpLocalName, ;
            STRING @ lpRemoteName, ;
            INTEGER @ lpliLength
    CATCH
        TEXT TO lcMessage NOSHOW TEXTMERGE PRETEXT 2
            Deklaration von WNetGetConnection in WIN32API
            ist fehlgeschlagen. Funktion wird vorzeitig beendet.
        ENDTEXT
        MESSAGEBOX(lcMessage,0+16+0,[Information])
        llContinue = .F.
    ENDTRY
    * // Umsetzung des lokalen Pfades in einen UNC Pfad    
    IF llContinue
        IF !EMPTY( vMappedName ) AND VARTYPE( [vMappedName] ) = [C]
            lcUNCBuffer    = REPL( CHR( 0 ) , 261 )
            liLength    = LEN( lcUNCBuffer )
            vMappedName    = ALLTRIM( vMappedName )
            IF LEN( vMappedName ) = 1
                vMappedName = vMappedName + [:]
            ENDIF
            TRY
                IF WNetGetConnection( vMappedName , @lcUNCBuffer , @liLength ) = 0
                    lcUNCName = LEFT( lcUNCBuffer , AT( CHR( 0 ) , lcUNCBuffer ) - 1 )
                ENDIF
            CATCH
                TEXT TO lcMessage NOSHOW TEXTMERGE PRETEXT 2
                    Aufruf von WNetGetConnection in WIN32API
                    ist fehlgeschlagen. UNC-Pfad konnte nicht
                    generiert werden.
                ENDTEXT
                MESSAGEBOX( lcMessage , 0+16+0 , [Information] )
            ENDTRY
        ENDIF
    ENDIF
    RETURN lcUNCName + lcPath
ENDFUNC

Mittwoch, 3. September 2008

Erzeugen von UNC Pfadnamen / Creating UNC pathnames

Im folgenden Posting geht es um die Konvertierung von Verzeichnisnamen die auf gemappte Laufwerke zugreifen.

Mit Hilfe der WIN32API können wir über die dort verfügbare Funktion WNetGetConnection den UNC Namen ( Universal/Uniform Naming Convention ) einer solchen Verbindung abfragen.


FUNCTION GetUNCPath
LPARAMETERS vMappedName as String
  * // Datendeklaration und Initialisierung
  LOCAL    lcUNCBuffer as String, liLength as Integer, ;
          lcUNCName as String, llContinue as Boolean, ;
          lcMessage as String
  lcUNCBuffer    = []
  liLength    = 0
  lcUNCName    = []
  llContinue    = .T.
  lcMessage    = []
  * // Deklaration der API-Funktion
  TRY
      DECLARE INTEGER WNetGetConnection IN WIN32API ;
              STRING @ lpLocalName, ;
              STRING @ lpRemoteName, ;
              INTEGER @ lpliLength
  CATCH
      TEXT TO lcMessage NOSHOW TEXTMERGE PRETEXT 2
           Deklaration von WNetGetConnection in WIN32API
           ist fehlgeschlagen. Funktion wird vorzeitig beendet.
      ENDTEXT
      MESSAGEBOX(lcMessage,0+16+0,[Information])
      llContinue = .F.
  ENDTRY
  * // Umsetzung des lokalen Pfades in einen UNC Pfad
  IF llContinue
      IF !EMPTY(m.vMappedName) AND VARTYPE([m.vMappedName]) = [C]
          lcUNCBuffer        = REPL(CHR(0),261)
          liLength        = LEN(lcUNCBuffer)
          m.vMappedName    = ALLTRIM(m.vMappedName)
          IF LEN(m.vMappedName) = 1
              m.vMappedName = m.vMappedName + [:]
          ENDIF
          TRY
              IF WNetGetConnection(m.vMappedName, @lcUNCBuffer, @liLength) = 0
                 lcUNCName = LEFT(lcUNCBuffer,AT(CHR(0),lcUNCBuffer)-1)
              ENDIF
          CATCH
              TEXT TO lcMessage NOSHOW TEXTMERGE PRETEXT 2
                   Aufruf von WNetGetConnection in WIN32API
                   ist fehlgeschlagen. UNC-Pfad konnte nicht
                   generiert werden.
              ENDTEXT
              MESSAGEBOX(lcMessage,0+16+0,[Information])
          ENDTRY
      ENDIF
  ENDIF
  RETURN lcUNCName
ENDFUNC