C# How to grep the last word from a directory path

2019-08-28 21:26发布

问题:

I have a program that "greps" out various directory paths from a log text file and prints various results according to the word.

Examples of Directory paths:

  • C:/Documents and Settings/All Users/Desktop/AccessData FTK Imager.lnk

  • C:/Documents and Settings/All Users/Start Menu/Programs/AccessData

  • C:/Documents and Settings/Administrator/Desktop/AccessData FTK Imager.exe:Zone.Identifier

Therefore how can I grep out the file or folder name after the last "/"? This is to help the program to identify between files and folder. Please do take note of the multiple "." and white spaces found within a directory paths. etc "Imager.exe:Zone.Identifier". Therefore it is difficult to use if(!name.contains()".")

Etc. How to get the "AccessData FTK Imager.lnk" or "AccessData" or "AccessData FTK Imager.exe:Zone.Identifier" from the path STRING?!

May someone please advise on the methods or codes to solve this problem? Thanks!

The codes:

if (!token[7].Contains("."))
                {    

                    Console.WriteLine("The path is a folder?");

                    Console.WriteLine(token[7]);

                    Console.WriteLine(actions);

                    MacActions(actions);

                    x = 1;
                } 

回答1:

Use the Path class when working with file paths, and use the File and Directory class when working with actual files and folders.

string str1=@"C:/Documents and Settings/All Users/Desktop/AccessData FTK Imager.lnk";
string str2=@"C:/Documents and Settings/All Users/Start Menu/Programs/AccessData";
string str3=@"C:/Documents and Settings/Administrator/Desktop/AccessData FTK Imager.exe:Zone.Identifier";

Console.WriteLine(Path.GetFileName(str1));
Console.WriteLine(Path.GetFileName(str2));
Console.WriteLine(Path.GetFileName(str3));

outputs:

AccessData FTK Imager.lnk
AccessData
Zone.Identifier <-- it chokes here because of the :

This class operates on strings, as I do not have those particular files and/or folders on my system. Also it's impossible to determine whether AccessData is meant to be a folder or a file without an extension.

I could use some common sense and declare everything with an extension to be a file (Path.GetFileExtension can be used here) and everything else to be a folder.
Or I could just check it the string in question is indeed a file or a folder on my machine using (File.Exists and Directory.Exists respectively).

if (File.Exists(str2))
    Console.WriteLine("It's a file");
else if (Directory.Exists(str2))
    Console.WriteLine("It's a folder");
else
    Console.WriteLine("It's not a real file or folder");


回答2:

Use Path.GetFileName.

The characters after the last directory character in path. If the last character of path is a directory or volume separator character, this method returns String.Empty.



回答3:

This is to help the program to identify between files and folder

There is no way to determine is a path represents a file or folder, unless you access the actual file system. A directory name like 'Foo.exe' would be perfectly valid, and a file with no extension ('Foobar') would be valid too.



回答4:

how about tokenized it with "/" like what you're doing ... and then you'll know that the last token is the file, and whatever before it is the path.



回答5:

You can simply split the whole string by /

e.g.:

string a="C:/Documents and Settings/All Users/Desktop/AccessData FTK Imager.lnk"; string[] words=a.split('/'); int len=words.length; so now words[len] returns the data after last slash(/).. I hope you understand...



回答6:

I guess you only have a string that represents the name of the file, if that is the case you can't really be sure. It's totally ok to have a folder namen something like Folder.doc. So if you don't have access to the actual file system it is hard to check. You can get close though using regular expression like:

(.*\\)(.+)(\..*)

Try it on: http://www.regexplanet.com/simple/index.html If you get any output in group number 3 it's likely that it is a file and not a folder. If you don't get some output try this direct after:

(.*\\)(.+)(\..*)?

That will give you the folder in group 2.