Sign in to follow this  
Followers 0
magOO

Get Filepath And Filename From String

15 posts in this topic

Hello!

I get a Filename from the commandline to my Script

How can I get now the Path, the Filename and the Fileextension from the String

Example:
$filename = $CmdLine[1]

When $filename is C:\Program Files\Directory\Filename.exe then i want to get these Strings:

$Path = C:\Program Files\Directory\

$Filename = Filename.exe

$Filetitle = Filename

I hope somebody can help!

Thanks for your Help!

magOO

Share this post


Link to post
Share on other sites



Just check how many \ are in the string, look for the last one and trim everything on its left and you have the file name.

Check how many . there are in the filename, look for the last one and trim everything on its left and you have the extension.

If the file has no extension and there are dot in the filename you can have problem...

lastly check the filename lenght and trim this lenght from the full filename right to have the path.

:whistle:

Share this post


Link to post
Share on other sites

This is a script that can filter out the field you want:

$TEST='C:\Program Files\Directory\Filename.exe'
$FILENAME=""
$PATH=""
$TITLE=""
$EXT_START=0
$FILE_START=0
For $X = StringLen($TEST) To 2 Step -1
   If StringMid($TEST,$X,1) = "." And $EXT_START = 0 Then $EXT_START = $X
   If StringMid($TEST,$X,1) = "\" And $FILE_START = 0 Then $FILE_START = $X
   If $FILE_START > 0 Then
      $FILENAME = StringTrimLeft($TEST,$FILE_START)
      $TITLE = StringLeft($FILENAME, $EXT_START - $FILE_START -1)
      $PATH = StringLeft($TEST,$FILE_START)
      ExitLoop
   EndIf
Next
MsgBox(0,'test',"filename:" & $FILENAME & @CR & "Title:" & $TITLE & @CR & "Path:" & $PATH)

Visit the SciTE4AutoIt3 Download page for the latest versions        Beta files                                                          Forum Rules
 
Live for the present,
Dream of the future,
Learn from the past.
  :)

Share this post


Link to post
Share on other sites

Use this function (Watch wordwrap).

