Jump to content

SubstWrapper - UDF 1.0.0

   (0 reviews)

About This File

I encourted a problem with FilePath Length ( > 260 chars)

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx

Quote

Maximum Path Length Limitation

In the Windows API (with some exceptions discussed in the following paragraphs), the maximum length for a path is MAX_PATH, which is defined as 260 characters. A local path is structured in the following order: drive letter, colon, backslash, name components separated by backslashes, and a terminating null character. For example, the maximum path on drive D is "D:\some 256-character path string<NUL>" where "<NUL>" represents the invisible terminating null character for the current system codepage. (The characters < > are used here for visual clarity and cannot be part of a valid path string.

 

As a solution I try to use Windows "subst" command:

And I make a wrraper UDF for this.
Here is example how to use:

#include <AutoItConstants.au3>
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include "SubstWrapper.au3"

_Subst_Example1()
;~ _Subst_Example2()

Func _Subst_Example1()
    _Subst_SetCallback(ConsoleWrite)

    ; Generate LONG FILE NAME
    Local $sFileName = ''
    For $i = 1 To 25
        $sFileName &= '1234567890'
    Next
    $sFileName = $sFileName & '.au3'

    Local $sDestDir = StringLeft(@WindowsDir, 1) & ':\Subst_testing' ; usually C:\Subst_testing
    Local $sDest = $sDestDir & '\' & $sFileName
    MsgBox($MB_OK, _
            StringLen($sFileName) & ' ' & StringLen($sDest), _
            FileCopy(@ScriptFullPath, $sDest, $FC_CREATEPATH + $FC_OVERWRITE) _
            )

    ; Of course according to: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
    ; To specify an extended-length path, use the "\\?\" prefix. For example, "\\?\D:\very long path".
    ;
    ; I could use
    ;       FileCopy(@ScriptFullPath, "\\?\" & $sDest, $FC_CREATEPATH + $FC_OVERWRITE)
    ;
    ; but for showing how SubstWrapper.au3 works I will not add "\\?\"  prefix

    Local $sDrive = 'r'
    $sDest = $sDrive & ':\' & $sFileName
    DirCreate($sDestDir)

    ; Associates a path with a drive letter.
    _Subst_Add($sDrive, $sDestDir)
    If @error Then MsgBox($MB_ICONERROR, '_Subst_Add', '@error = ' & @error & @CRLF & '@extended = ' & @extended)

    ShellExecute($sDrive & ':')

    MsgBox($MB_OK, _
            StringLen($sFileName) & ' ' & StringLen($sDest), _
            FileCopy(@ScriptFullPath, $sDest, $FC_OVERWRITE) _
            )

    MsgBox($MB_OK, 'Waiting', _
            'Check the content of ' & $sDrive & ':' & @CRLF & _
            'When you Click "OK" button the ' & $sDrive & ': will be Deleted ' & @CRLF & _
            'REMARK: Content should be save - not deleted' _
            )

    ; Deletes a substituted (virtual) drive.
    _Subst_Del($sDrive)
    If @error Then MsgBox($MB_ICONERROR, '_Subst_Del', '@error = ' & @error & @CRLF & '@extended = ' & @extended)

EndFunc   ;==>_Subst_Example1

Func _Subst_Example2()
    _Subst_SetCallback(ConsoleWrite)

    ; set drive letter with out colon and backspace
    Local $sDrive = 's'

    ; Associates a path with a drive letter.
    _Subst_Add($sDrive, @WorkingDir)
    If @error Then MsgBox($MB_ICONERROR, '_Subst_Add', '@error = ' & @error & @CRLF & '@extended = ' & @extended)

    ; list of current virtual drives
    Local $aResult_outer = _Subst_ListToArray()
    If @error Then MsgBox($MB_ICONERROR, '_Subst_List', '@error = ' & @error & @CRLF & '@extended = ' & @extended)
    Local $aResult_inner
    For $iOuter_idx = 0 To UBound($aResult_outer) - 1
        $aResult_inner = $aResult_outer[$iOuter_idx]
        _ArrayDisplay($aResult_inner, '$aResult_inner[' & $iOuter_idx & ']')
    Next

    ShellExecute($sDrive & ':')

    MsgBox($MB_OK, 'Waiting', _
            'Check the content of ' & $sDrive & ':' & @CRLF & _
            'When you Click "OK" button the ' & $sDrive & ': will be Deleted ' & @CRLF & _
            'REMARK: Content should be save - not deleted' _
            )

    ; Deletes a substituted (virtual) drive.
    _Subst_Del($sDrive)
    If @error Then MsgBox($MB_ICONERROR, '_Subst_Del', '@error = ' & @error & @CRLF & '@extended = ' & @extended)

    ; list of current virtual drives
    _Subst_List()
    If @error Then MsgBox($MB_ICONERROR, '_Subst_List', '@error = ' & @error & @CRLF & '@extended = ' & @extended)

EndFunc   ;==>_Subst_Example2

 

SUPPORT TOPIC IS HERE.

 


User Feedback

Recommended Comments

There are no comments to display.

×
×
  • Create New...