2015-09-23 4 views
0

Я извлекаю несколько файлов с помощью OpenFileDialog и хотел бы удалить базовую папку из пути.Удалить базовый путь из пути к файлу

Если мой пользователь выбирает фотографии из папки (пример: c: \ user \ Username \ Pictures \ Holiday \ Beach), я хотел бы удалить часть "C: \ users \ Username \ Pictures \" из имени файла , так что я оставляю «Holiday \ Beach \ Photo.jpg» для каждого выбранного файла.

EDIT:

Я надеялся, что-то похожее на this, но FolderBrowser не может выбрать файлы.

+1

Посмотрите на класс Path. https://msdn.microsoft.com/en-us/library/system.io.path(v=vs.110).aspx У этого есть методы, чтобы получить имена файлов и т. д. – Jeremy

+0

Что вы подразумеваете под «базовой папкой», , Вы имеете в виду все, кроме последнего каталога в пути, а также имя файла. Другими словами, если патч «C: \ d1 \ d2 \ d3 \ d4 \ d5 \ d6 \ filename.ext», вы хотите сохранить «d6 \ filename.ext»? – Blackwood

+0

@ Блэквуд см. Мое редактирование. Я забыл добавить эту часть – Adriaan

ответ

0

Использование класса .NET Каталог:

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 

Это позволяет определить, сколько родительских каталогов для возврата, и счета, когда пользователь выбирает файлы из каталога с меньше заданного числа родители.

+0

Я предполагаю, что нет постоянного способа сделать это. Этот код, который я использую с FolderBrowserDialog, удаляет базовый путь: http://pastebin.com/7aaYCJ1V. Я хотел бы, чтобы было похоже на OpenFileDialog – Adriaan

+0

@Adriaan К сожалению, я не тестировал его перед публикацией. Теперь он протестирован и работает. Замените 'MessageBox.Show (result)' на то, что вы хотите сделать с результатом строки. – djv

+0

Этот работает, но, как вы сказали, он извлекает только две родительские папки :) – Adriaan

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+ линии как библиотеки. Я не готов поделиться им. Я хотел сказать, что вам приходится иметь дело с этим сложным способом (как я уже упоминал) или просто использовать какое-то простое ограниченное «решение», как я писал в первой части ответа.

+0

Это метод, который я использую в диалоговом окне FolderBrowser, но как это работает с OpenFileDialog? Как я могу получить BasePath? – Adriaan

+0

openFileDialog1.InitialDirectory как базовый путь? – Pieter21

+0

@Adriaan - by * base folder * Вы имеете в виду папку, в которой открывается диалоговое окно? Потому что, как правило, нет ничего похожего на базовую папку. Его на вас, чтобы он где-то хранился. Мое решение предполагает, что вы где-то сконфигурировали 'basePath'. – miroxlav

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 
0

После долгого обсуждения, кажется, что лучший способ сделать это - через пользовательский элемент управления. Спасибо всем за помощь

Смежные вопросы