我正在使用OpenFileDialog检索多个文件,并希望从路径中删除基本文件夹。
如果我的用户选择文件夹中的照片(例如:c:\ user \ Username \ Pictures \ Holiday \ Beach),我想删除" C:\ users \ Username \ Pictures \&#34 ;部分来自文件名,以便我留下" Holiday \ Beach \ Photo.jpg"对于每个选定的文件。
编辑:
我希望有类似this的内容,但FolderBrowser也不能选择文件。
答案 0 :(得分:0)
最简单的方法是使用Substring()
basePath = OpenFileDialog1.InitialDirectory
If basePath = "" Then
basePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
End If
If path.StartsWith(basePath) Then
path = path.Substring(basePath.Length + 1)
End If
注意:+ 1
用于路径分隔符的长度。
此方法有其局限性,例如,如果基本路径包含斜杠/
作为分隔符(在Windows中有效)或者如果它是UNC路径,该怎么办?最简单的方法是确保您的基本路径始终与从文件对话框返回的路径格式兼容。
实际上,我有一个解决方案,通过将路径分成组件来使这个任务变得微不足道,它也正确地处理/
和\
,它还处理绝对和相对路径,标准路径和UNC路径,但它有1000多行作为库。我还没有准备好分享它。我想说你要么必须以复杂的方式处理这个问题(就像我提到的那样),要么就像我在答案的第一部分写的那样使用一些简单的有限的解决方案#34;
答案 1 :(得分:0)
这是一种新颖的方法,因为它实际上并没有执行字符串替换,但应该可以正常工作。
Function RemoveRoot(ByVal root As String, ByVal target As String) As String
'format the paths first
Dim p As String = String.Join("\", (From t In target.Split(("\").ToCharArray()) Where t <> "" Select t).ToArray())
Dim r As String = String.Join("\", (From t In root.Split(("\").ToCharArray()) Where t <> "" Select t).ToArray())
If p.StartsWith(r) Then Return p.Remove(0, r.Length)
Return target
End Function
答案 2 :(得分:0)
使用.NET Directory类:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Using ofd As New OpenFileDialog()
ofd.Multiselect = True
If ofd.ShowDialog() = Windows.Forms.DialogResult.OK Then
For Each fileName In ofd.FileNames
MessageBox.Show(getFileWithParents(fileName, 2))
Next fileName
End If
End Using
End Sub
Private Function getFileWithParents(filename As String, numberOfParents As Integer) As String
Dim directories As New List(Of String)()
Dim newFilename = filename
Dim hasParent As Boolean = Directory.GetParent(newFilename) IsNot Nothing
While hasParent
Dim dir = Directory.GetParent(newFilename).ToString()
directories.Add(dir)
newFilename = dir
hasParent = Directory.GetParent(newFilename) IsNot Nothing
End While
If directories.Count <= numberOfParents Then
Return filename
Else
Return filename.Replace(directories(numberOfParents), "")
End If
End Function
这允许您指定要返回的父目录的数量,并说明用户何时从父目录数少于指定的目录中选择文件。
答案 3 :(得分:0)
经过长时间的讨论,似乎最好的方法是通过自定义控件。感谢大家的帮助