string path = "C:/folder1/folder2/file.txt";
Які об'єкти чи методи я міг би використати, що дасть мені результат folder2
?
string path = "C:/folder1/folder2/file.txt";
Які об'єкти чи методи я міг би використати, що дасть мені результат folder2
?
Відповіді:
Я, мабуть, використовував щось на кшталт:
string path = "C:/folder1/folder2/file.txt";
string lastFolderName = Path.GetFileName( Path.GetDirectoryName( path ) );
Внутрішній дзвінок до GetDirectoryName
поверне повний шлях, а зовнішній - доGetFileName()
поверне останній компонент шляху - який буде іменем папки.
Цей підхід працює незалежно від існування шляху. Цей підхід, однак, покладається на шлях, який спочатку закінчується на ім'я файлу. Якщо невідомо, закінчується шлях на ім'я файлу чи ім'я папки - тоді потрібно перевірити фактичний шлях, щоб побачити, чи існує файл / папка спочатку в місці розташування. У цьому випадку відповідь Дана Дімітру може бути більш доречною.
Простий і чистий. Тільки використовує System.IO.FileSystem
- працює як шарм:
string path = "C:/folder1/folder2/file.txt";
string folder = new DirectoryInfo(path).Name;
file.txt
, а ніfolder2
Я використав цей фрагмент коду, щоб отримати каталог для шляху, коли в ньому немає імені файлу:
наприклад "c: \ tmp \ test \ visual";
string dir = @"c:\tmp\test\visual";
Console.WriteLine(dir.Replace(Path.GetDirectoryName(dir) + Path.DirectorySeparatorChar, ""));
Вихід:
наочний
Важливо також зазначити, що отримуючи список імен каталогів у циклі, DirectoryInfo
клас одноразово ініціалізується, таким чином дозволяючи здійснювати лише перший виклик. Щоб обійти це обмеження, переконайтеся, що ви використовуєте змінні у своєму циклі для зберігання імен будь-якого окремого каталогу.
Наприклад, цей зразок коду проходить через список каталогів у будь-якому батьківському каталозі, додаючи кожне знайдене ім'я каталогу у списку типу рядка:
[C #]
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
Нижче код допомагає отримати лише ім’я папки
public ObservableCollection items = новий ObservableCollection (); спробуйте { string [] folderPaths = Directory.GetDirectories (степп); items.Clear (); foreach (рядок s у папці Шляхи) { items.Add (нова сіткаItems {ім'я папки = s.Remove (0, s.LastIndexOf ('\\') + 1), папка = s}); } } вилов (виняток a) { } Сітки громадського класу { ім'я папки public string {get; набір; } відкритий папковий рядок папок {get; набір; } }
Це некрасиво, але уникає виділень:
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;
}