Is there any special character that cannot be a part of the path in Windows or Unix that I can use it as a separator?
what about the delimiter for PATH environment variable? ; for windows, and : for Linux.
Wikipedia helpfully lists the reserved characters for different filesystems. Neither NTFS nor POSIX will accept the null or slash (/) characters in filenames. The slash character is obviously not a good separator, since it's common in POSIX paths, so maybe you could use null.
Of course null isn't suited to all situations (e.g. it isn't usually visible when printed), in which case you might have to use some sort of escaping scheme.
Java, which aims to work across different platforms, doesn't even try to find a common path separator. Instead each platform has its own character, accessible through an API.
Path separator are platform dependent :
For windows, it’s \ and for unix it’s /.
Technically, Unix does allow any character in a folder/filename, except / of course, which would be interpreted as as part of the path.
Windows does only support printable characters and some special characters excluding \ / : * ? " < > |.
In java you can use:
WindowsNTFileSystem
s.split(File.pathSeparator) for windows it will give ; (semicolon)
s.split(File.separator) for windows it will give \ (backward)
Linux
s.split(File.pathSeparator) for windows it will give : (colon)
s.split(File.separator) for windows it will give / (forward)
I would be careful with custom separators because they might break in the future, e.g. if someone uses unicode and your custom separator is part of another character.
Related
I couldn't find whether Julia provides the OS specific char to separate PATH-like strings, such as PATH=c:\windows\systems32;c:\windows;... and similar environment variables in Linux. OS specific because Windows is using ";" and Linux ":". I neither could find a helper function that does the splitting already and just not exposing the separator char. But couldn't find that either.
It's easy enough to define these myself, I was only surprised not to find them.
thanks lot for your help
No, there isn't a path list separator by default. What you can do is
Sys.iswindows() ? ';' : ':'
I was teaching an online course and a student asked me why R only uses / and not \ in file paths when using read.csv and other related functions. I tried looking at the documentation but it didn’t really mention anything about it. Never really thought about it because I use a Mac, and the default in Macs is \, but not so in Windows machines.
I’m not trained in computer science so I was left a bit stumped to answer the question a I’m afraid. Students always ask the darnest things!
Interesting question.
First off, the "forward slash" / is actually more common as it used by Unix, Linux, and macOS.
Second, the "backward slash" \ is actually somewhat painful as it is also an escape character. So whenever you want one, you need to type two in string: "C:\\TEMP".
Third, R on Windows knows this and helps! So you can you use a forward slash whereever you would use a backward slash: "C:/TEMP" works the same!
Fourth, you can have R compute the path for you and it will use use the separator: file.path("some", "dir").
So the short answer: R uses both on Windows and lets you pick whichever you find easier. But remember to use two backward slashes (unless you use the very new R 4.0.0 feature on raw strings which I'll skip for now).
(Note: backslashes as directory folder separators on Macs is a recent innovation.See History of Mac folder separators
I think if you review the history (or look it up if you were not there when it occurred as I was) you will find that Unix (which Linux copied completely) got there first. It preceded either MS-DOS or Macs or last of all Windows. R is a work-alike clone of S which was developed like Unix at Bell Labs.
Mac originally used colons (:) as folder separators (and still won't accept them in file names) and converted to slashes sometime during its long transition to BSD Unix which it licensed from ATT.
Shouldn't the question be: why Microsoft chose to use a backslash?
What is the difference between "C:\Android\sdk" and "C:\Android\sdk\" when adding path in environment variables or any other place?
There is no difference. A trailing backslash (or slash in the case of UNIX) is ignored by the operating system. There are only two uses that I know of. First, dealing with broken programs that incorrectly assume a trailing slash/backslash is present when concatenating the value to another relative path. Second, a very small number of commands (e.g., scp) might assign special meaning to a trailing path delimiter.
The characters * and ? are used as wildcards in pathnames. How does one refer to a filename that has ? as one of its actual characters? For example:
[18]> (wild-pathname-p #p"foo")
NIL
[19]> (wild-pathname-p #p"foo?")
T
So referring to the filename "foo?" cannot be done this way. I tried to escape the ? with a backslash, but that didn't work. I tried going unicode by using \u3f or \u003f, but that didn't work.
How do I refer to a file that contains a wildcard as part of its name: How to probe it, open it, etc.?
It depends on the implementation, but for some, a backslash does in fact work. But because namestrings are strings, to get a string with a backslash in it, you have to escape the backslash with another backslash. So, for example, "foo?" is escaped as "foo\\?", not "foo\?".
Last time I checked, in CLISP, there is no way to refer to files with wildcards in the names. My solution to that is to avoid CLISP.
On my Mac running Mac OS X 10.10.3: Clozure CL, SBCL and LispWorks write a pathname with * like this:
#P"/private/tmp/test.\\*"
They might differ in some other details, though.
SBCL supports (make-pathname :directory "" :name file) to escape a string to a proper pathname.
I want to have slash instead of backslash, because my application communicates with a ftp not allowing backslash as directory-seperator.
Is there any shortcut/configuration without writing my own method?
Stealing #Tejs comment as an answer.
Since GetDirectoryName returns a string, you can simply replace the backslashes with the symbol you prefer:
Path.GetDirectoryName(path).Replace("\\", "/")