string path = "C:/folder1/folder2/file.txt";
Jakich obiektów lub metod mógłbym użyć, aby dać mi wynik folder2
?
string path = "C:/folder1/folder2/file.txt";
Jakich obiektów lub metod mógłbym użyć, aby dać mi wynik folder2
?
Odpowiedzi:
Prawdopodobnie użyłbym czegoś takiego:
string path = "C:/folder1/folder2/file.txt";
string lastFolderName = Path.GetFileName( Path.GetDirectoryName( path ) );
Wewnętrzne wywołanie do GetDirectoryName
zwróci pełną ścieżkę, a zewnętrzne wywołanie do GetFileName()
zwróci ostatni składnik ścieżki - która będzie nazwą folderu.
To podejście działa niezależnie od tego, czy ścieżka rzeczywiście istnieje. Takie podejście opiera się jednak na ścieżce początkowo kończącej się nazwą pliku. Jeśli nie wiadomo, czy ścieżka kończy się nazwą pliku lub folderu - wymaga to sprawdzenia rzeczywistej ścieżki, aby sprawdzić, czy plik / folder istnieje najpierw w lokalizacji. W takim przypadku odpowiedź Dana Dimitru może być bardziej odpowiednia.
Prosty i czysty. Używa tylko System.IO.FileSystem
- działa jak urok:
string path = "C:/folder1/folder2/file.txt";
string folder = new DirectoryInfo(path).Name;
file.txt
, a niefolder2
Użyłem tego fragmentu kodu, aby uzyskać katalog ścieżki, gdy nazwa pliku nie zawiera ścieżki:
na przykład „c: \ tmp \ test \ visual”;
string dir = @"c:\tmp\test\visual";
Console.WriteLine(dir.Replace(Path.GetDirectoryName(dir) + Path.DirectorySeparatorChar, ""));
Wynik:
wizualny
Ważne jest również, aby pamiętać, że podczas pobierania listy nazw katalogów w pętli DirectoryInfo
klasa jest inicjalizowana raz, co pozwala tylko na pierwsze wywołanie. Aby ominąć to ograniczenie, upewnij się, że używasz zmiennych w swojej pętli do przechowywania nazw poszczególnych katalogów.
Na przykład ten przykładowy kod zapętla listę katalogów w dowolnym katalogu nadrzędnym, dodając jednocześnie każdy znaleziony katalog do nazwy wewnątrz listy ciągów znaków:
[DO#]
string[] parentDirectory = Directory.GetDirectories("/yourpath");
List<string> directories = new List<string>();
foreach (var directory in parentDirectory)
{
// Notice I've created a DirectoryInfo variable.
DirectoryInfo dirInfo = new DirectoryInfo(directory);
// And likewise a name variable for storing the name.
// If this is not added, only the first directory will
// be captured in the loop; the rest won't.
string name = dirInfo.Name;
// Finally we add the directory name to our defined List.
directories.Add(name);
}
[VB.NET]
Dim parentDirectory() As String = Directory.GetDirectories("/yourpath")
Dim directories As New List(Of String)()
For Each directory In parentDirectory
' Notice I've created a DirectoryInfo variable.
Dim dirInfo As New DirectoryInfo(directory)
' And likewise a name variable for storing the name.
' If this is not added, only the first directory will
' be captured in the loop; the rest won't.
Dim name As String = dirInfo.Name
' Finally we add the directory name to our defined List.
directories.Add(name)
Next directory
Poniższy kod pomaga uzyskać tylko nazwę folderu
public ObservableCollection items = new ObservableCollection (); próbować { string [] folderPaths = Directory.GetDirectories (stemp); items.Clear (); foreach (łańcuchy s w folderze Paths) { items.Add (new gridItems {foldername = s.Remove (0, s.LastIndexOf ('\\') + 1), folderpath = s}); } } catch (wyjątek a) { } klasa publiczna gridItems { nazwa publiczna ciąg foldername {get; zestaw; } public string folderpath {get; zestaw; } }
Jest to brzydkie, ale unika alokacji:
private static string GetFolderName(string path)
{
var end = -1;
for (var i = path.Length; --i >= 0;)
{
var ch = path[i];
if (ch == System.IO.Path.DirectorySeparatorChar ||
ch == System.IO.Path.AltDirectorySeparatorChar ||
ch == System.IO.Path.VolumeSeparatorChar)
{
if (end > 0)
{
return path.Substring(i + 1, end - i - 1);
}
end = i;
}
}
if (end > 0)
{
return path.Substring(0, end);
}
return path;
}