Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Alexsandr
11 / 11 / 3
Регистрация: 12.05.2014
Сообщений: 187
1

Перемещение файлов с переименованием при необходимости

05.07.2016, 21:28. Просмотров 1352. Ответов 4
Метки нет (Все метки)

Есть каталог, с него нужно перемещать файлы в другой, но файла могут иметь одинаковое название, нужно при наличии занятого имени к примеру добавить (2), (3)....
Каталога назначения может не существовать (имя каталога создается из даты).
Мои успехи пока нулевые в этом деле.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2016, 21:28
Ответы с готовыми решениями:

Перемещение с переименованием файлов в vba
Здравствуйте. Есть задача, найти в целевой папке список имен фото, находящийся в столбце 1 Excel, и...

Перемещение всегда нового файла с переименованием
Всем привет! Данный фрагмент кода у меня работает в цикле, в папке c:\extract\currentlog создаётся...

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

Копирование файлов с переименованием в случае совпадения имён копируемых и имеющихся в папке назначения файлов
Доброго времени суток. Убедительная просьба, помогите пожалуйста решить задачу. Существует...

4
Lexeq
1016 / 666 / 457
Регистрация: 21.01.2014
Сообщений: 1,771
Завершенные тесты: 2
05.07.2016, 22:47 2
Лучший ответ Сообщение было отмечено Alexsandr как решение

Решение

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
30
31
32
33
34
35
36
37
using System;
using System.Linq;
using System.IO;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void SmartMove(string from, string to)
        {
            DirectoryInfo sourceDir = new DirectoryInfo(from);
            DirectoryInfo targetDir = new DirectoryInfo(to);
 
            if(!targetDir.Exists) targetDir.Create();
 
            var filesInTargetDir = targetDir.GetFiles().Select(f => f.Name);
            foreach (FileInfo file in sourceDir.GetFiles())
            {
                string fileName = file.Name;
                int i = 1;
                while (filesInTargetDir.Contains(fileName))
                {
                    i++;
                    fileName = string.Format("{0} ({1}).{2}", Path.GetFileNameWithoutExtension(file.FullName), i, file.Extension);
                }
                file.MoveTo(Path.Combine(to, fileName));
            }
        }
        static void Main(string[] args)
        {
            string sourcePath = "F:\\FilesToMove";                  //Папка с исходными файлами
            string targetPath = Path.Combine("F:\", DateTime.Now.ToShortDateString());   //папка назначения
            SmartMove(sourcePath, targetPath);
            Console.ReadKey();
        }
    }
}
1
Alexsandr
11 / 11 / 3
Регистрация: 12.05.2014
Сообщений: 187
05.07.2016, 23:11  [ТС] 3
Огромная благодарность.
Единственное, убрал точку в строке, с нею расширение отделяется двумя точками, без неё одной.
fileName = string.Format("{0} ({1}){2}", Path.GetFileNameWithoutExtension(file.FullName), i, file.Extension);
0
Alexsandr
11 / 11 / 3
Регистрация: 12.05.2014
Сообщений: 187
24.07.2016, 21:45  [ТС] 4
Отдельно с путями работает. при попытке встроить в основную программу получаю сообщения "Процесс не может получить доступ к файлу, так как этот файл занят другим процессом."
Путь источника задается переменной path и равен к примеру C:\\sendmail\\Listing\\01\\
Как лечить?

Не работает перенос с одинаковым именем если файл без расширения. Может точка которую удалил поможет. Но пока больше интересует как заставить работать с переменной в качестве источника?
0
Alexsandr
11 / 11 / 3
Регистрация: 12.05.2014
Сообщений: 187
26.07.2016, 21:59  [ТС] 5
Проверил уже все. Кодировка с виду правильная (переменная высвечивается нормально, другие блоки работают с этой же переменной и этим значением нормально. Подскажите куда копать? Файл тоже доступен и свободно копируется/удаляется. Так же как и если задать значение переменной руками в программе.

Добавлено через 26 минут
Кажется нашел хвост. Если исключить вызов отправки файла на почту, то файл удаляется. Но потоков ведь нигде не создаю с этими файлами.
Вот код, который похоже блокирует файлы. Как исправить?
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
public static string sendmailss(int ports, string otkogo, string parol, string komy, string serversmtp,
                                       string tema, string text, string path,ref string sendinfo)
        {
            //string sendinfo = "0";
            try
            {
 
                // try{ //начало блока контролируемого на ошибки
 
 
 
                /* здесь указываете SMTP и Порт,  25 или 2525 */
                SmtpClient Smtp = new SmtpClient(serversmtp, ports);
 
                /* здесь на месте указываете логин, на месте пароль, 
                если у вас [email]example@mail.ru[/email] то указываете просто example (без mail.ru) */
                Smtp.Credentials = new NetworkCredential(otkogo, parol);
                MailMessage Message = new MailMessage();
 
                /* указываете свой E-mail, на месте указываете куда будет отправлено письмо (это может быть не обязательно rambler)*/
                Message.From = new MailAddress(otkogo);
                Message.To.Add(new MailAddress(komy));
 
                /*Тема сообщения на месте Theme и текст сообщения на месте Text*/
                Message.Subject = tema;
                Message.Body = text;
 
                if (Directory.EnumerateFiles(path).Count() <= 0)
                {
                    //if (var Directory.GetFiles(@path,"*.*))!="" {
                    string sobitie = "Файлы в каталоге " + path + " Не обнаружены, отправка пропущена";
                    zapisdel(sobitie);
                    sendinfo = "1";
                    return sendinfo;
 
                    /*все пропало, файла нет, надо срочно что-то делать*/
                }
                else {
                    int filesrahunok = Directory.EnumerateFiles(path).Count();
                    string sobitie = "В каталоге " + filesrahunok.ToString() + " файлов";
                    zapisdel(sobitie);
                    //Directory.GetFiles(@path, "*.*").ToList(string).foundfiles; //проверк аналичия файлов в каталоге
                    // sobitie = "foundfiles";
                    //zapisdel(sobitie);
 
                    Directory.GetFiles(@path, "*.*").ToList().ForEach(name => Message.Attachments.Add(new Attachment(name, MediaTypeNames.Text.Plain)));//создаёте папку send в директории с exe файлом и в неё закидываете файлы
 
 
 
                    //int ErrorsSend = 0;
                    Smtp.Send(Message); //сообщение отправлено
                                        //File.Move(path, "C:\\sendmail\\arh"); //если файл отправили - реализация перемещенгия в архив
                                        //  perenos (path);
 
                    
                    sendinfo = "0"; //!
                     return sendinfo;//!
                   
                }
            }
            //обработка ошибок, нужно добавить переменную для оповещения успешная операция или нет и вернуть её?             Вроде бы вернули, обрабатывается, хотя и просто.
 
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                zapisdel(e.Message);
                 sendinfo = "1";
                return sendinfo;
               
                //Console.ReadLine();
            }
 
 
        }
0
26.07.2016, 21:59
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2016, 21:59

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

Копирование с переименованием файлов
Необходимо в определенной папке найти файлы с именем avpki.log. Затем необходимо скопировать данные...

Распаковка архивов с переименованием файлов
Задача такая. Есть папка с архивами rar, zip, 7z. Нужно все архивы распаковать (без сохранения...

Раскидать по папкам с переименованием файлов по маске
Добрый день. Помогите пожалуйста. Необходимо общую кучу файлов типа yymmdd_000_имяфайла.xls...

Извлечение из архива .ARJ с переименованием файлов
Добрый день! Есть папка с архивами типа dd.mm.yyyy namefile.arj внутри архива один файл без...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.