Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2020, 23:16   #1
Vyacheslav.
Форумчанин
 
Регистрация: 22.10.2017
Сообщений: 113
Сообщение Групповое переименование имен файлов

Здравствуйте. Есть папка в которой находятся несколько файлов с короткими именами. Есть excel или txt файл в котором есть колонка "Старое имя" и "Новое имя", где соответственно указано текущее имя файла, и новое которое должно быть.
Например: Вас -> Васильев Василий Викторович
Задача на С# в том, чтобы заменить все старые имена на новые (подтягивая их из Excel файла соответственно), с учетом вложенных папок. И так-же нужно получить файлик, с именами файлов которые не изменились.
Подтягивание с Excel и переименование сделал, вот код:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using Excel = Microsoft.Office.Interop.Excel;

namespace Spiski
{
    class Program
    {
        static void Main(string[] args)
        {
         //  int count = 1;
            IEnumerable<FileInfo> filesToRename = Directory.GetFiles(@"C:\Users\User\Desktop\Photo").Select(f => new FileInfo(f));
            Excel.Application ObjWorkExcel = new Excel.Application(); //открыть эксель
            Excel.Workbook ObjWorkBook = ObjWorkExcel.Workbooks.Open(@"C:\Users\User\Desktop\Files\Test.xlsx", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); //открыть файл
            Excel.Worksheet ObjWorkSheet = (Excel.Worksheet)ObjWorkBook.Sheets[1]; //получить 1 лист
            var lastCell = ObjWorkSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell);//1 ячейку
            //-------------------------------------
            int lastColumn = (int)lastCell.Column;//!сохраним непосредственно требующееся в дальнейшем
            int lastRow = (int)lastCell.Row;
            //-------------------------------------
            string[,] list = new string[lastCell.Column, lastCell.Row]; // массив значений с листа равен по размеру листу
            for (int i = 0; i < (int)lastCell.Column; i++) //по всем колонкам
                for (int j = 0; j < (int)lastCell.Row; j++) // по всем строкам
                    list[i, j] = ObjWorkSheet.Cells[j + 1, i + 1].Text.ToString();//считываем текст в строку
            ObjWorkBook.Close(false, Type.Missing, Type.Missing); //закрыть не сохраняя
            ObjWorkExcel.Quit(); // выйти из экселя
            GC.Collect(); // убрать за собой -- в том числе не используемые явно объекты !
            for (int i = 1; i < lastColumn; i++) //по всем колонкам
                for (int j = 1; j < lastRow; j++)  // по всем строкам 
           // string picture = "photo";
        
            foreach (FileInfo file in filesToRename)
            {
                string newFileName = $@"{(list[i, j++])}{file.Extension}";
                string newFileFullPath = Path.Combine(file.DirectoryName, newFileName);
                File.Move(file.FullName, newFileFullPath);
            }
            //Console.Write(list[i, j]);//выводим строку
            //Console.ReadLine();
        }
    }
}
Однако оно переименовывает в случайном порядке, а нужно чтобы искало соответствие, и если есть совпадение - заменяло старое имя на новое. Подскажите пожалуйста с примерами как это сделать?
Vyacheslav. вне форума Ответить с цитированием
Старый 13.05.2020, 23:20   #2
Vyacheslav.
Форумчанин
 
Регистрация: 22.10.2017
Сообщений: 113
По умолчанию

Код:
using System;
using System.IO;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Excel = Microsoft.Office.Interop.Excel;
 
namespace ConsoleApp6
{
    class Program
    {
        static void Main(string[] args)
        {
            Excel.Application ObjWorkExcel = new Excel.Application(); //открыть эксель
            Excel.Workbook ObjWorkBook = ObjWorkExcel.Workbooks.Open(@"C:\Users\Slavi\Desktop\Files\Test1.xlsx", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); //открыть файл
            Excel.Worksheet ObjWorkSheet = (Excel.Worksheet)ObjWorkBook.Sheets[1]; //получить 1 лист
            var lastCell = ObjWorkSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell);//1 ячейку
            int lastColumn = (int)lastCell.Column;//!сохраним непосредственно требующееся в дальнейшем
            int lastRow = (int)lastCell.Row;
            string[,] list = new string[lastCell.Column, lastCell.Row]; // массив значений с листа равен по размеру листу
            for (int i = 0; i < (int)lastCell.Column; i++) //по всем колонкам
                for (int j = 0; j < (int)lastCell.Row; j++) // по всем строкам
                    list[i, j] = ObjWorkSheet.Cells[j + 1, i + 1].Text.ToString();//считываем текст в строку
            ObjWorkBook.Close(false, Type.Missing, Type.Missing); //закрыть не сохраняя
            ObjWorkExcel.Quit(); // выйти из экселя
            GC.Collect(); // убрать за собой -- в том числе не используемые явно объекты !
 
                for (int j = 0; j < lastRow; j++) // по всем строкам 
                {
                    System.IO.File.Move(list[0, j] + ".jpg", list[1, j] + ".jpg");
                    Console.WriteLine("Файл " + list[0, j] + " был переименован в " + list[1, j]);
 
                    // Console.Write(list[i, j] + " ");  //выводим строку 
                }
 
 
                Console.ReadLine();
 
            
        }
    }
}
Переименование сделал, Но оно переименовывает только файлы одного типа, и только в папке с exe-шником проекта, а нужно чтобы могло любого типа и в любой папке.
Если убрать +".jpg" то будет ошибка "файл не найден".
Код:
 System.IO.File.Move(list[0, j] + ".jpg", list[1, j] + ".jpg");
Подскажите как сделать чтобы можно было выбрать любую папку и расширение файла?
Vyacheslav. вне форума Ответить с цитированием
Старый 14.05.2020, 11:41   #3
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

перебор всех файлов - https://www.dotnetperls.com/recursive-file-list
для допустимых расширений сделайте отдельный List<String> со списком расширений, в цикле проверяйте если расширение файла есть в списке && имя файле есть в списку к переименованию - выполняем move
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 14.05.2020, 16:09   #4
Vyacheslav.
Форумчанин
 
Регистрация: 22.10.2017
Сообщений: 113
Вопрос

Хоть кто-то ответил, спасибо)
Сделал так:
Код:
  Console.WriteLine("Введите путь к файлам которые нужно переименовать:");
            Console.Write("> ");
            var files = Console.ReadLine();
            var dir = new DirectoryInfo(files);
            foreach (FileInfo file in dir.GetFiles())
            {
                for (int j = 0; j < lastRow; j++) { 
                    if (Path.GetFileNameWithoutExtension(file.Name) != list[0, j])
                {
                    Console.WriteLine("Такого файла нет " + list[0, j]);
                        
                    }
                }
                for (int j = 0; j < lastRow; j++) // по всем строкам 
                {
                    if (Path.GetFileNameWithoutExtension(file.Name) == (list[0, j]))
                    { 
                    string newFileName = $@"{(list[1, j])}{file.Extension}";
                    string newFileFullPath = Path.Combine(file.DirectoryName, newFileName);
                    File.Move(file.FullName, newFileFullPath);
                    //System.IO.File.Move(list[0, j] + ".jpg", list[1, j] + ".jpg");
                    Console.WriteLine("Файл " + list[0, j] + " был переименован в " + list[1, j]);
                    break;

                    }
                  
                    // Console.Write(list[i, j] + " ");  //выводим строку 
                }

            }
            Console.ReadLine();
Осталась 1 проблема, как сделать вывод списка файлов, которые не были найдены в папке?
Пробую так (возвращаю список имен из папки, и если они не равны списку из Excel, значит их нет):
Код:
  for (int j = 0; j < lastRow; j++) { 
                    if (Path.GetFileNameWithoutExtension(file.Name) != list[0, j])
                {
                    Console.WriteLine("Такого файла нет " + list[0, j]);
                        
                    }
                }
Но оно выводит не только файлы которых нет в папке, а и те файлы которые есть, просто не сразу были найдены, а на n-нный круг цикла.
А нужно чтобы реально только те которых нет. Но как это сделать?

Последний раз редактировалось Vyacheslav.; 14.05.2020 в 16:12.
Vyacheslav. вне форума Ответить с цитированием
Старый 14.05.2020, 19:31   #5
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от Vyacheslav. Посмотреть сообщение
А нужно чтобы реально только те которых нет. Но как это сделать?
Совсем в лоб, то сделать еще 1 массив с 2 элементов и хранить в нем НазваниеФайла:БылЛиНайден?
Код:
for (int i = 0; i < (int)lastCell.Column; i++) //по всем колонкам
                for (int j = 0; j < (int)lastCell.Row; j++) // по всем строкам
                    list[i, j] = ObjWorkSheet.Cells[j + 1, i + 1].Text.ToString();//считываем текст в строку
 another_list[0,j] = list[0,j];
 another_list[1,j] = "0";
---------------------------
if (Path.GetFileNameWithoutExtension(file.Name) == (list[0, j]))
                    { 
                    string newFileName = $@"{(list[1, j])}{file.Extension}";
                    string newFileFullPath = Path.Combine(file.DirectoryName, newFileName);
                    File.Move(file.FullName, newFileFullPath);
another_list[1,j] = "1";
                    //System.IO.File.Move(list[0, j] + ".jpg", list[1, j] + ".jpg");
                    Console.WriteLine("Файл " + list[0, j] + " был переименован в " + list[1, j]);
                    break;

                    }
---------------
 <показать с another_list все где "0" во втором столбце>
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск и переименование файлов poganka25 C# (си шарп) 8 26.11.2018 09:39
переименование файлов komra2 C# (си шарп) 20 19.01.2016 20:05
Переименование txt файлов по таблице timer_ru Microsoft Office Excel 1 09.01.2016 16:06
Переименование файлов Alergen2 Microsoft Office Access 1 01.11.2011 13:57
Переименование группы файлов Meh Общие вопросы Delphi 2 28.07.2009 12:31