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.

 


1 person likes this



User Feedback

You may only provide a review once you have downloaded the file.

There are no reviews to display.

  • Similar Content

    • mLipok
      By mLipok
      I just made new UDF.
      This is an UDF wrapper for windows subst command (Associates a path with a drive letter).
      Here are  examples:
      #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 The second example also works (just uncomment them).
       
      You can download it here:

      Have fun.
      mLipok