IEnumerable
IEnumerable

Reputation: 3790

Get file extension with a file that has multiple periods

Getting the file extension in C# is very simple,

FileInfo file = new FileInfo("c:\\myfile.txt");
MessageBox.Show(file.Extension); // Displays '.txt'

However I have files in my app with multiple periods.

FileInfo file = new FileInfo("c:\\scene_a.scene.xml");
MessageBox.Show(file.Extension); // Displays '.xml'

I want to be able to extract the .scene.xml portion of the name.

Update
The extension should also include the initial .

How can I get this from FileInfo?

Upvotes: 8

Views: 7792

Answers (5)

drzaus
drzaus

Reputation: 24994

Continue grabbing the extension until there aren't anymore:

var extensions = new Stack<string>(); // if you use a list you'll have to reverse it later for FIFO rather than LIFO
string filenameExtension;
while( !string.IsNullOrWhiteSpace(filenameExtension = Path.GetExtension(inputPath)) )
{
    // remember latest extension
    extensions.Push(filenameExtension);
    // remove that extension from consideration
    inputPath = inputPath.Substring(0, inputPath.Length - filenameExtension.Length);
}
filenameExtension = string.Concat(extensions); // already has preceding periods

Upvotes: 1

Joe Johnston
Joe Johnston

Reputation: 2936

Old I know. Discussions about best practices aside you can do it like this: Linebreaks added for readability.

"." + Path.GetFileNameWithoutExtension(
           Path.GetFileNameWithoutExtension("c:\\scene_a.scene.xml")
      ) 
+ "." +Path.GetExtension("c:\\scene_a.scene.xml")

Is it the best way? I don't know but I do know it works in a single line. :) enter image description here

Upvotes: 0

Jignesh Thakker
Jignesh Thakker

Reputation: 3698

Try,

IO.Path.GetExtension("c:\\scene_a.scene.xml");

Ref. System.IO.Path.GetExtension

If you want .scene.xml then try this,

 FileInfo file = new FileInfo("E:\\scene_a.scene.xml");
 MessageBox.Show(file.FullName.Substring(file.FullName.IndexOf(".")));

Upvotes: 1

Kirill Polishchuk
Kirill Polishchuk

Reputation: 56162

You can use this regex to extract all characters after dot symbol:

\..*

var result = Regex.Match(file.Name, @"\..*").Value;

Upvotes: 11

Daniel James Bryars
Daniel James Bryars

Reputation: 4621

The .xml is the extension the filename is scene_a.scene

If you want to extract scene.xml. You'll need to parse it yourself.

Something like this might do what you want (you'll need to add more code to check for conditions where there isn't a . in the name at all.):

String filePath = "c:\\scene_a.scene.xml";

            String myIdeaOfAnExtension = String.Join(".", System.IO.Path.GetFileName(filePath)
                .Split('.')
                .Skip(1));

Upvotes: 1

Related Questions