How to obtain basename in ruby from the given file path in unix or windows format? Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 00:00UTC (8:00pm US/Eastern) Data science time! April 2019 and salary with experience The Ask Question Wizard is Live!How to get filename without extension from file path in RubyHow can I “pretty” format my JSON output in Ruby on Rails?How to break out from a ruby block?Extract file basename without path and extension in bashHow to write to file in Ruby?Given two directory trees, how can I find out which files differ?How to get full path of a file?How to remove a key from Hash and get the remaining hash in Ruby/Rails?How to download a file from server using SSH?How to permanently set $PATH on Linux/Unix?How do I copy folder with files to another folder in Unix/Linux?
Can anything be seen from the center of the Boötes void? How dark would it be?
Morning, Afternoon, Night Kanji
When a candle burns, why does the top of wick glow if bottom of flame is hottest?
Time to Settle Down!
Is it possible for SQL statements to execute concurrently within a single session in SQL Server?
How do I change colors in Zim (wiki editor) running on Kubuntu 18.10?
Generate an RGB colour grid
What's the meaning of "fortified infraction restraint"?
Take 2! Is this homebrew Lady of Pain warlock patron balanced?
How to react to hostile behavior from a senior developer?
How does the secondary effect of the Heat Metal spell interact with a creature resistant/immune to fire damage?
Do I really need to have a message in a novel to appeal to readers?
If Windows 7 doesn't support WSL, then what does Linux subsystem option mean?
How to compare two different files line by line in unix?
What order were files/directories outputted in dir?
How to tell that you are a giant?
Sum letters are not two different
Why weren't discrete x86 CPUs ever used in game hardware?
Why is the AVR GCC compiler using a full `CALL` even though I have set the `-mshort-calls` flag?
How could we fake a moon landing now?
ArcGIS Pro Python arcpy.CreatePersonalGDB_management
Why do early math courses focus on the cross sections of a cone and not on other 3D objects?
Denied boarding although I have proper visa and documentation. To whom should I make a complaint?
What is the difference between globalisation and imperialism?
How to obtain basename in ruby from the given file path in unix or windows format?
Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 23, 2019 at 00:00UTC (8:00pm US/Eastern)
Data science time! April 2019 and salary with experience
The Ask Question Wizard is Live!How to get filename without extension from file path in RubyHow can I “pretty” format my JSON output in Ruby on Rails?How to break out from a ruby block?Extract file basename without path and extension in bashHow to write to file in Ruby?Given two directory trees, how can I find out which files differ?How to get full path of a file?How to remove a key from Hash and get the remaining hash in Ruby/Rails?How to download a file from server using SSH?How to permanently set $PATH on Linux/Unix?How do I copy folder with files to another folder in Unix/Linux?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
I need to parse a basename in ruby a from file path which I get as input. Unix format works fine on Linux.
File.basename("/tmp/text.txt")
return "text.txt".
However, when I get input in windows format:
File.basename("C:Usersjohnnote.txt")
or
File.basename("C:\Users\john\note.txt")
"C:Usersjohnnote.txt" is the output (note that n
is a new line there), but I didn't get "note.txt".
Is there some nice solution in ruby/rails?
Solution:
"C:\test\note.txt".split(/\|//).last
=> "note.txt"
"/tmp/test/note.txt".split(/\|//).last
=> "note.txt"
If the Linux file name doesn't contain , it will work.
ruby linux ruby-on-rails-3
add a comment |
I need to parse a basename in ruby a from file path which I get as input. Unix format works fine on Linux.
File.basename("/tmp/text.txt")
return "text.txt".
However, when I get input in windows format:
File.basename("C:Usersjohnnote.txt")
or
File.basename("C:\Users\john\note.txt")
"C:Usersjohnnote.txt" is the output (note that n
is a new line there), but I didn't get "note.txt".
Is there some nice solution in ruby/rails?
Solution:
"C:\test\note.txt".split(/\|//).last
=> "note.txt"
"/tmp/test/note.txt".split(/\|//).last
=> "note.txt"
If the Linux file name doesn't contain , it will work.
ruby linux ruby-on-rails-3
Note:"C:U".chars #=> ["C", ":", "U"]
.
– Cary Swoveland
Mar 8 at 20:54
1
@CarySwoveland Further note "note" is treated as new line character (n
) ote.txt.
– engineersmnky
Mar 8 at 21:19
add a comment |
I need to parse a basename in ruby a from file path which I get as input. Unix format works fine on Linux.
File.basename("/tmp/text.txt")
return "text.txt".
However, when I get input in windows format:
File.basename("C:Usersjohnnote.txt")
or
File.basename("C:\Users\john\note.txt")
"C:Usersjohnnote.txt" is the output (note that n
is a new line there), but I didn't get "note.txt".
Is there some nice solution in ruby/rails?
Solution:
"C:\test\note.txt".split(/\|//).last
=> "note.txt"
"/tmp/test/note.txt".split(/\|//).last
=> "note.txt"
If the Linux file name doesn't contain , it will work.
ruby linux ruby-on-rails-3
I need to parse a basename in ruby a from file path which I get as input. Unix format works fine on Linux.
File.basename("/tmp/text.txt")
return "text.txt".
However, when I get input in windows format:
File.basename("C:Usersjohnnote.txt")
or
File.basename("C:\Users\john\note.txt")
"C:Usersjohnnote.txt" is the output (note that n
is a new line there), but I didn't get "note.txt".
Is there some nice solution in ruby/rails?
Solution:
"C:\test\note.txt".split(/\|//).last
=> "note.txt"
"/tmp/test/note.txt".split(/\|//).last
=> "note.txt"
If the Linux file name doesn't contain , it will work.
ruby linux ruby-on-rails-3
ruby linux ruby-on-rails-3
edited Mar 14 at 20:07
malmed
asked Mar 8 at 20:41
malmedmalmed
3021410
3021410
Note:"C:U".chars #=> ["C", ":", "U"]
.
– Cary Swoveland
Mar 8 at 20:54
1
@CarySwoveland Further note "note" is treated as new line character (n
) ote.txt.
– engineersmnky
Mar 8 at 21:19
add a comment |
Note:"C:U".chars #=> ["C", ":", "U"]
.
– Cary Swoveland
Mar 8 at 20:54
1
@CarySwoveland Further note "note" is treated as new line character (n
) ote.txt.
– engineersmnky
Mar 8 at 21:19
Note:
"C:U".chars #=> ["C", ":", "U"]
.– Cary Swoveland
Mar 8 at 20:54
Note:
"C:U".chars #=> ["C", ":", "U"]
.– Cary Swoveland
Mar 8 at 20:54
1
1
@CarySwoveland Further note "note" is treated as new line character (
n
) ote.txt.– engineersmnky
Mar 8 at 21:19
@CarySwoveland Further note "note" is treated as new line character (
n
) ote.txt.– engineersmnky
Mar 8 at 21:19
add a comment |
3 Answers
3
active
oldest
votes
Backslashes, while how Windows expresses things, are just a giant nuisance. Within a double-quoted string they have special meaning so you either need to do:
File.basename("C:\Users\john\note.txt")
Or use single quotes that avoid the issue:
File.basename('C:Usersjohnnote.txt')
Or use regular slashes which aren't impacted:
File.basename("C:/Users/john/note.txt")
Where Ruby does the mapping for you to the platform-specific path separator.
The first two didn't work for me on macos. Because ofFile::SEPARATOR
, I assume. So, short of running this code on windows. the caller has to convert the slashes as a pre-processing step. :shrug:
– Sergio Tulentsev
Mar 11 at 10:38
It seems that the only way is substitute ` and ` to / and then parse it as Unix file path. Or mess up with File::ALT_SEPARATOR. Anyway, it will change Unix file names like/tmp/testfile.txt
:(
– malmed
Mar 11 at 11:07
add a comment |
Try pathname
:
require 'pathname'
Pathname.new('C:Usersjohnnote.txt').basename
# => #<Pathname:note.txt>
Pathname docs
Ref How to get filename without extension from file path in Ruby
1
@CarySwoveland what do you mean?
– Martin Zinovsky
Mar 8 at 20:58
2
The OP used double quotes without escaping the backslash.
– Cary Swoveland
Mar 8 at 20:59
1
This does not seem to work in linux using 2.6.1Pathname.new('C:Usersjohnnote.txt').basename #=> #<Pathname:C:Usersjohnnote.txt>
– engineersmnky
Mar 8 at 21:05
@engineersmnky It won't work in Linux because Linux doesn't treat the backslash the same way as Windows does.
– tadman
Mar 8 at 22:28
@tadman my point was more that it is unlikely a rails server is running over IIS so this may not be a viable option
– engineersmnky
Mar 8 at 22:37
|
show 1 more comment
I'm not convinced that you have a problem with your code. I think you have a problem with your test.
Ruby also uses the backslash character for escape sequences in strings, so when you type the String literal "C:Usersjohnnote.txt"
, Ruby sees the first two backslashes as invalid escape sequences, and so ignores the escape character. n
refers to a newline. So, to Ruby, this literal is the same as "C:Usersjohnnote.txt"
. There aren't any file separators in that sequence, since n is a newline, not a backslash followed by the letter n, so File.basename just returns it as it receives it.
If you ask for user input in either a graphical user interface (GUI) or command line interface (CLI), the user entering input needn't worry about Ruby String escape sequences; those only matter for String literals directly in the code. Try it! Type gets
into IRB or Pry, and type or copy a file path, and press Enter, and see how Ruby displays it as a String literal.
On Windows, Ruby accepts paths given using both "/" (File::SEPARATOR) and "\" (File::ALT_SEPARATOR), so you don't need to worry about conversion unless you are displaying it to the user.
You are right withgets
->"C:\Users\john\note.txtn"
. However, in Linux Ruby/RailsFile
norPathname
cannot parse it.
– malmed
Mar 11 at 10:46
@malmed: I'm not on Windows right now, so I can't check, but I'm fairly sure that both File and Pathname should handle "C:\Users\john\note.txt" just fine. I suspect it is the trailing newline (n) that is causing your problem. Use String#chop.
– sondra.kinsey
Mar 13 at 18:05
I'm also not on Windows (but I receive both formats of a path). I don't doubt, that "C:\Users\john\note.txt" is parsed fine on Windows.
– malmed
Mar 14 at 19:55
@malmed Are you saying that you want a user to input a file path into a web application, and then have your app manipulate that path? I'm having a hard time imagining a use case for that. Obviously, you can just use String#split.
– sondra.kinsey
Mar 14 at 20:04
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55070700%2fhow-to-obtain-basename-in-ruby-from-the-given-file-path-in-unix-or-windows-forma%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
Backslashes, while how Windows expresses things, are just a giant nuisance. Within a double-quoted string they have special meaning so you either need to do:
File.basename("C:\Users\john\note.txt")
Or use single quotes that avoid the issue:
File.basename('C:Usersjohnnote.txt')
Or use regular slashes which aren't impacted:
File.basename("C:/Users/john/note.txt")
Where Ruby does the mapping for you to the platform-specific path separator.
The first two didn't work for me on macos. Because ofFile::SEPARATOR
, I assume. So, short of running this code on windows. the caller has to convert the slashes as a pre-processing step. :shrug:
– Sergio Tulentsev
Mar 11 at 10:38
It seems that the only way is substitute ` and ` to / and then parse it as Unix file path. Or mess up with File::ALT_SEPARATOR. Anyway, it will change Unix file names like/tmp/testfile.txt
:(
– malmed
Mar 11 at 11:07
add a comment |
Backslashes, while how Windows expresses things, are just a giant nuisance. Within a double-quoted string they have special meaning so you either need to do:
File.basename("C:\Users\john\note.txt")
Or use single quotes that avoid the issue:
File.basename('C:Usersjohnnote.txt')
Or use regular slashes which aren't impacted:
File.basename("C:/Users/john/note.txt")
Where Ruby does the mapping for you to the platform-specific path separator.
The first two didn't work for me on macos. Because ofFile::SEPARATOR
, I assume. So, short of running this code on windows. the caller has to convert the slashes as a pre-processing step. :shrug:
– Sergio Tulentsev
Mar 11 at 10:38
It seems that the only way is substitute ` and ` to / and then parse it as Unix file path. Or mess up with File::ALT_SEPARATOR. Anyway, it will change Unix file names like/tmp/testfile.txt
:(
– malmed
Mar 11 at 11:07
add a comment |
Backslashes, while how Windows expresses things, are just a giant nuisance. Within a double-quoted string they have special meaning so you either need to do:
File.basename("C:\Users\john\note.txt")
Or use single quotes that avoid the issue:
File.basename('C:Usersjohnnote.txt')
Or use regular slashes which aren't impacted:
File.basename("C:/Users/john/note.txt")
Where Ruby does the mapping for you to the platform-specific path separator.
Backslashes, while how Windows expresses things, are just a giant nuisance. Within a double-quoted string they have special meaning so you either need to do:
File.basename("C:\Users\john\note.txt")
Or use single quotes that avoid the issue:
File.basename('C:Usersjohnnote.txt')
Or use regular slashes which aren't impacted:
File.basename("C:/Users/john/note.txt")
Where Ruby does the mapping for you to the platform-specific path separator.
answered Mar 8 at 22:30
tadmantadman
158k19182211
158k19182211
The first two didn't work for me on macos. Because ofFile::SEPARATOR
, I assume. So, short of running this code on windows. the caller has to convert the slashes as a pre-processing step. :shrug:
– Sergio Tulentsev
Mar 11 at 10:38
It seems that the only way is substitute ` and ` to / and then parse it as Unix file path. Or mess up with File::ALT_SEPARATOR. Anyway, it will change Unix file names like/tmp/testfile.txt
:(
– malmed
Mar 11 at 11:07
add a comment |
The first two didn't work for me on macos. Because ofFile::SEPARATOR
, I assume. So, short of running this code on windows. the caller has to convert the slashes as a pre-processing step. :shrug:
– Sergio Tulentsev
Mar 11 at 10:38
It seems that the only way is substitute ` and ` to / and then parse it as Unix file path. Or mess up with File::ALT_SEPARATOR. Anyway, it will change Unix file names like/tmp/testfile.txt
:(
– malmed
Mar 11 at 11:07
The first two didn't work for me on macos. Because of
File::SEPARATOR
, I assume. So, short of running this code on windows. the caller has to convert the slashes as a pre-processing step. :shrug:– Sergio Tulentsev
Mar 11 at 10:38
The first two didn't work for me on macos. Because of
File::SEPARATOR
, I assume. So, short of running this code on windows. the caller has to convert the slashes as a pre-processing step. :shrug:– Sergio Tulentsev
Mar 11 at 10:38
It seems that the only way is substitute ` and ` to / and then parse it as Unix file path. Or mess up with File::ALT_SEPARATOR. Anyway, it will change Unix file names like
/tmp/testfile.txt
:(– malmed
Mar 11 at 11:07
It seems that the only way is substitute ` and ` to / and then parse it as Unix file path. Or mess up with File::ALT_SEPARATOR. Anyway, it will change Unix file names like
/tmp/testfile.txt
:(– malmed
Mar 11 at 11:07
add a comment |
Try pathname
:
require 'pathname'
Pathname.new('C:Usersjohnnote.txt').basename
# => #<Pathname:note.txt>
Pathname docs
Ref How to get filename without extension from file path in Ruby
1
@CarySwoveland what do you mean?
– Martin Zinovsky
Mar 8 at 20:58
2
The OP used double quotes without escaping the backslash.
– Cary Swoveland
Mar 8 at 20:59
1
This does not seem to work in linux using 2.6.1Pathname.new('C:Usersjohnnote.txt').basename #=> #<Pathname:C:Usersjohnnote.txt>
– engineersmnky
Mar 8 at 21:05
@engineersmnky It won't work in Linux because Linux doesn't treat the backslash the same way as Windows does.
– tadman
Mar 8 at 22:28
@tadman my point was more that it is unlikely a rails server is running over IIS so this may not be a viable option
– engineersmnky
Mar 8 at 22:37
|
show 1 more comment
Try pathname
:
require 'pathname'
Pathname.new('C:Usersjohnnote.txt').basename
# => #<Pathname:note.txt>
Pathname docs
Ref How to get filename without extension from file path in Ruby
1
@CarySwoveland what do you mean?
– Martin Zinovsky
Mar 8 at 20:58
2
The OP used double quotes without escaping the backslash.
– Cary Swoveland
Mar 8 at 20:59
1
This does not seem to work in linux using 2.6.1Pathname.new('C:Usersjohnnote.txt').basename #=> #<Pathname:C:Usersjohnnote.txt>
– engineersmnky
Mar 8 at 21:05
@engineersmnky It won't work in Linux because Linux doesn't treat the backslash the same way as Windows does.
– tadman
Mar 8 at 22:28
@tadman my point was more that it is unlikely a rails server is running over IIS so this may not be a viable option
– engineersmnky
Mar 8 at 22:37
|
show 1 more comment
Try pathname
:
require 'pathname'
Pathname.new('C:Usersjohnnote.txt').basename
# => #<Pathname:note.txt>
Pathname docs
Ref How to get filename without extension from file path in Ruby
Try pathname
:
require 'pathname'
Pathname.new('C:Usersjohnnote.txt').basename
# => #<Pathname:note.txt>
Pathname docs
Ref How to get filename without extension from file path in Ruby
answered Mar 8 at 20:50
Martin ZinovskyMartin Zinovsky
1,79411017
1,79411017
1
@CarySwoveland what do you mean?
– Martin Zinovsky
Mar 8 at 20:58
2
The OP used double quotes without escaping the backslash.
– Cary Swoveland
Mar 8 at 20:59
1
This does not seem to work in linux using 2.6.1Pathname.new('C:Usersjohnnote.txt').basename #=> #<Pathname:C:Usersjohnnote.txt>
– engineersmnky
Mar 8 at 21:05
@engineersmnky It won't work in Linux because Linux doesn't treat the backslash the same way as Windows does.
– tadman
Mar 8 at 22:28
@tadman my point was more that it is unlikely a rails server is running over IIS so this may not be a viable option
– engineersmnky
Mar 8 at 22:37
|
show 1 more comment
1
@CarySwoveland what do you mean?
– Martin Zinovsky
Mar 8 at 20:58
2
The OP used double quotes without escaping the backslash.
– Cary Swoveland
Mar 8 at 20:59
1
This does not seem to work in linux using 2.6.1Pathname.new('C:Usersjohnnote.txt').basename #=> #<Pathname:C:Usersjohnnote.txt>
– engineersmnky
Mar 8 at 21:05
@engineersmnky It won't work in Linux because Linux doesn't treat the backslash the same way as Windows does.
– tadman
Mar 8 at 22:28
@tadman my point was more that it is unlikely a rails server is running over IIS so this may not be a viable option
– engineersmnky
Mar 8 at 22:37
1
1
@CarySwoveland what do you mean?
– Martin Zinovsky
Mar 8 at 20:58
@CarySwoveland what do you mean?
– Martin Zinovsky
Mar 8 at 20:58
2
2
The OP used double quotes without escaping the backslash.
– Cary Swoveland
Mar 8 at 20:59
The OP used double quotes without escaping the backslash.
– Cary Swoveland
Mar 8 at 20:59
1
1
This does not seem to work in linux using 2.6.1
Pathname.new('C:Usersjohnnote.txt').basename #=> #<Pathname:C:Usersjohnnote.txt>
– engineersmnky
Mar 8 at 21:05
This does not seem to work in linux using 2.6.1
Pathname.new('C:Usersjohnnote.txt').basename #=> #<Pathname:C:Usersjohnnote.txt>
– engineersmnky
Mar 8 at 21:05
@engineersmnky It won't work in Linux because Linux doesn't treat the backslash the same way as Windows does.
– tadman
Mar 8 at 22:28
@engineersmnky It won't work in Linux because Linux doesn't treat the backslash the same way as Windows does.
– tadman
Mar 8 at 22:28
@tadman my point was more that it is unlikely a rails server is running over IIS so this may not be a viable option
– engineersmnky
Mar 8 at 22:37
@tadman my point was more that it is unlikely a rails server is running over IIS so this may not be a viable option
– engineersmnky
Mar 8 at 22:37
|
show 1 more comment
I'm not convinced that you have a problem with your code. I think you have a problem with your test.
Ruby also uses the backslash character for escape sequences in strings, so when you type the String literal "C:Usersjohnnote.txt"
, Ruby sees the first two backslashes as invalid escape sequences, and so ignores the escape character. n
refers to a newline. So, to Ruby, this literal is the same as "C:Usersjohnnote.txt"
. There aren't any file separators in that sequence, since n is a newline, not a backslash followed by the letter n, so File.basename just returns it as it receives it.
If you ask for user input in either a graphical user interface (GUI) or command line interface (CLI), the user entering input needn't worry about Ruby String escape sequences; those only matter for String literals directly in the code. Try it! Type gets
into IRB or Pry, and type or copy a file path, and press Enter, and see how Ruby displays it as a String literal.
On Windows, Ruby accepts paths given using both "/" (File::SEPARATOR) and "\" (File::ALT_SEPARATOR), so you don't need to worry about conversion unless you are displaying it to the user.
You are right withgets
->"C:\Users\john\note.txtn"
. However, in Linux Ruby/RailsFile
norPathname
cannot parse it.
– malmed
Mar 11 at 10:46
@malmed: I'm not on Windows right now, so I can't check, but I'm fairly sure that both File and Pathname should handle "C:\Users\john\note.txt" just fine. I suspect it is the trailing newline (n) that is causing your problem. Use String#chop.
– sondra.kinsey
Mar 13 at 18:05
I'm also not on Windows (but I receive both formats of a path). I don't doubt, that "C:\Users\john\note.txt" is parsed fine on Windows.
– malmed
Mar 14 at 19:55
@malmed Are you saying that you want a user to input a file path into a web application, and then have your app manipulate that path? I'm having a hard time imagining a use case for that. Obviously, you can just use String#split.
– sondra.kinsey
Mar 14 at 20:04
add a comment |
I'm not convinced that you have a problem with your code. I think you have a problem with your test.
Ruby also uses the backslash character for escape sequences in strings, so when you type the String literal "C:Usersjohnnote.txt"
, Ruby sees the first two backslashes as invalid escape sequences, and so ignores the escape character. n
refers to a newline. So, to Ruby, this literal is the same as "C:Usersjohnnote.txt"
. There aren't any file separators in that sequence, since n is a newline, not a backslash followed by the letter n, so File.basename just returns it as it receives it.
If you ask for user input in either a graphical user interface (GUI) or command line interface (CLI), the user entering input needn't worry about Ruby String escape sequences; those only matter for String literals directly in the code. Try it! Type gets
into IRB or Pry, and type or copy a file path, and press Enter, and see how Ruby displays it as a String literal.
On Windows, Ruby accepts paths given using both "/" (File::SEPARATOR) and "\" (File::ALT_SEPARATOR), so you don't need to worry about conversion unless you are displaying it to the user.
You are right withgets
->"C:\Users\john\note.txtn"
. However, in Linux Ruby/RailsFile
norPathname
cannot parse it.
– malmed
Mar 11 at 10:46
@malmed: I'm not on Windows right now, so I can't check, but I'm fairly sure that both File and Pathname should handle "C:\Users\john\note.txt" just fine. I suspect it is the trailing newline (n) that is causing your problem. Use String#chop.
– sondra.kinsey
Mar 13 at 18:05
I'm also not on Windows (but I receive both formats of a path). I don't doubt, that "C:\Users\john\note.txt" is parsed fine on Windows.
– malmed
Mar 14 at 19:55
@malmed Are you saying that you want a user to input a file path into a web application, and then have your app manipulate that path? I'm having a hard time imagining a use case for that. Obviously, you can just use String#split.
– sondra.kinsey
Mar 14 at 20:04
add a comment |
I'm not convinced that you have a problem with your code. I think you have a problem with your test.
Ruby also uses the backslash character for escape sequences in strings, so when you type the String literal "C:Usersjohnnote.txt"
, Ruby sees the first two backslashes as invalid escape sequences, and so ignores the escape character. n
refers to a newline. So, to Ruby, this literal is the same as "C:Usersjohnnote.txt"
. There aren't any file separators in that sequence, since n is a newline, not a backslash followed by the letter n, so File.basename just returns it as it receives it.
If you ask for user input in either a graphical user interface (GUI) or command line interface (CLI), the user entering input needn't worry about Ruby String escape sequences; those only matter for String literals directly in the code. Try it! Type gets
into IRB or Pry, and type or copy a file path, and press Enter, and see how Ruby displays it as a String literal.
On Windows, Ruby accepts paths given using both "/" (File::SEPARATOR) and "\" (File::ALT_SEPARATOR), so you don't need to worry about conversion unless you are displaying it to the user.
I'm not convinced that you have a problem with your code. I think you have a problem with your test.
Ruby also uses the backslash character for escape sequences in strings, so when you type the String literal "C:Usersjohnnote.txt"
, Ruby sees the first two backslashes as invalid escape sequences, and so ignores the escape character. n
refers to a newline. So, to Ruby, this literal is the same as "C:Usersjohnnote.txt"
. There aren't any file separators in that sequence, since n is a newline, not a backslash followed by the letter n, so File.basename just returns it as it receives it.
If you ask for user input in either a graphical user interface (GUI) or command line interface (CLI), the user entering input needn't worry about Ruby String escape sequences; those only matter for String literals directly in the code. Try it! Type gets
into IRB or Pry, and type or copy a file path, and press Enter, and see how Ruby displays it as a String literal.
On Windows, Ruby accepts paths given using both "/" (File::SEPARATOR) and "\" (File::ALT_SEPARATOR), so you don't need to worry about conversion unless you are displaying it to the user.
answered Mar 10 at 8:32
sondra.kinseysondra.kinsey
14910
14910
You are right withgets
->"C:\Users\john\note.txtn"
. However, in Linux Ruby/RailsFile
norPathname
cannot parse it.
– malmed
Mar 11 at 10:46
@malmed: I'm not on Windows right now, so I can't check, but I'm fairly sure that both File and Pathname should handle "C:\Users\john\note.txt" just fine. I suspect it is the trailing newline (n) that is causing your problem. Use String#chop.
– sondra.kinsey
Mar 13 at 18:05
I'm also not on Windows (but I receive both formats of a path). I don't doubt, that "C:\Users\john\note.txt" is parsed fine on Windows.
– malmed
Mar 14 at 19:55
@malmed Are you saying that you want a user to input a file path into a web application, and then have your app manipulate that path? I'm having a hard time imagining a use case for that. Obviously, you can just use String#split.
– sondra.kinsey
Mar 14 at 20:04
add a comment |
You are right withgets
->"C:\Users\john\note.txtn"
. However, in Linux Ruby/RailsFile
norPathname
cannot parse it.
– malmed
Mar 11 at 10:46
@malmed: I'm not on Windows right now, so I can't check, but I'm fairly sure that both File and Pathname should handle "C:\Users\john\note.txt" just fine. I suspect it is the trailing newline (n) that is causing your problem. Use String#chop.
– sondra.kinsey
Mar 13 at 18:05
I'm also not on Windows (but I receive both formats of a path). I don't doubt, that "C:\Users\john\note.txt" is parsed fine on Windows.
– malmed
Mar 14 at 19:55
@malmed Are you saying that you want a user to input a file path into a web application, and then have your app manipulate that path? I'm having a hard time imagining a use case for that. Obviously, you can just use String#split.
– sondra.kinsey
Mar 14 at 20:04
You are right with
gets
-> "C:\Users\john\note.txtn"
. However, in Linux Ruby/Rails File
nor Pathname
cannot parse it.– malmed
Mar 11 at 10:46
You are right with
gets
-> "C:\Users\john\note.txtn"
. However, in Linux Ruby/Rails File
nor Pathname
cannot parse it.– malmed
Mar 11 at 10:46
@malmed: I'm not on Windows right now, so I can't check, but I'm fairly sure that both File and Pathname should handle "C:\Users\john\note.txt" just fine. I suspect it is the trailing newline (n) that is causing your problem. Use String#chop.
– sondra.kinsey
Mar 13 at 18:05
@malmed: I'm not on Windows right now, so I can't check, but I'm fairly sure that both File and Pathname should handle "C:\Users\john\note.txt" just fine. I suspect it is the trailing newline (n) that is causing your problem. Use String#chop.
– sondra.kinsey
Mar 13 at 18:05
I'm also not on Windows (but I receive both formats of a path). I don't doubt, that "C:\Users\john\note.txt" is parsed fine on Windows.
– malmed
Mar 14 at 19:55
I'm also not on Windows (but I receive both formats of a path). I don't doubt, that "C:\Users\john\note.txt" is parsed fine on Windows.
– malmed
Mar 14 at 19:55
@malmed Are you saying that you want a user to input a file path into a web application, and then have your app manipulate that path? I'm having a hard time imagining a use case for that. Obviously, you can just use String#split.
– sondra.kinsey
Mar 14 at 20:04
@malmed Are you saying that you want a user to input a file path into a web application, and then have your app manipulate that path? I'm having a hard time imagining a use case for that. Obviously, you can just use String#split.
– sondra.kinsey
Mar 14 at 20:04
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55070700%2fhow-to-obtain-basename-in-ruby-from-the-given-file-path-in-unix-or-windows-forma%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Note:
"C:U".chars #=> ["C", ":", "U"]
.– Cary Swoveland
Mar 8 at 20:54
1
@CarySwoveland Further note "note" is treated as new line character (
n
) ote.txt.– engineersmnky
Mar 8 at 21:19