Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
7 / 7 / 0
Регистрация: 13.08.2012
Сообщений: 250

Проверить и изменить названия всех файлов в текущей папке и подпапках

02.01.2015, 16:24. Показов 4681. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Работаю в Visual Studio 2012.
Собственно, нужно проверить длину имён всех файлов и сократить названия, если они длиннее 20 символов.
Проверку могу и сам организовать, главное:
1. Как проверить имя всех файлов в текущей папке и всех подпапках.
2. Как изменить имя найденного файла.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.01.2015, 16:24
Ответы с готовыми решениями:

Получение всех имен файлов в папке и во вложенных подпапках
public partial class Form1 : Form { public Form1() { InitializeComponent(); } ...

Получения всех файлов в папке и подпапках игнорируя ошибку с правами доступа
К слову сам вопрос. Как получить все файлы в папке и подпапках игнорирую ошибку с правами доступа или любую другую

Поиск файлов в папке и подпапках
Приветствую всех. Есть папка, в ней много подпапок, в каждой из которых находятся файлы. Мне необходимо найти во всех этих подпапках и...

19
 Аватар для Монфрид
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,246
02.01.2015, 17:08
Цитата Сообщение от InferernumDeus Посмотреть сообщение
1. Как проверить имя всех файлов в текущей папке
C#
1
string [] fileNames= System.IO.Directory.EnumerateFiles("c:\\").ToArray();
Цитата Сообщение от InferernumDeus Посмотреть сообщение
и всех подпапках.
C#
1
string [] dirNames= System.IO.Directory.EnumerateDirectories("c:\\").ToArray();
Цитата Сообщение от InferernumDeus Посмотреть сообщение
. Как изменить имя найденного файла.
C#
1
  System.IO.File.Move("C:\\oldName.txt", @"C:\\newName.txt");
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18297 / 14221 / 5368
Регистрация: 17.03.2014
Сообщений: 28,897
Записей в блоге: 1
02.01.2015, 17:38
Цитата Сообщение от Монфрид Посмотреть сообщение
C#
1
string [] fileNames= System.IO.Directory.EnumerateFiles("c:\\").ToArray();
Непонятно зачем вызывать EnumerateFiles и затем ToArray(), когда можно сразу вызвать GetFiles() который вернет string[].
0
7 / 7 / 0
Регистрация: 13.08.2012
Сообщений: 250
02.01.2015, 17:49  [ТС]
Вы указали расположение "c:\\", а что следует указывать, чтобы принималась папка, где лежит файл программы?
И ещё, не совсем понял, как менять имена нужных файлов по этому массиву.
Наверняка ведь, есть какой-то метод, вызывающий произвольный код напрямую для каждого найденного файла.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18297 / 14221 / 5368
Регистрация: 17.03.2014
Сообщений: 28,897
Записей в блоге: 1
02.01.2015, 17:59
Цитата Сообщение от InferernumDeus Посмотреть сообщение
Вы указали расположение "c:\\", а что следует указывать, чтобы принималась папка, где лежит файл программы?
AppDomain.CurrentDomain.BaseDirectory

Цитата Сообщение от InferernumDeus Посмотреть сообщение
не совсем понял, как менять имена нужных файлов по этому массиву.
С помощью цикла.
C#
1
2
3
4
5
6
7
8
9
10
IEnumerable<string> files = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.*", SearchOption.AllDirectories);
foreach (string filePath in sequence)
{
    string fileName = Path.GetFileName(filePath);
    if (fileName.Length > 20)
    {
        string newFileName = ...;
        File.Move(filePath, Path.Combine(Path.GetDirectoryName(filePath), newFileName));
    }
}
0
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
02.01.2015, 19:37
Ну вот мой вариант. Изменяет имена файлов если длина имени без расширения больше 20 на i++ ))) без проверки на существующее имя
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
     static void Main(string[] args)
        {
            DirectoryInfo di = new DirectoryInfo("G:\\1");
 
            string tempExtension;
            string newpath;
            int i=1;
            foreach (var fi in di.GetFiles("*.*", SearchOption.AllDirectories))
            {
                Console.WriteLine(fi + "  Длина имени без расширения - {0}", Path.GetFileNameWithoutExtension(fi.FullName).Length);
                if (Path.GetFileNameWithoutExtension(fi.FullName).Length > 20)
                {
                    
                    tempExtension = fi.Extension;
                    newpath = fi.DirectoryName + "\\" + i + tempExtension;
                    File.Move(fi.FullName, newpath);
                    i++;
                }
            }
 
            Console.ReadKey();
        }
или такой вариант, укорачивает имя до 8 символов

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static void Main(string[] args)
        {
            DirectoryInfo di = new DirectoryInfo(Directory.GetCurrentDirectory()); //текущий каталог
            string tempExtension, newpath,name;
 
            foreach (var fi in di.GetFiles("*.*", SearchOption.AllDirectories))
            {
                name = Path.GetFileNameWithoutExtension(fi.FullName);
                Console.WriteLine(fi + "  Длина имени без расширения - {0}", name.Length);
 
                if (name.Length > 20)
                {
                    name = name.Substring(8, name.Length - (name.Length-8));
                    tempExtension = fi.Extension;
                    newpath = fi.DirectoryName + "\\" + name + tempExtension;
                    File.Move(fi.FullName, newpath);
                   // i++;
                }
            }
 
            Console.ReadKey();
        }
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18297 / 14221 / 5368
Регистрация: 17.03.2014
Сообщений: 28,897
Записей в блоге: 1
02.01.2015, 20:01
Prog_maker, т.к. автора вопроса интересует только имена файлов, то эффективнее использовать Directory.GetFiles() т.к. он вернет только их и ничего лишнего. Кроме того использование Directory.GetCurrentDirectory() плохая практика т.к. его значение контолируется внешней средой. Например, если программа будет запущена через ярлык с измененным working directory или через task scheduler, то т.н. "текущий каталог" будет указывать не на каталог с exe. Правильнее использовать AppDomain.CurrentDomain.BaseDirectory.
1
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
02.01.2015, 20:29
OwenGlendower,
Цитата Сообщение от OwenGlendower Посмотреть сообщение
IEnumerable<string> files = Directory.GetFiles(AppDomain.CurrentDoma in.BaseDirectory, "*.*", SearchOption.AllDirectories);
так не получиться вытащить имя файла без расширения

на счет AppDomain согласен
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
02.01.2015, 20:38
Цитата Сообщение от Prog_maker Посмотреть сообщение
так не получиться вытащить имя файла без расширения
Почему находит и без расширения, я проверял.
0
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
02.01.2015, 20:58
maxillion,
Я имел ввиду длину имени файла, не учитывая расширение

