What is the simplest way to check for the existence of a file specified by a file: URL that uses URLEncoding in Tcl 8.5.9?
::http::geturl says it doesn't support file URLs.
file exists requires URLDecoding. There doesn't seem to be a builtin proc for URLDecoding. Have I missed it?
Are there any other builtin ways to do this? Do newer versions of Tcl provide more support for this?
If no builtin way, is there a recommended library for this? Either for directly handling file: URLs, or for URLDecoding?
In my projects, I tend to use a combination of a URI/URL processor (uri::split) plus a URL decoder (urlDecode) for postprocessing:
% package req uri
1.2.7
% set parsedURL [::uri::split file:///path/to/a%20file]
path /path/to/a%20file scheme file
Source the following:
proc urlDecode {str} {
set specialMap {"[" "%5B" "]" "%5D"}
set seqRE {%([0-9a-fA-F]{2})}
set replacement {[format "%c" [scan "\1" "%2x"]]}
set modStr [regsub -all $seqRE [string map $specialMap $str] $replacement]
return [encoding convertfrom utf-8 [subst -nobackslash -novariable $modStr]]
}
Then:
% set fp [urlDecode [dict get $parsedURL path]]
/path/to/a file
% file exists $fp
% 0
Depending on the portability and robustness aimed at, you might want to use file normalize & friends.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With