Выбор нескольких файлов c
Я понимаю, что уже есть ряд вопросов, очень похожих на это:
Однако ни у кого нет того, что я ищу. Некоторые решения работают только для выбора нескольких файлов, другие — только для нескольких папок. Насколько я знаю, ни один из них не позволяет выбрать смесь обоих одновременно.
Мой вариант использования заключается в том, что мне требуется диалоговое окно для выбора нескольких отдельных файлов и папок, возвращающих их пути, чтобы их можно было заархивировать вместе.
Каков самый быстрый и простой способ реализовать такой диалог в Winforms?
Я знаю, что DotNetZip FolderBrowserDialogEx позволяет выбирать файл ИЛИ папку (загвоздка в том, что вы можете выбрать только один элемент). Вы можете расширить или изменить класс , чтобы изменить это поведение (включить множественный выбор).
@ mdsimps99 Спасибо за предложение. DotNetZip - это библиотека, которую я все равно использую для архивирования. не знал, что у них есть диалоговое окно браузера.
@ mdsimps99 Еще раз спасибо за ваше предложение, однако, посмотрев, я не уверен, что это действительно то, что я ищу. Я искал что-то, что выглядит и ведет себя как OpenFileDialog, а не как FolderBrowserDialog. Если бы можно было сделать так, чтобы можно было выбрать несколько элементов, это могло бы подойти. К сожалению, в этом классе так много вызовов Windows API, что я изо всех сил пытаюсь понять, с чего хотя бы начать включать множественный выбор.
A ComboBox выше ListBoxes позволяет пользователю войти в любую подпапку текущей папки, а Button позволяет пользователю вернуться на один уровень вверх.
Ниже приведен скриншот пользовательского интерфейса и некоторые фрагменты кода (в основном обработчики событий), связанные с реализацией диалогового окна выбора файла И папки, о котором я упоминал в своем комментарии.
Хотя весь код, связанный с навигацией по каталогам и фактическим получением путей к файлам, находится на другом уровне кода (оболочка вокруг API управления версиями), это должно дать вам представление о том, как можно реализовать диалоговое окно выбора файла И папки с несколькими элементами. выберите включенный с точки зрения элементов управления. Простая кнопка, чтобы заархивировать текущий выбор, может вызвать GetSourceSelectedFilePaths (или как вы можете ее назвать), а затем заархивировать все эти пути вместе.
Я подозреваю, что System.IO.Directory класс содержит почти все методы, которые вам понадобятся для обработки стороны навигации по файлу/каталогу.
Это, конечно, не очень эстетично, и я знаю, что вы не заинтересованы в реализации этого самостоятельно, но это, безусловно, возможно (и относительно легко, если вы можете жить с чем-то, что выглядит так). Если бы у меня было больше времени, я бы заменил все эти вызовы API-оболочек вызовами System.IO.Directory методов, чтобы сделать это немного более понятным.
Несмотря на то, что я не использовал какой-либо из предоставленных кодов, я собираюсь принять ответ @mdsimps99, поскольку вопрос был «Какой самый быстрый и простой способ реализовать такой диалог в Winforms?» И его ответ было то, что я должен свернуть свой собственный (к сожалению).
Тем не менее, я думал, что опубликую свое далеко не идеальное решение для полноты картины.
У меня не было времени сделать то, что я хотел, и создать собственное решение, которое полностью эмулирует OpenFileDialog. Поэтому вместо этого я создал «SelectPathsDialog», который находится между моей основной программой и OpenFileDialog (и FolderBrowserDialog).
Это очень просто:
Кнопка «Добавить файлы» открывает диалоговое окно OpenFileDialog и добавляет выбранные файлы в список. Кнопка «Добавить папки» открывает диалоговое окно FolderBrowserDialog и добавляет выбранную папку в список.
Он отражает все общедоступные свойства, которые я уже использовал из OpenFileDialog. Это означает, что в моей основной программе я мог легко заменить все вызовы «OpenFileDialog» на «SelectPathsDialog», и он работал правильно.
Я также добавил свойства для включения или отключения соответствующих кнопок, если мне нужно, например, разрешить только выбор файлов.
Поскольку я планирую улучшить его в будущем, я использовал сторонний элемент управления ObjectListView, поскольку он гораздо более универсален, чем стандартный ListView.
Как я говорю. Это не идеально. Но на данный момент он выполняет свою работу, и я всегда могу вернуться к нему позже, когда время не будет таким сильным.
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Отображает диалоговое окно, позволяющее пользователю открыть файл. Этот класс не наследуется.
Свойства
Получает или задает значение, указывающее, добавляет ли диалоговое окно открытия или сохранения файла расширение к имени файла автоматически, если пользователь опустил расширение.
Получает или задает значение, указывающее, отображает ли диалоговое окно открытия или сохранения файла предупреждение, если пользователь указал несуществующее имя файла.
Получает или задает значение, указывающее, отображается ли предупреждение, если пользователь вводит неверный путь или имя файла.
Получает или задает список настраиваемых расположений для диалоговых окон.
Получает или задает строковое значение, которое определяет расширение, используемое по умолчанию для фильтрации списка отображаемых файлов.
Получает или задает значение, указывающее, что диалоговое окно возвращает местоположение файла, на который указывает ярлык, или местоположение файла ярлыка (LNK-файла).
Получает или задает строку, содержащую полный путь к файлу, выбранному в диалоговом окне открытия или сохранения файла.
Получает массив, содержащий имена всех выбранных файлов.
Получает или задает строку фильтра, определяющую, какие типы файлов отображаются в диалоговом окне OpenFileDialog или SaveFileDialog.
Получает или задает индекс фильтра, выбранного в настоящий момент в диалоговом окне открытия или сохранения файла.
Получает или задает начальный каталог, отображаемый диалоговым окном открытия или сохранения файла.
Получает или задает параметр, показывающий, позволяет ли диалоговое окно OpenFileDialog пользователям выбирать несколько файлов.
Возвращает общие флаги диалогового окна Win32, используемые диалогами файлов для инициализации.
Получает или задает значение, указывающее, установлен ли окном OpenFileDialog флажок "только чтение".
Это свойство не реализовано.
Получает строку, содержащую только имя выбранного файла.
Получает массив, содержащий по одному безопасному имени для каждого выбранного файла.
Получает или задает значение, указывающее, имеется ли в диалоговом окне OpenFileDialog флажок "только чтение".
Получает или задает объект, связанный с диалоговым окном. Таким образом, обеспечивает возможность присоединить к диалоговому окну произвольный объект.
Получает или задает текст строки заголовка диалогового окна открытия или сохранения файла.
Возвращает или задает значение, указывающее, принимает ли диалоговое окно только допустимые имена файлов Win32.
Определение каталога по умолчанию
Первоначальный каталог используемый классом OpenFileDialog уже определен в Windows, но используя свойство InitialDirectory, его можно переопределить. Обычно, Вы будете определять это значение специально для пользователя, всего приложения или, возможно, как каталог, который был использован с последний раз. Вы можете его определить как путь в формате строки, вот так:
В этом случае, я использовал путь к папке "Мои Документы", но обратите внимание на перечисление SpecialFolder - оно содержит множество интересных путей. Если хотите изучить полный список SpecialFolder, воспользуйтесь этой статьей MSDN.
Комментарии
На следующем рисунке показана OpenFileDialog Windows Vista.
Начиная с Windows Vista, в диалоговых окнах открытия и сохранения файлов есть панель "Избранные ссылки" в левой части диалогового окна, которая позволяет пользователю быстро перейти в другое расположение. Эти ссылки называются пользовательскими местами. Используйте свойство, CustomPlaces чтобы задать этот список ссылок.
Методы
Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для взаимодействия с удаленным объектом.
Освобождает все ресурсы, занятые модулем Component.
Освобождает неуправляемые ресурсы, используемые объектом Component, а при необходимости освобождает также управляемые ресурсы.
Определяет, равен ли указанный объект текущему объекту.
Служит хэш-функцией по умолчанию.
Извлекает объект обслуживания во время существования, который управляет политикой времени существования данного экземпляра.
Возвращает объект, представляющий службу, предоставляемую классом Component или классом Container.
Возвращает объект Type для текущего экземпляра.
Определяет процедуру обработки общего диалогового окна, переопределенную, чтобы добавить специальные функции в диалоговое окно файла.
Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.
Создает неполную копию текущего объекта Object.
Создает неполную копию текущего объекта MarshalByRefObject.
Открывает выбранный пользователем файл в режиме "только чтение". Файл задается свойством FileName.
Определяет процедуру окна-владельца, которая переопределяется, чтобы добавить специальные функции для общего диалогового окна.
Восстанавливает заданные по умолчанию значения всех свойств.
Указывает общее диалоговое окно.
Запускает общее диалоговое окно с заданным по умолчанию владельцем.
Запускает общее диалоговое окно с указанным владельцем.
Представляет строковую версию этого объекта.
В итоге
Наверняка Вы обратили внимание на то, что использование OpenFileDialog в WPF является очень простым, к тому же, данный механизм делает большую часть работы за Вас. Но заметьте, что в данном примере, для экономии места в коде, я не посвятил ни одной строки обработке исключений. При работе с файлами, и в целом при работе с входом-выходом, Вам всегда следует опасаться исключений, так как они легко могут появиться при работе с заблокированным файлом, несуществующим путем или другими.
Is your preferred language not on the list? Click here to help us translate this article into your language!
События
Возникает при удалении компонента путем вызова метода Dispose().
Происходит при нажатии пользователем кнопки Открыть или Сохранить в диалоговом окне файла.
Происходит при нажатии пользователем кнопки справки в общем диалоговом окне.
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Представляет общее диалоговое окно, позволяющее пользователю задать имя файла для одного или нескольких открываемых файлов.
Комментарии
Этот класс позволяет проверить, существует ли файл и открыть его. Свойство ShowReadOnly определяет, отображается ли в диалоговом окне флажок только для чтения. Свойство ReadOnlyChecked указывает, установлен ли флажок только для чтения.
Большая часть основных функциональных возможностей этого класса находится в FileDialog классе.
В операционной системе справа налево задайте свойство содержащей формы RightToLeft , чтобы RightToLeft.Yes локализовать кнопки "Имя файла", "Открыть" и "Отмена " диалогового окна. Если свойство не задано RightToLeft.Yes, вместо этого используется английский текст.
Если вы хотите предоставить пользователю возможность выбрать папку вместо файла, используйте FolderBrowserDialog вместо нее.
Несколько файлов
Если Ваше приложение должно поддерживать открытие нескольких файлов или Вы просто хотите понять, как использовать OpenFileDialog для одновременного открытия нескольких файлов, просто включите свойство Multiselect. В следующем примере, мы это с успехом проделали, и, наш дорогой Читатель, собрали в одном все механизмы, рассмотренные в текущей главе (фильтрация, определение каталога по умолчанию):
Если Вы протестируете этот код, то заметите, что выбирать несколько файлов в одном каталоге становится возможным путем удерживания Ctrl или Shift и нажатием мыши. Выбрав их механизм в этом примере просто добавит файлы в элемент ListBox, в цикле по свойству FileNames.
Конструкторы
Инициализирует новый экземпляр класса OpenFileDialog.
Простой пример использования OpenFileDialog
Давайте начнем использование OpenFileDialog без дополнительных опций, с помощью TextBox:
При нажатии на кнопку Open, отображается окно OpenFileDialog. В зависимости от Вашей версии Windows, Вы увидите нечто подобное:
Метод ShowDialog() возвращает логическое nullable значение (может быть true, false либо null). Если пользователь выберет файл и нажмет "Open" результатом будет True, и в этом случае мы попытаемся загрузить файл в элемент TextBox. Мы получили полный путь к выбранному файлу с помощью свойства FileName в OpenFileDialog.
Конструкторы
Инициализирует экземпляр класса OpenFileDialog.
Использование текста XAML
Этот управляемый класс нельзя объявить в XAML.
Свойства
Возвращает или задает значение, определяющее, добавляет ли автоматически диалоговое окно расширение к имени файла, если пользователь опускает данное расширение.
Возвращает или задает значение, указывающее, должен ли этот FileDialog экземпляр автоматически обновлять внешний вид и поведение при запуске в Windows Vista.
Возвращает значение, показывающее, может ли компонент вызывать событие.
Возвращает или задает значение, указывающее, отображается ли в диалоговом окне предупреждение, если пользователь указывает несуществующее имя файла.
Возвращает или задает значение, указывающее, отображает ли диалоговое окно предупреждение, если пользователь указывает несуществующий путь.
Получает или задает GUID, связываемый с этим состоянием диалога. Как правило, состояние, такое как последняя посещенная папка, а также расположение и размер диалогового окна, сохраняется с учетом имени исполняемого файла. При указании GUID приложение может иметь разные сохраняемые состояния для разных версий диалогового окна в том же приложении (например, диалоговое окно импорта и диалоговое окно открытия).
Эта функция недоступна, если приложение не использует стили оформления или если для AutoUpgradeEnabled задано значение false .
Возвращает объект IContainer, который содержит коллекцию Component.
Получает коллекцию пользовательских размещений для этого экземпляра FileDialog.
Возвращает или задает расширение имени файла по умолчанию.
Возвращает или задает значение, указывающее, возвращает ли диалоговое окно расположение файла, представленного ярлыком, или возвращает расположение самого ярлыка (.lnk).
Возвращает значение, указывающее, находится ли данный компонент Component в режиме конструктора в настоящее время.
Возвращает список обработчиков событий, которые прикреплены к этому объекту Component.
Возвращает или задает строку, содержащую имя файла, выбранного в диалоговом окне.
Возвращает имена всех выбранных файлов в диалоговом окне.
Возвращает или задает текущую строку фильтра имен файлов, которая определяет варианты, доступные в поле диалогового окна "Сохранить как файл типа" или "Файлы типа".
Возвращает или задает индекс фильтра, выбранного в настоящий момент в диалоговом окне файла.
Возвращает или задает начальную папку, отображенную диалоговым окном файла.
Возвращает дескриптор экземпляра обработчика Win32 для приложения.
Получает или задает значение, указывающее, можно ли в диалоговом окне выбирать несколько файлов.
Получает значения для инициализации класса FileDialog.
Получает или задает значение, указывающее, установлен ли флажок доступности только для чтения.
Получает или задает значение, указывающее, восстанавливает ли диалоговое окно ранее выбранный каталог в качестве текущего каталога перед закрытием.
Возвращает имя и расширение файла, выбранного в диалоговом окне. Имя файла не включает сведения о пути.
Возвращает массив имен и расширений файлов для всех выбранных в диалоговом окне файлов. Имена файлов не включают сведений о пути.
Возвращает или задает значение, определяющее, отображается ли кнопка Справка в диалоговом окне работы с файлами.
Получает или задает значение, указывающее, имеется ли в диалоговом окне флажок "доступно только для чтения".
Получает или задает ISite объекта Component.
Возвращает или задает значение, определяющее, поддерживает ли диалоговое окно отображение и сохранение файлов, которые содержат несколько расширений имени.
Получает или задает объект, содержащий данные элемента управления.
Возвращает или задает заголовок диалогового окна файла.
Возвращает или задает значение, указывающее, принимает ли диалоговое окно только допустимые имена файлов Win32.
Примеры
В следующем примере показано, как создать файл OpenFileDialog , содержащий имя файла по умолчанию и тип расширения.
События
Возникает, когда пользователь выбирает имя файла, нажав кнопку Открыть в диалоговом окне OpenFileDialog или кнопку Сохранить в диалоговом окне SaveFileDialog.
Окна открытия и сохранения файла представлены классами OpenFileDialog и SaveFileDialog . Они имеют во многом схожую функциональность, поэтому рассмотрим их вместе.
OpenFileDialog и SaveFileDialog имеют ряд общих свойств, среди которых можно выделить следующие:
DefaultExt : устанавливает расширение файла, которое добавляется по умолчанию, если пользователь ввел имя файла без расширения
AddExtension : при значении true добавляет к имени файла расширение при его отсуствии. Расширение берется из свойства DefaultExt или Filter
CheckFileExists : если имеет значение true , то проверяет существование файла с указанным именем
CheckPathExists : если имеет значение true , то проверяет существование пути к файлу с указанным именем
FileName : возвращает полное имя файла, выбранного в диалоговом окне
Filter : задает фильтр файлов, благодаря чему в диалоговом окне можно отфильтровать файлы по расширению. Фильтр задается в следующем формате Название_файлов|*.расширение. Например, Текстовые файлы(*.txt)|*.txt . Можно задать сразу несколько фильтров, для этого они разделяются вертикальной линией |. Например, Bitmap files (*.bmp)|*.bmp|Image files (*.jpg)|*.jpg
InitialDirectory : устанавливает каталог, который отображается при первом вызове окна
Title : заголовок диалогового окна
Отдельно у класса SaveFileDialog можно еще выделить пару свойств:
Чтобы отобразить диалоговое окно, надо вызвать метод ShowDialog() .
Рассмотрим оба диалоговых окна на примере. Добавим на форму текстовое поле textBox1 и две кнопки button1 и button2. Также перетащим с панели инструментов компоненты OpenFileDialog и SaveFileDialog. После добавления они отобразятся внизу дизайнера формы. В итоге форма будет выглядеть примерно так:
Теперь изменим код формы:
По нажатию на первую кнопку будет открываться окно открытия файла. После выбора файла он будет считываться, а его текст будет отображаться в текстовом поле. Клик на вторую кнопку отобразит окно для сохранения файла, в котором надо установить его название. И после этого произойдет сохранение текста из текстового поля в файл.
Всякий раз, когда Вы открываете/закрываете файл в любом приложении Windows, Вы сталкиваетесь примерно с одинаковыми диалоговыми окнами. Причиной этого, конечно же является то, что эти окна являются частью Windows API, а, следовательно, доступны разработчикам на платформе Windows.
Для WPF вы можете найти стандартные диалоговые окна как для сохранения, так и для открытия файлов в пространстве имен Microsoft.Win32. В этой статье мы рассмотрим класс OpenFileDialog, который позволяет легко отображать окно для открытия одного/нескольких файлов.
Методы
Определяет, достаточны ли разрешения для отображения диалогового окна.
Определяет, равен ли указанный объект текущему объекту.
Служит хэш-функцией по умолчанию.
Возвращает объект Type для текущего экземпляра.
Определяет процедуру обработки стандартного диалогового окна открытия или сохранения файла, переопределенную для добавления в диалоговое окно общих функций.
Создает неполную копию текущего объекта Object.
Открывает поток только на чтение для файла, выбранного пользователем с помощью диалогового окна OpenFileDialog.
Создает массив, содержащий один поток только для чтения для каждого файла, выбранного пользователем в диалоговом окне OpenFileDialog.
Восстанавливает для всех свойств OpenFileDialog значения по умолчанию.
RunDialog(IntPtr) вызывается для отображения диалогового окна открытия или сохранения файла в производном классе, таком как OpenFileDialog или SaveFileDialog.
Отображает общее диалоговое окно.
Отображает общее диалоговое окно.
Возвращает строку, представляющую диалоговое окно открытия или сохранения файла.
Фильтрование
Обычно, при выборе файла, пользователь желает ограничить выбор одним или несколькими типами файлов. Например, Word в основном открывает файлы Word (с расширением .doc или .docx), а Блокнот - текстовые файлы (.txt).
Вы можете определить фильтр для диалоговоко окна OpenFileDialog с возможностью выбора ипользователем типов файлов и ограничения файлов, для большей наглядности. Это осуществляется с помощью свойства Filter, которое мы добавим к предыдущему примеру (после инициализации окна):
Заметьте, что теперь окно имеет выпадающий список с возможными для выбора типами файлов, все файлы отображаются в соответствии с выбранным расширением.
На первый взгляд, формат определения фильтра может показаться слегка странным, но в нем представлена удобочитаемая версия для пользователя и другая, для компьютера, который будет в состоянии их "прочитать" и разделить с помощью символа-сепаратора "|". Если Вы хотите определить больше чем один тип (как было в примере), просто добавьте необходимые Вам, с помощью выше введенного сепаратора.
Подводя итог, следующий код означает, что мы присваиваем типу название "Text files (*.txt)" (расширение в скобках - это знак внимания пользователю, он будет знать, какие типы включены в "Text files"), а вторая часть определяет, что будут показаны файлы с расширением .txt:
Конечно же, каждый создаваемый тип может иметь множество расширений. Например, изображения могут быть определены как для JPEG, так и для PNG файлов, вот так:
Просто отделите каждое расширение точкой с запятой во второй части (той, которая для компьютера), а в первой можете отформатировать текст как Вам будет угодно, но, большинство разработчиков пользуются одной и той же нотацией для двух частей, как на примере выше.
Примеры
В следующем примере кода создается OpenFileDialogобъект, задается несколько свойств для определения фильтра расширения файла и поведения диалога, а также отображается диалоговое окно с помощью CommonDialog.ShowDialog метода. В примере требуется форма с помещенной Button на ней ссылкой и ссылкой на System.IO пространство имен, добавленное в него.
Читайте также: