Re: Remove filename from path
On Wednesday, 24 September 2014 at 17:15:39 UTC, Ali Çehreli wrote: find() and friends can be used: import std.algorithm; void main() { string path = myFile.doc; string extension = .doc; path = findSplitBefore(path, extension)[0]; assert(path == myFile); } I had thought of that, but then you might get in trouble with something like: string path = myPath.doc.old And three retro()s make one modern(): :p import std.algorithm; import std.range; void main() { string path = myFile.doc; string extension = .doc; path = findSplitAfter(path.retro, extension.retro) [1].retro; assert(path == myFile); } Ali That was the next one I had. Except here: - You still run into issues if the extension is *not* .doc (and there happens to be a .doc somewhere in there). - You are paying for a search, when you are only interested in testing a prefix. I had thought of this though: void main() { string path = myFile.doc; string extension = .doc; auto rpath = path.retro(); skipOver(rpath, extension.retro); path = rpath.retro(); assert(path == myFile); } The issue though is that skipOver modifies an rvalue, so it's not as functional-style as I would have liked it. Anyways, the conclusion here (IMO), is that to manipulate paths, use std.path.
Re: Remove filename from path
On Wednesday, 24 September 2014 at 10:28:05 UTC, Suliman wrote: string path = thisExePath() Seems like dirName in std.path is a good candidate ;) http://dlang.org/phobos/std_path.html#.dirName You'll find many other path manipulation functions there. Thanks! But if I want to strip it, how I can cut it? dirName gives the directory, baseName the filename, stripExtension strips it, so seems like what you want is dirName ~ stripExtension( baseName )
Re: Remove filename from path
On Friday, 26 September 2014 at 03:32:46 UTC, Jay Norwood wrote: On Wednesday, 24 September 2014 at 10:28:05 UTC, Suliman wrote: string path = thisExePath() Seems like dirName in std.path is a good candidate ;) http://dlang.org/phobos/std_path.html#.dirName You'll find many other path manipulation functions there. Thanks! But if I want to strip it, how I can cut it? dirName gives the directory, baseName the filename, stripExtension strips it, so seems like what you want is dirName ~ stripExtension( baseName ) easier than that. Looks like stripExtension handles the whole path. assert (stripExtension(dir/file.ext) == dir/file);
Remove filename from path
What is the best way to remove file name from full path? string path = thisExePath()
Re: Remove filename from path
On Wednesday, 24 September 2014 at 10:11:04 UTC, Suliman wrote: What is the best way to remove file name from full path? string path = thisExePath() Seems like dirName in std.path is a good candidate ;) http://dlang.org/phobos/std_path.html#.dirName You'll find many other path manipulation functions there.
Re: Remove filename from path
string path = thisExePath() Seems like dirName in std.path is a good candidate ;) http://dlang.org/phobos/std_path.html#.dirName You'll find many other path manipulation functions there. Thanks! But if I want to strip it, how I can cut it?
Re: Remove filename from path
I can't understand how to use strip? For example I would like to cut just extension. path = path.stripRight(exe); Error: no overload matches for stripRight(C)(C[] str) if
Re: Remove filename from path
On Wed, 24 Sep 2014 10:35:28 + Suliman via Digitalmars-d-learn digitalmars-d-learn@puremagic.com wrote: I can't understand how to use strip? For example I would like to cut just extension. std.path.setExtension is your friend. signature.asc Description: PGP signature
Re: Remove filename from path
On Wednesday, 24 September 2014 at 10:35:29 UTC, Suliman wrote: I can't understand how to use strip? For example I would like to cut just extension. path = path.stripRight(exe); Error: no overload matches for stripRight(C)(C[] str) if stripExtension would be your friend here. If you want the extension, then extension. As a general rule, everything you need to manipulate paths and filenames is in std.path: http://dlang.org/phobos/std_path.html
Re: Remove filename from path
On Wednesday, 24 September 2014 at 10:35:29 UTC, Suliman wrote: I can't understand how to use strip? For example I would like to cut just extension. path = path.stripRight(exe); Error: no overload matches for stripRight(C)(C[] str) if strip doens't work that way. It simply removes leading/trailing white. There's a version in std.algorithm which is more generic, but it accepts either a predicate, or an element, but not a range. Unfortunately, there is no generic function that allows striping of a specific ending range (though there are ways to either detect it, or strip it from the end). If you want something generic, then: string path = myFile.doc; string extension = .doc; if (path.endsWith(extension)) path = path[0 .. $ - extension.length]; Would work.
Re: Remove filename from path
On Wed, 24 Sep 2014 12:21:40 + monarch_dodra via Digitalmars-d-learn digitalmars-d-learn@puremagic.com wrote: Unfortunately, there is no generic function that allows striping of a specific ending range but for strings we have std.string.chomp. signature.asc Description: PGP signature
Re: Remove filename from path
On Wednesday, 24 September 2014 at 12:29:09 UTC, ketmar via Digitalmars-d-learn wrote: On Wed, 24 Sep 2014 12:21:40 + monarch_dodra via Digitalmars-d-learn digitalmars-d-learn@puremagic.com wrote: Unfortunately, there is no generic function that allows striping of a specific ending range but for strings we have std.string.chomp. I missread that documentation. I thought it removed all characters that can also be found in delim. Power to me.
Re: Remove filename from path
On Wed, 24 Sep 2014 12:39:01 + monarch_dodra via Digitalmars-d-learn digitalmars-d-learn@puremagic.com wrote: I missread that documentation. I thought it removed all characters that can also be found in delim. Power to me. ah, i just found this function (really, less than hour ago), that's why i still remember where it is and what it's doing. ;-) signature.asc Description: PGP signature
Re: Remove filename from path
On 09/24/2014 05:21 AM, monarch_dodra wrote: On Wednesday, 24 September 2014 at 10:35:29 UTC, Suliman wrote: I can't understand how to use strip? For example I would like to cut just extension. path = path.stripRight(exe); Error: no overload matches for stripRight(C)(C[] str) if strip doens't work that way. It simply removes leading/trailing white. There's a version in std.algorithm which is more generic, but it accepts either a predicate, or an element, but not a range. Unfortunately, there is no generic function that allows striping of a specific ending range (though there are ways to either detect it, or strip it from the end). If you want something generic, then: string path = myFile.doc; string extension = .doc; if (path.endsWith(extension)) path = path[0 .. $ - extension.length]; Would work. find() and friends can be used: import std.algorithm; void main() { string path = myFile.doc; string extension = .doc; path = findSplitBefore(path, extension)[0]; assert(path == myFile); } And three retro()s make one modern(): :p import std.algorithm; import std.range; void main() { string path = myFile.doc; string extension = .doc; path = findSplitAfter(path.retro, extension.retro) [1].retro; assert(path == myFile); } Ali