从文件路径中删除基本路径

时间:2015-09-23 18:03:38

标签: vb.net

我正在使用OpenFileDialog检索多个文件,并希望从路径中删除基本文件夹。

如果我的用户选择文件夹中的照片(例如:c:\ user \ Username \ Pictures \ Holiday \ Beach),我想删除" C:\ users \ Username \ Pictures \&#34 ;部分来自文件名,以便我留下" Holiday \ Beach \ Photo.jpg"对于每个选定的文件。

编辑:

我希望有类似this的内容,但FolderBrowser也不能选择文件。

4 个答案:

答案 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)

经过长时间的讨论,似乎最好的方法是通过自定义控件。感谢大家的帮助