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;
file.txt
และไม่ใช่folder2
DirectoryInfoทำหน้าที่ดึงชื่อไดเรกทอรี
string my_path = @"C:\Windows\System32";
DirectoryInfo dir_info = new DirectoryInfo(my_path);
string directory = dir_info.Name; // System32
ฉันใช้โค้ดนี้เพื่อรับไดเรกทอรีสำหรับเส้นทางเมื่อไม่มีชื่อไฟล์อยู่ในเส้นทาง:
ตัวอย่างเช่น "c: \ tmp \ test \ visual";
string dir = @"c:\tmp\test\visual";
Console.WriteLine(dir.Replace(Path.GetDirectoryName(dir) + Path.DirectorySeparatorChar, ""));
เอาท์พุท:
ภาพ
var fullPath = @"C:\folder1\folder2\file.txt";
var lastDirectory = Path.GetDirectoryName(fullPath).Split('\\').LastOrDefault();
สิ่งสำคัญคือต้องทราบว่าในขณะที่รับรายชื่อไดเรกทอรีในลูป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
รหัสด้านล่างช่วยในการรับชื่อโฟลเดอร์เท่านั้น
รายการ ObservableCollection สาธารณะ = ใหม่ ObservableCollection (); ลอง { string [] folderPaths = Directory.GetDirectories (stemp); items.Clear (); foreach (สตริง s ใน folderPaths) { items.Add (gridItems ใหม่ {foldername = s.Remove (0, s.LastIndexOf ('\\') + 1), folderpath = s}); } } จับ (ยกเว้น a) { } รายการระดับสาธารณะ { ชื่อเล่นสตริงสาธารณะ {รับ; ตั้ง; } สตริงเส้นทางสาธารณะ {รับ; ตั้ง; } }
นี่น่าเกลียด แต่หลีกเลี่ยงการจัดสรร:
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;
}