Множественный выбор из списка для переименования папок

Иметь пользовательскую форму vb.net со списком, установленным на множественный выбор. Это для личного пользования. Список заполняется, когда форма загружается со всеми подпапками, только по имени, в указанной папке. Я хочу добавить префикс к каждой выбранной папке в списке. По умолчанию все папки будут иметь префикс, скажем, X. Так, например, Xfolder1 становится folder1, если выбрано и нажата кнопка отправки (не при изменении списка).

Вот мой код и псевдокод на данный момент. Получение строковых ошибок. Работает только первая подпрограмма, загрузка формы и заполнение списка. Большое спасибо за любую помощь. Здоровье и безопасность для всех во время этой пандемии.

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    For Each folder As String In System.IO.Directory.GetDirectories("D:\TestFolder\")
        ListBox1.Items.Add(Path.GetFileName(folder))
    Next
End Sub

Это псевдокод ofc

Private Sub RenameFolders(sender As Object, e As EventArgs) Handles Button1.Click
    For i = 0 To ListBox1.Items.Count - 1         
        If Prefix Exists Then
            FileIO.FileSystem.RenameDirectory(Prefix & FolderName, FolderName)
        Else
            FileIO.FileSystem.RenameDirectory(FolderName, Prefix & FolderName)
        End If
    Next
End Sub

Что выше и много исследований. Проблема может быть связана с тем, являются ли мои строки полным путем или просто именем папки. Listbox возвращает имена папок, но это то, что возвращает код? Очень смущенный.

Привет. Извините за отсутствие ясности. Поскольку список заполняется при загрузке, он покажет текущее состояние папок. Это может быть Xfolder1, folder2, xfolder3 и т. д. Это будут имена папок, существующие в настоящее время.

Другой способ взглянуть на это.

Выбор папок удалит любой префикс из всех выбранных при нажатии кнопки отправки. Невыбор папок добавит префикс ко всем невыбранным при нажатии кнопки отправки.

Если xfolder1 появляется в списке и выбран, он становится folder1. Если xfolder1 появляется в списке и НЕ выбран, он остается xfolder1. Если папка1 появляется в списке и выбрана, она остается папкой1. Если папка1 появляется в списке, но НЕ выбрана, она изменяется на xfolder1

Я надеюсь, что это имеет больше смысла?

Ваш вопрос довольно запутанный. Вы говорите, что хотите отображать имена папок с префиксом в ListBox, а затем переименовывать фактическую папку, чтобы добавить префикс для выбранных, когда пользователь нажимает Button? Если так, вы пытаетесь переименовать папки в их исходном местоположении или в другом месте?

jmcilhinney 14.01.2023 04:02

На самом деле, я только что перечитал второй фрагмент кода и теперь думаю, что происходит что-то еще. Похоже, что ListBox отображает фактические имена подпапок для одной папки, а затем, когда щелкается Button, вы хотите переключить префикс для этих выбранных папок в другом месте, т.е. добавить префикс, если он не существует, и удалить его если это так. Это верно?

jmcilhinney 14.01.2023 04:18

добавили разъяснения, надеюсь, в качестве редактирования, поскольку комментарии ограничены

Spanish Learner 2 Learner 14.01.2023 05:00

папки остаются в той же папке. Будут последующие операции, которые будут игнорировать любые папки с префиксом X. Таким образом, список служит трем целям: он возвращает все папки, определяет, имеют ли они префикс X или нет, и позволяет выбирать. У тех выбранных, у которых есть префикс X, префикс будет удален. Ко всем невыбранным будет добавлен префикс X (переименование папки), поэтому их можно не учитывать. Все это происходит при отправке.

Spanish Learner 2 Learner 14.01.2023 05:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что я правильно понимаю ваш вопрос, я бы посоветовал вам использовать класс DirectoryInfo. Вы можете создать один для родительской папки, а затем получить массив для подпапок. Затем вы можете привязать этот массив к ListBox и отобразить свойство Name, которое является просто именем папки, при этом имея доступ к свойству FullName, которое является полным путем. У него также есть свойство Exists и метод MoveTo для переименования. Вот как бы я сделал то, о чем вы просите:

Imports System.IO

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim folderPath = Path.Combine(My.Computer.FileSystem.SpecialDirectories.MyDocuments, "Test")
        Dim folder As New DirectoryInfo(folderPath)
        Dim subFolders = folder.GetDirectories()

        With ListBox1
            .DisplayMember = "Name"
            .DataSource = subFolders
        End With
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Const prefix As String = "X"

        For Each selectedSubFolder As DirectoryInfo In ListBox1.SelectedItems
            'This is required to update the Exists property if the folder has been deleted since loading.
            selectedSubFolder.Refresh()

            If selectedSubFolder.Exists Then
                Dim parentFolderPath = selectedSubFolder.Parent.FullName
                Dim folderName = selectedSubFolder.Name

                If folderName.StartsWith(prefix) Then
                    folderName = folderName.Substring(prefix.Length)
                Else
                    folderName = prefix & folderName
                End If

                Dim folderPath = Path.Combine(parentFolderPath, folderName)

                selectedSubFolder.MoveTo(folderPath)
            End If
        Next
    End Sub

End Class

Обратите внимание, что это не обновляет ListBox как есть. Если вы тоже этого хотите, вот как я бы это сделал с добавлением BindingSource:

Imports System.IO

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim folderPath = Path.Combine(My.Computer.FileSystem.SpecialDirectories.MyDocuments, "Test")
        Dim folder As New DirectoryInfo(folderPath)
        Dim subFolders = folder.GetDirectories()

        BindingSource1.DataSource = subFolders

        With ListBox1
            .DisplayMember = "Name"
            .DataSource = BindingSource1
        End With
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Const prefix As String = "X"

        For Each selectedSubFolder As DirectoryInfo In ListBox1.SelectedItems
            'This is required to update the Exists property if the folder has been deleted since loading.
            selectedSubFolder.Refresh()

            If selectedSubFolder.Exists Then
                Dim parentFolderPath = selectedSubFolder.Parent.FullName
                Dim folderName = selectedSubFolder.Name

                If folderName.StartsWith(prefix) Then
                    folderName = folderName.Substring(prefix.Length)
                Else
                    folderName = prefix & folderName
                End If

                Dim folderPath = Path.Combine(parentFolderPath, folderName)

                selectedSubFolder.MoveTo(folderPath)
            End If
        Next

        BindingSource1.ResetBindings(False)
    End Sub

End Class

Обратите внимание, что это все равно не будет обрабатывать данные, но я оставлю это вам, если вы этого хотите. Причина в том, что вы можете выполнить простую сортировку массива DirectoryInfo на Name, но это будет прямая сортировка по алфавиту, которую ListBox уже может делать. Если вам нужна логическая сортировка, как в File Explorer, где фактические числа в именах папок сортируются численно, вам также необходимо использовать функцию Windows APi, которая выходит за рамки этого вопроса. Если вы хотите, см. здесь для получения дополнительной информации.

спасибо за вашу помощь, я понимаю, что забыл указать, если listbox.items(i).selected тогда, поэтому, если выбрана xfolder, переименуйте папку, удалив x. если выбрана папка без префикса x, оставить как есть. Все невыбранные помечаются х. У всех выбранных удален x (при условии, что у них был один)

Spanish Learner 2 Learner 14.01.2023 05:20

@SpanishLearner2Learner, я обновил свой ответ примерами кода.

jmcilhinney 14.01.2023 05:42

Спасибо. Я получаю сообщение об ошибке во время выполнения (компилируется нормально). Необработанное исключение. Переменная объекта или с переменной блока не установлена. У меня была ошибка компилятора, которая была исправлена ​​с помощью Private ReadOnly BindingSource1 As Object, и я изменил путь на свой собственный. Всплывающее окно с ошибкой, форма загружается, но без заполнения списка.

Spanish Learner 2 Learner 14.01.2023 06:02

@SpanishLearner2Learner, нет смысла объявлять переменную Object самостоятельно. Вам нужен настоящий BindingSource, который вы добавите в форму в дизайнере так же, как и другие элементы управления и компоненты.

jmcilhinney 14.01.2023 06:06

Это фантастика. Большое спасибо! Сначала я подумал, что под bindingsource вы имеете в виду источник данных для listbox1, а затем я перечитал ваш комментарий и понял, что это элемент управления, с которым я никогда не сталкивался. Вы, сэр, джентльмен и ученый! Ваше здоровье

Spanish Learner 2 Learner 14.01.2023 06:26

@SpanishLearner2Learner, для протокола, BindingSource — это компонент, а не элемент управления. Элемент управления наследует класс Control, а BindingSource — нет. Компоненты могут быть использованы в дизайнере, например. Timer и Process. Элементы управления являются специализированными компонентами. Предполагается, что BindingSource является единой точкой контакта для связанных данных, позволяя вам в большинстве случаев избегать как источника данных, так и пользовательского интерфейса, а также объединяя функциональные возможности из других мест, таких как CurrencyManager.

jmcilhinney 14.01.2023 06:57

Другие вопросы по теме