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()
вернет последний компонент пути, который будет именем папки.
Этот подход работает, действительно ли путь существует. Однако этот подход полагается на путь, первоначально заканчивающийся на имя файла. Если неизвестно, заканчивается ли путь в имени файла или имени папки, то для этого требуется, чтобы вы проверяли фактический путь, чтобы увидеть, существует ли файл/папка в месте сначала. В этом случае ответ Дэн Димитру может быть более уместным.
Попробуйте следующее:
string filename = @"C:/folder1/folder2/file.txt";
string FolderName = new DirectoryInfo(System.IO.Path.GetDirectoryName(filename)).Name;
Простой и чистый. Использует только System.IO.FileSystem
- работает как шарм:
string path = "C:/folder1/folder2/file.txt";
string folder = new DirectoryInfo(path).Name;
Я использовал этот фрагмент кода, чтобы получить каталог для пути, если в пути нет имени файла:
например, "c:\tmp\test\visual";
string dir = @"c:\tmp\test\visual";
Console.WriteLine(dir.Replace(Path.GetDirectoryName(dir) + Path.DirectorySeparatorChar, ""));
Вывод:
визуальная
DirectoryInfo выполняет работу по удалению имени каталога
string my_path = @"C:\Windows\System32";
DirectoryInfo dir_info = new DirectoryInfo(my_path);
string directory = dir_info.Name; // System32
var fullPath = @"C:\folder1\folder2\file.txt";
var lastDirectory = Path.GetDirectoryName(fullPath).Split('\\').LastOrDefault();
Ниже код помогает получить только имя папки
public ObservableCollection items = new ObservableCollection(); try { string[] folderPaths = Directory.GetDirectories(stemp); items.Clear(); foreach (string s in folderPaths) { items.Add(new gridItems { foldername = s.Remove(0, s.LastIndexOf('\\') + 1), folderpath = s }); } } catch (Exception a) { } public class gridItems { public string foldername { get; set; } public string folderpath { get; set; } }
Также важно отметить, что при получении списка имен каталогов в цикле класс DirectoryInfo
инициализируется один раз, что позволяет выполнять только первый вызов. Чтобы обойти это ограничение, убедитесь, что вы используете переменные в вашем цикле для хранения любого отдельного имени каталога.
Например, этот пример кода просматривает список каталогов в любом родительском каталоге, добавляя каждое найденное имя каталога в список строкового типа:
[С#]
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
Это некрасиво, но избегает выделения:
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;
}
// For example:
String[] filePaths = Directory.GetFiles(@"C:\Nouveau dossier\Source");
String targetPath = @"C:\Nouveau dossier\Destination";
foreach (String FileD in filePaths)
{
try
{
FileInfo info = new FileInfo(FileD);
String lastFolderName = Path.GetFileName(Path.GetDirectoryName(FileD));
String NewDesFolder = System.IO.Path.Combine(targetPath, lastFolderName);
if (!System.IO.Directory.Exists(NewDesFolder))
{
System.IO.Directory.CreateDirectory(NewDesFolder);
}
String destFile = System.IO.Path.Combine(NewDesFolder, info.Name);
File.Move(FileD, destFile );
// Try to move
Console.WriteLine("Moved"); // Success
}
catch (IOException ex)
{
Console.WriteLine(ex); // Write error
}
}