c# Шпаргалка для работы с папками и подпапками
Либо в коде напишите слово DirectoryInfo, затем подведите на него курсор и нажмите правую кнопку мыши, появиться меню, теперь выполните действия как на картинке ниже.

Пространство имён System.IO содержит большое количество типов для работы с файлами и папками. Одним из таких типов является класс DirectoryInfo, работа с которым будет рассмотрена в этой статье.
Для проверки кода было создано обычное Windows Forms приложение. После чего на форму была помещена кнопка, при нажатии на которую выполняется одно из ниже описанных действий. Всё это делать не нужно, это лишь пояснение, почему все куски кода расположены в обработчике события Button.Click

Работа с папками
Перед тем, как выполнить какое-либо действие с папкой или подпапкой, желательно выполнить проверку на существование данной папки. Для этого можно использовать метод Exists, который позволит сократить количество возможных исключений, а так же защитит уже существующую папку, с таким же именем, от перезаписи.

Как получить полный путь к папке?

Как переименовать папку?

Как удалить папку?
Данный пример можно использовать, если требуется удалить пустую папку, не содержащую в себе других подпапок и файлов.
Пример удаление папки с подпапками или файлами приведен ниже.
Работа с подпапками

Создание нескольких подпапок
В данном примере создается 5 подпапок

Как удалить папку с подпапками?
Если основная папка содержит внутри себя какие-либо подпапки или файлы, то вместо удаления возникнет исключение.

Чтобы исключение не возникало, нужно передать в метод значение — true.
Как переименовать папку / каталог в C #?
Directory.Move не работает, поскольку папка (: \ temp \ Torename) уже существует.
Я ищу решение, которое не предполагает создания временной папки. У меня есть это решение: перейти во временную папку (уникальное имя), например, c: \ temp \ TorenameTemp Переместить из временной папки в новую папку. например, c: \ temp \ ToRename. Проблема в том, что моя папка может стать очень большой, и ее перемещение может занять некоторое время. Мне нравится решение Windows Explorer, в котором пользователь переименовывает на месте независимо от размера.
спасибо за ваше время.
Вы пытаетесь изменить регистр существующей папки? — SLaks
Было бы проще создать каталог с правильным именем? — Mark Byers
SLaks: Да Марк: Да, я бы хотел, но у нас нет контроля над пользователем, и информация сохраняется на диске, поэтому мне нужно решить эту проблему — mas_oz2k1
6 ответы
Файлы не будут перемещены, если вы не переместите их на другой том. Если место назначения находится на том же томе, изменится только имя каталога.
Это решение будет использоваться против сетевого диска. (\\ сервер \ MyShare \ dir1) — mas_oz2k1
Пока громкость такая же, все будет в порядке. — Алексей Полховский
Directory.Move не масштабируется с размером каталога (если вы не копируете на другой диск), поэтому нет ничего плохого в том, чтобы вызвать его дважды.
2020 Решение: Вот мой метод безопасного переименования каталога.
ответ дан 02 апр.
Из моих тестов, если oldDirectory.Parent == null, я бы просто установил newDirectory на newFolderName. Это значение равно NULL, если это так, т.е. «C: \\» и newFolderName будут разными дисками. Дочерняя папка «C: \\» будет иметь .Parent «C: \\» и попадет во вторую логическую ветвь, для которой нужен метод Path.Combine. — КАНДИМАН
Вот как это можно сделать:
Первый параметр — это текущий каталог, второй параметр — новое имя каталога.