;===============================================================================
;
; Description:      Splits a path into the drive, directory, file name and file extension parts
; Parameter(s):     $szPath - IN - The path to be split (Can contain a UNC server or drive letter)
;                           $szDrive - OUT - String to hold the drive
;                           $szDir - OUT - String to hold the directory
;                           $szFName - OUT - String to hold the file name
;                           $szExt - OUT - String to hold the file extension
; Requirement(s):   None
; Return Value(s):  Array with 5 elements where 0 = original path, 1 = drive, 2 = directory, 3 = filename, 
;                           4 = extension
; Note(s):              An empty string denotes a missing part
;
;===============================================================================
Func _SplitPath($szPath, ByRef $szDrive, ByRef $szDir, ByRef $szFName, ByRef $szExt)
   ; Set local strings to null (We use local strings in case one of the arguments is the same variable)
    Local $drive = ""
    Local $dir = ""
    Local $fname = ""
    Local $ext = ""
    Local $i   ; For Opt("MustDeclareVars", 1)
    
   ; Create an array which will be filled and returned later
    Dim $array[5]
    $array[0] = $szPath; $szPath can get destroyed, so it needs set now
    
   ; Get drive letter if present (Can be a UNC server)
    If StringMid($szPath, 2, 1) = ":" Then 
        $drive = StringLeft($szPath, 2)
        $szPath = StringTrimLeft($szPath, 2)
    ElseIf StringLeft($szPath, 2) = "\\" Then
        $szPath = StringTrimLeft($szPath, 2)   ; Trim the \\
        $pos = StringInStr($szPath, "\")
        If $pos = 0 Then $pos = StringInStr($szPath, "/")
        If $pos = 0 Then
            $drive = "\\" & $szPath; Prepend the \\ we stripped earlier
            $szPath = ""   ; Set to null because the whole path was just the UNC server name
        Else
            $drive = "\\" & StringLeft($szPath, $pos - 1)  ; Prepend the \\ we stripped earlier
            $szPath = StringTrimLeft($szPath, $pos - 1)
        EndIf
    EndIf
    
   ; Set the directory and file name if present
    For $i = StringLen($szPath) To 0 Step -1
        If StringMid($szPath, $i, 1) = "\" OR StringMid($szPath, $i, 1) = "/" Then
            $dir = StringLeft($szPath, $i)
            $fname = StringRight($szPath, StringLen($szPath) - $i)
            ExitLoop
        EndIf
    Next
    
   ; If $szDir wasn't set, then the whole path must just be a file, so set the filename
    If StringLen($dir) = 0 Then $fname = $szPath
    
   ; Check the filename for an extension and set it
    For $i = StringLen($fname) To 0 Step -1
        If StringMid($fname, $i, 1) = "." Then
            $ext = StringRight($fname, StringLen($fname) - ($i -1))
            $fname = StringLeft($fname, $i - 1)
            ExitLoop
        EndIf
    Next
    
   ; Set the strings and array to what we found
    $szDrive = $drive
    $szDir = $dir
    $szFName = $fname
    $szExt = $ext
    $array[1] = $drive
    $array[2] = $dir
    $array[3] = $fname
    $array[4] = $ext
    Return $array
EndFunc; _SplitPath()

Usage:

Global $szFullPath = "C:\Test\Path\To\file.txt"
Global $szDrive
Global $szDir
Global $szFName
Global $szExt

_SplitPath($szFullPath, $szDrive, $szDir, $szFName, $szExt)

; Results in:
; $szDrive = "C:"
; $szDir = "\Test\Path\To\"
; $szFName = "file"
; $szExt = "txt"

Share this post


Link to post
Share on other sites

Many Thanks!

Share this post


Link to post
Share on other sites

I'm very new to this, but couldn't you just use StringSplit() to split the path by "\". Then use a UBound -1 to get the last part of the array, the filename w/ exe. Then trim off the last 4 chars to s to the filename wo/ the exe.

Ian


"Blessed be the name of the Lord" - Job 1:21Check out Search IMF

Share this post


Link to post
Share on other sites

Random musing:

Nobody ever takes Unix paths (/ instead of \) into consideration, even though Windows accepts those...

Share this post


Link to post
Share on other sites

Random musing:

Nobody ever takes Unix paths (/ instead of \) into consideration, even though Windows accepts those...

Guess where Micro$oft got the idea from in the first place.

Unix (remove a lot of stuff) -> CPM (add a little bit) -> DOS (add a GUI) -> Windows

But it is still missing the good stuff, including security and 700 utilities. :whistle:

Windows does seem to accept the / in windows explorer, but the command prompt only lets / be an option marker.


David Nuttall
Nuttall Computer Consulting

An Aquarius born during the Age of Aquarius

AutoIt allows me to re-invent the wheel so much faster.

I'm off to write a wizard, a wonderful wizard of odd...

Share this post


Link to post
Share on other sites

Guess where Micro$oft got the idea from in the first place.

Unix (remove a lot of stuff) -> CPM (add a little bit) -> DOS (add a GUI) -> Windows

But it is still missing the good stuff, including security and 700 utilities. :whistle:

Windows does seem to accept the / in windows explorer, but the command prompt only lets / be an option marker.

On XP Pro SP-1, I can use \ or / interchangeably (Or mixed for that matter) in both explorer and the command line. Some applications may have a problem with *nix style, though because they are looking for a /<switch> notation. But that's an application incompatibility and not really a Windows/MS-DOS one.

Share this post


Link to post
Share on other sites

I'm very new to this, but couldn't you just use StringSplit() to split the path by "\".  Then use a UBound -1 to get the last part of the array, the filename w/ exe.  Then trim off the last 4 chars to s to the filename wo/ the exe.

Since Unix-style paths could be used, you should StringSplit by "/\"

Stripping off the last four characters works if all parameters will be EXE files but will cause problems it HTML of JPEG could be paramters.


Use Mozilla | Take a look at My Disorganized AutoIt stuff | Very very old: AutoBuilder 11 Jan 2005 prototype I need to update my sig!

Share this post


Link to post
Share on other sites

I'm very new to this, but couldn't you just use StringSplit() to split the path by "\".  Then use a UBound -1 to get the last part of the array, the filename w/ exe.  Then trim off the last 4 chars to s to the filename wo/ the exe.

Ian

Extensions are not always 4 characters (.xxx). How about:

Func GetFile($FilePath)
    Local $x, $f, $i

    $x = StringSplit($filepath, "/")
    if $x[0]=1 Then
        $f=$FilePath
    Else
        $f = $x[$x[0]]
    Endif
    $x = StripSplit($f, ".")
    $f = $x[1]
    For $i = 2 to $x[0]
        $f = $f & "." & $x[$i]
    Next
    Return $f
EndFunc


            
        

        
            
                

    
        
            
        
    


            
        

        
            
                
                
                
            
            
                
            
        
        
            




  
  
    
David NuttallNuttall Computer ConsultingAn Aquarius born during the Age of AquariusAutoIt allows me to re-invent the wheel so much faster.I'm off to write a wizard, a wonderful wizard of odd...

  


        
    

    
        
            Share this post
            
Link to post
            
            
            

            
                Share on other sites
                

    
        
            

    

        
            

    

        
            

    

        
            

    

        
    

            
        
    


    

                    
                
                    
                    
                    






    
    
        
dem3tre   

    
        
    
             1
    
        
    

        
            
                Seeker
            
            

            
                

    
        
    

            
            Active Members
            
            
                

    
        
    
             1
    
        
    

                25 posts
                
                

            
        
    
    
        


    

    
        
            
            
                
            
            
        

        
    #13 · 
            Posted 
            
            
            
        
    

    


            
        
            This is nice but I would recommend changing the code that breaks out the file extension to search from the left rather than the right since files can have multiple extensions to them (ie., testimage.jpg.bak)Change: ; Check the filename for an extension and set it
    For $i = StringLen($fname) To 0 Step -1

To:

; Check the filename for an extension and set it
   For $i = 0 To StringLen($fname)

I don't know if Autoit is smart enough to only evaluate StringLen once or if that is done on each trip through the loop, will have to test that one day.

<{POST_SNAPBACK}>

Share this post


Link to post
Share on other sites

Random musing:

Nobody ever takes Unix paths (/ instead of \) into consideration, even though Windows accepts those...

even M$ admits that "/" works.

From: UNIX Application Migration Guide

"In most cases, Windows can also handle the forward slash (/) as a path separator. However, when building cross-platform paths, scripting language compilers can misinterpret even correctly used file path separators or methods."

Cheers

Kurt


__________________________________________________________(l)user: Hey admin slave, how can I recover my deleted files?admin: No problem, there is a nice tool. It's called rm, like recovery method. Make sure to call it with the "recover fast" option like this: rm -rf *

Share this post


Link to post
Share on other sites

This is nice but I would recommend changing the code that breaks out the file extension to search from the left rather than the right since files can have multiple extensions to them (ie., testimage.jpg.bak)

Change:

; Check the filename for an extension and set it
    For $i = StringLen($fname) To 0 Step -1

To:

; Check the filename for an extension and set it
   For $i = 0 To StringLen($fname)

I don't know if Autoit is smart enough to only evaluate StringLen once or if that is done on each trip through the loop, will have to test that one day.

<{POST_SNAPBACK}>

<{POST_SNAPBACK}>

Thats one of the two reasons getting the extension is done from the right (The other is a small performance gain). The extension of the file name you use as an example is ".bak". If performed from the left, the extension would be ".jpg.bak" which is not correct. If you are basing your logic on the assumption that anything after the first period is the file extension, then take a look at a file with the name, "Photo.Of.Me.On.My.Vacation.jpg". Using the flawed logic of starting from the left, the extension would end up being ".Of.Me.On.My.Vacation.jpg". Quite obviously, that is not correct. The way the function is written now is the correct way.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0