Izzy
Izzy

Reputation: 6876

Remove parts of string

I have the following string

string a = @"\\server\MainDirectory\SubDirectoryA\SubdirectoryB\SubdirectoryC\Test.jpg";

I'm trying to remove part of the string so in the end I want to be left with

string a = @"\\server\MainDirectory\SubDirectoryA\SubdirectoryB";

So currently I'm doing

string b = a.Remove(a.LastIndexOf('\\'));
string c = b.Remove(b.LastIndexOf('\\'));
Console.WriteLine(c);

which gives me the correct result. I was wondering if there is a better way of doing this? because I'm having to do this in a fair few places.

Note: the SubdirectoryC length will be unknown. As it is made of the numbers/letters a user inputs

Upvotes: 1

Views: 194

Answers (5)

Slai
Slai

Reputation: 22896

Some alternatives

string a = @"\\server\MainDirectory\SubDirectoryA\SubdirectoryB\SubdirectoryC\Test.jpg";

var b = Path.GetFullPath(a + @"\..\..");

var c = a.Remove(a.LastIndexOf('\\', a.LastIndexOf('\\') - 1));

but I do find this kind of string extensions generally usefull:

static string beforeLast(this string str, string delimiter)
{
    int i = str.LastIndexOf(delimiter);
    if (i < 0) return str;
    return str.Remove(i);
}

Upvotes: 0

Pikoh
Pikoh

Reputation: 7713

An alternative answer using Linq:

var b = string.Join("\\", a.Split(new string[] { "\\" }, StringSplitOptions.None)
                           .Reverse().Skip(2).Reverse());

Upvotes: 0

Peter B
Peter B

Reputation: 24280

For such repeated tasks, a good solution is often to write an extension method, e.g.

public static class Extensions
{
    public static string ChopPath(this string path)
    {
        // chopping code here
    }
}

Which you then can use anywhere you need it:

var chopped = a.ChopPath();

Upvotes: -1

Tobias Theel
Tobias Theel

Reputation: 3217

Heyho,

if you just want to get rid of the last part. You can use :

var parentDirectory = Directory.GetParent(Path.GetDirectoryName(path));

https://msdn.microsoft.com/de-de/library/system.io.directory.getparent(v=vs.110).aspx

Upvotes: 0

Steve
Steve

Reputation: 216363

There is Path.GetDirectoryName

string a = @"\\server\MainDirectory\SubDirectoryA\SubdirectoryB\SubdirectoryC\Test.jpg";
string b = Path.GetDirectoryName(Path.GetDirectoryName(a));

As explained in MSDN it works also if you pass a directory

....passing the returned path back into the GetDirectoryName method will result in the truncation of one folder level per subsequent call on the result string

Of course this is safe if you have at least two directories level

Upvotes: 8

Related Questions