Этот образец находится на VB.NET. В C #, естественно, нет пространства имен для «My» и, к сожалению, нет альтернативы ему. Вам нужно будет добавить ссылку Microsoft.VisualBasic в свой проект и импортировать пространство имен FileIO под ним в класс, в котором вы хотите использовать эквивалентный оператор, «FileSystem.RenameDirectory (« c: \ temp \ Torename »,« ToRename » ); «. Надеюсь это поможет! 🙂 — Джефф
Осмотревшись в поисках полного решения, я заключил в этот служебный метод все советы / опасения.
Вы можете вызвать это простым:
В методе RenameDirectory содержится полный список всех возможных исключений, согласно тому, что я нашел в документации MSDN. Вы можете упростить их до одного блока try-catch (возможно, не рекомендуется) или изменить способ обработки исключений, но это должно помочь вам. Я также включил третий необязательный параметр, который позволяет вам подавлять исключения, если вы хотите, что просто вернет false вместо того, чтобы генерировать исключение. По умолчанию установлено значение false (т.е. не подавляет исключения).
Я не пробовал каждый путь для тестирования, но я был бы ОЧЕНЬ осторожен при переименовании диска, например «C: \» в «E: \». Вероятно, это вызовет исключение . но я не тестировал. 🙂
В целом, просто скопируйте / вставьте это решение и, возможно, удалите некоторые комментарии / ссылки на исследования, и оно будет работать.
Переименование файлов
Как сделать такое задание: Перед каждым именем файла (regular file) вставить его номер (1, 2, 3 и т. д.). Номер выставляется в соответствии с тем, в каком порядке выдает результаты функция FindFirstFile, FindNextFile.
Смог сделать только это:
А как переименовывать файлы не понимаю
Для переименования файлов есть сишная функция rename()
Но учтите, что переименовывать файлы внутри цикла FindFirstFile / FindNextFile нельзя. Иначе цикл будет находить новые файлы.
Вам нужно в этом цикле сложить все имена файлов в массив, вызвать FindClose() , а потом пробежаться по этому массиву и переименовать файлы
Как переименовать папку в C#, которая в настоящее время открыта проводником windows
при переименовании папки в C# System.IO.Directory.Move закидываем System.IO.IOException (сообщение «доступ запрещен»), если эта папка или любая подпапка в настоящее время открыта окном проводника (Windows 7). Использование командной строки RENAME тоже не удается. Использование второго проводника windows успешно.
ошибка сохраняется даже после сворачивания родительской папки (или ее родителей). На самом деле конкретное окно Проводника должно быть закрыто. Таким образом, проводник, похоже, создает некоторые блокировки, чтобы показать структуру папок и не выпускает их, даже если фактическая папка больше не отображается (что является чистым nonsens IMO).
есть ли способ переименовать папку (в программе, например, с помощью C#), которая в настоящее время отображается (или была видна, см. выше) в окне проводника?
обновление
нашел способ, как описано в моем собственном ответе на этот вопрос (см. ниже), используя SHFileOperation() . Однако это решение не очень осуществимо (см. Также ниже).
3 ответов
я использовал монитор API v2 от Rohitab для мониторинга вызовов Windows API.
при изменении имени каталога с D:\test to D:\abc данный вызов был зарегистрирован:
копание дальше в вывод монитора показывает некоторые собственные вызовы:

как вы можете видеть, они не используют MoveFile , вместо этого, они используют NtOpenFile С FILE_OPEN_FOR_BACKUP_INTENT и другие, чтобы открыть оригинальный каталог, затем звоните NtSetInformationFile С новым именем каталога и флаг FileRenameInformation что документально здесь.
к сожалению, это все вызовы ядра.
вы можете получить дескриптор каталога в C / C++ из пользовательского режима, например:
но тогда вам все равно нужна альтернатива пользовательского режима для NtSetInformationFile -звоните.
некоторые опции для продолжения (упорядоченные по сложности):
- посмотреть, если вы можете использовать интерфейс оболочки ITransferSource::RenameItem или найти готовую к использованию функцию оболочки
- углубитесь в решение пользовательского режима и попробуйте найти альтернативу NtSetInformationFile
- напишите драйвер, содержащий IOCTL, который делает эти вещи в режиме ядра и вызовите DeviceIoControl из C#.
обновление
кажется SHFileOperation функция делает все вышеперечисленное, как найдено OP.
оставим этот ответ онлайн, потому что он может показать другим, как отлаживать подобные проблемы и получать ценные указатели.
поэтому я отвечаю на свой вопрос после некоторого дальнейшего исследования..