Re: Remove filename from path

2014-09-25 Thread monarch_dodra via Digitalmars-d-learn
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

2014-09-25 Thread Jay Norwood via Digitalmars-d-learn

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

2014-09-25 Thread Jay Norwood via Digitalmars-d-learn

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

2014-09-24 Thread Suliman via Digitalmars-d-learn

What is the best way to remove file name from full path?

string path = thisExePath()



Re: Remove filename from path

2014-09-24 Thread monarch_dodra via Digitalmars-d-learn

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

2014-09-24 Thread Suliman via Digitalmars-d-learn

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

2014-09-24 Thread Suliman via Digitalmars-d-learn
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

2014-09-24 Thread ketmar via Digitalmars-d-learn
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

2014-09-24 Thread monarch_dodra via Digitalmars-d-learn

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

2014-09-24 Thread monarch_dodra via Digitalmars-d-learn

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

2014-09-24 Thread ketmar via Digitalmars-d-learn
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

2014-09-24 Thread monarch_dodra via Digitalmars-d-learn
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

2014-09-24 Thread ketmar via Digitalmars-d-learn
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

2014-09-24 Thread Ali Çehreli via Digitalmars-d-learn

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