Добавлено через 2 минуты
С небольшой проверкой

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
        static void Main(string[] args)
        {
            DirectoryInfo di = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);
            string tempExtension, newpath, name;
            int i = 1;
            foreach (var fi in di.GetFiles("*.*", SearchOption.AllDirectories))
            {
                name = Path.GetFileNameWithoutExtension(fi.FullName);
               // Console.WriteLine(fi + "  Длина имени без расширения - {0}", name.Length);
                if (name.Length > 20)
                {
                    name = name.Substring(8, name.Length - (name.Length - 8));
                    tempExtension = fi.Extension;
                    while (true)
                    {
                        try
                        {
                            newpath = fi.DirectoryName + "\\" + name + i + tempExtension;
                            File.Move(fi.FullName, newpath);
                            break;
                        }
                        catch (Exception)
                        { i++;}
                    }
 
                }
            }
            Console.ReadKey();
        }
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18297 / 14221 / 5368
Регистрация: 17.03.2014
Сообщений: 28,897
Записей в блоге: 1
02.01.2015, 21:07
Цитата Сообщение от Prog_maker Посмотреть сообщение
C#
1
IEnumerable<string> files = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.*", SearchOption.AllDirectories);
так не получиться вытащить имя файла без расширения
Почему не получится то? Path.GetFileNameWithoutExtension() прекрасно работает и в этом случае.
0
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
02.01.2015, 21:13
А вот и не
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Почему не получится то? Path.GetFileNameWithoutExtension() прекрасно работает и в этом случае.
А вот и не работает ,,,
C#
1
2
3
4
            IEnumerable<string> files = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.*", SearchOption.AllDirectories);
            foreach (var fi in files)
            {
                name = Path.GetFileNameWithoutExtension(fi.FullName);
Показать подробности Серьезность Программа Описание Проект Файл Строка
Ошибка CS1061 'string" не содержит определения для "FullName" и не удалось найти метод расширения "FullName", принимающий тип "string" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку). files Program.cs 20
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18297 / 14221 / 5368
Регистрация: 17.03.2014
Сообщений: 28,897
Записей в блоге: 1
02.01.2015, 21:44
Prog_maker, переменная fi имеет тип string. Разумеется у System.String нет свойства FullName, но оно и не нужно т.к. fi уже содержит полный путь к файлу. Поэтому пишем просто:
C#
1
name = Path.GetFileNameWithoutExtension(fi);
0
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
02.01.2015, 22:49
Ну да через path тоже можно работать
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18297 / 14221 / 5368
Регистрация: 17.03.2014
Сообщений: 28,897
Записей в блоге: 1
02.01.2015, 23:06
Prog_maker, рад что ты разобрался. Я только одну вещь непонял. В этой темы были другие сообщения от тебя. Кто их удалил?
1
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
02.01.2015, 23:22
OwenGlendower,
Интернет лагает, пока правку сделал, успело уже на старицу попасть
0
7 / 7 / 0
Регистрация: 13.08.2012
Сообщений: 250
03.01.2015, 15:15  [ТС]
Откомпилировал вот это:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
static void Main(string[] args)
        {
            DirectoryInfo di = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);
            string tempExtension, newpath, name;
            int i = 1;
            foreach (var fi in di.GetFiles("*.*", SearchOption.AllDirectories))
            {
                name = Path.GetFileNameWithoutExtension(fi.FullName);
               // Console.WriteLine(fi + "  Длина имени без расширения - {0}", name.Length);
                if (name.Length > 20)
                {
                    name = name.Substring(8, name.Length - (name.Length - 8));
                    tempExtension = fi.Extension;
                    while (true)
                    {
                        try
                        {
                            newpath = fi.DirectoryName + "\\" + name + i + tempExtension;
                            File.Move(fi.FullName, newpath);
                            break;
                        }
                        catch (Exception)
                        { i++;}
                    }
 
                }
            }
            Console.ReadKey();
        }

Было:
823456789012345678901.txt
Стало:
901234561.txt
Довольно странный результат.
Если не затруднит, поправьте так, чтобы имя заменялось на первые 20 символов.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18297 / 14221 / 5368
Регистрация: 17.03.2014
Сообщений: 28,897
Записей в блоге: 1
03.01.2015, 15:21
InferernumDeus, для этого надо изменить вызов Substring. Попробуй самостоятельно с этим разобраться. Чтобы ничего не сломать закоментируй вызов File.Move на время отладки.
1
7 / 7 / 0
Регистрация: 13.08.2012
Сообщений: 250
03.01.2015, 16:54  [ТС]
Точно. Совсем обленился в последнее время.
Спасибо вам обоим.
0
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
03.01.2015, 19:19
InferernumDeus,

C#
1
name = name.Substring(0, 20);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.01.2015, 19:19
Помогаю со студенческими работами здесь

Создание списка файлов в папке и подпапках
Здравствуйте. Есть папка с подпапками, названия могут быть разные. Нужно получить список всех файлов и путь к ним. Чтобы в...

Получить список файлов в папке и подпапках
Каким образом получить список файлов в текущей папке приложения и всех подпапках рядом, с учетом доступа? Например: string files =...

Подсчет количества файлов в подпапках (Ошибка при попытке доступа к папке)
Граждане, у меня возникла проблема, с которой безуспешно борюсь уже как 2 недели :wall: Помощь нужна немедленно... Лабораторная...

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

Проверить количество файлов в папке
Есть такой проблемный фрагмент кода string paths = Directory.GetFiles(Application.StartupPath, &quot;Settings.*&quot;); if (paths !=...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru