Перейти к содержимому

C как скопировать запущенный файл

  • автор:

Move запущенного файла

Дано: 1.Запущенная программа на C#. Как сделать так, чтобы при её запуске, она переместила себя в папку C:\Users\ams\AppData\Local\Temp и при этом удалилась из запущенного места(Где она находится на данный момент). Естественно это должно быть сделано посредством кода на с# в этой программе.

Отслеживать
задан 4 янв 2020 в 16:53

скопировать свой исполняемый файл в нужное место, запуститься оттуда, и удалить старый файл — так делать правильно. Неправильно — просто использовать Move и надеятся что никто(и ни что) не успело занять файл на чтение.

4 янв 2020 в 17:31

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Никак. В Windows запущеный/открытый файл нельзя ни переместить, ни даже переименовать (что, по сути, то же самое).

Отслеживать
ответ дан 4 янв 2020 в 17:07
26.2k 7 7 золотых знаков 31 31 серебряный знак 48 48 бронзовых знаков

К примеру, как же тогда всякие вирусы переносят себя куда-нибудь в temp и удаляются из места, куда были сохранены?

4 янв 2020 в 17:24

Ошибаетесь. Запущенное приложение без труда может переименовать свой .exe файл при помощи простого .Move() , правда не всегда и есть некие ограничения.

4 янв 2020 в 17:26

Ответ не имеет с реальностью ничего общего, запущенный файл не налогает ограничений на перемещение\переименование\чтение. Только на запись есть запрет(запись\удаление)

4 янв 2020 в 17:27

@Граф, делают копию файла, запуск из нового места(с параметром) и после — удаление старого, так делают нормальные «вирусы» =) прямое перемещение не желательно делать(могут быть проблемы в работе, если всё не предусмотреть)

4 янв 2020 в 17:28

Я за ответы денег не прошу =) про деньги я вам написал — «если вы хотите чтобы я за вас написал это на вашем ЯП(шарп) — будьте добры оплатить это как работу», если хотите бесплатно — попробуйте сделать как описано в совете под ВОПРОСОМ, и когда что то не получится задайте уточняющий вопрос. Ответы — бесплатно, Код за вас и для вас(вас — тех кто не желает понять\разобраться сам) — платно. В вашем вопросе я не увидел ни желания ни попыток разобраться, отсюда и тон общения, вы даже не удосужились привести текст ошибки или код которым вы пробовали решить задачу. За сим откланяюсь =)

File. Copy Метод

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

Копирует существующий файл в новый файл.

Перегрузки

Копирует существующий файл в новый файл. Перезапись файла с тем же именем не разрешена.

Копирует существующий файл в новый файл. Перезапись файла с тем же именем разрешена.

Copy(String, String)

Копирует существующий файл в новый файл. Перезапись файла с тем же именем не разрешена.

public: static void Copy(System::String ^ sourceFileName, System::String ^ destFileName);
public static void Copy (string sourceFileName, string destFileName);
static member Copy : string * string -> unit
Public Shared Sub Copy (sourceFileName As String, destFileName As String)
Параметры

sourceFileName String
destFileName String

Имя целевого файла. Это не может быть имя каталога или имя существующего файла.

Исключения

У вызывающего объекта отсутствует необходимое разрешение.

sourceFileName или destFileName представляет собой строку нулевой длины, строку, содержащую только пробелы, или строку, содержащую один или несколько недопустимых символов. Вы можете запросить недопустимые символы с помощью метода GetInvalidPathChars().

Параметр sourceFileName или destFileName определяет каталог.

Параметр sourceFileName или destFileName имеет значение null .

Указанный путь, имя файла или оба значения превышают максимальную длину, заданную в системе.

В sourceFileName или destFileName указан недопустимый путь (например, ведущий на несопоставленный диск).

Не удалось найти sourceFileName .

Произошла ошибка ввода-вывода.

Параметр sourceFileName или destFileName имеет недопустимый формат.

Примеры

В следующем примере файлы копируются в папку резервной копии C:\archives\2008. В нем используются две перегрузки Copy метода следующим образом:

  • Сначала используется перегрузка File.Copy(String, String) метода для копирования текстовых (.txt) файлов. Код показывает, что эта перегрузка не разрешает перезапись уже скопированных файлов.
  • Затем он использует перегрузку File.Copy(String, String, Boolean) метода для копирования изображений (.jpg файлов). Код показывает, что эта перегрузка разрешает перезапись уже скопированных файлов.
string sourceDir = @"c:\current"; string backupDir = @"c:\archives\2008"; try < string[] picList = Directory.GetFiles(sourceDir, "*.jpg"); string[] txtList = Directory.GetFiles(sourceDir, "*.txt"); // Copy picture files. foreach (string f in picList) < // Remove path from the file name. string fName = f.Substring(sourceDir.Length + 1); // Use the Path.Combine method to safely append the file name to the path. // Will overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName), true); >// Copy text files. foreach (string f in txtList) < // Remove path from the file name. string fName = f.Substring(sourceDir.Length + 1); try < // Will not overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName)); >// Catch exception if the file was already copied. catch (IOException copyError) < Console.WriteLine(copyError.Message); >> // Delete source files that were copied. foreach (string f in txtList) < File.Delete(f); >foreach (string f in picList) < File.Delete(f); >> catch (DirectoryNotFoundException dirNotFound)
let sourceDir = @"c:\current" let backupDir = @"c:\archives\2008" try let picList = Directory.GetFiles(sourceDir, "*.jpg") let txtList = Directory.GetFiles(sourceDir, "*.txt") // Copy picture files. for f in picList do // Remove path from the file name. let fName = f.Substring(sourceDir.Length + 1) // Use the Path.Combine method to safely append the file name to the path. // Will overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName), true) // Copy text files. for f in txtList do // Remove path from the file name. let fName = f.Substring(sourceDir.Length + 1) try // Will not overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName)) // Catch exception if the file was already copied. with | :? IOException as copyError -> printfn $"" // Delete source files that were copied. for f in txtList do File.Delete f for f in picList do File.Delete f // Catch exception if the file was already copied. with | :? DirectoryNotFoundException as dirNotFound -> printfn $"" 
Dim sourceDir As String = "c:\current" Dim backupDir As String = "c:\archives\2008" Try Dim picList As String() = Directory.GetFiles(sourceDir, "*.jpg") Dim txtList As String() = Directory.GetFiles(sourceDir, "*.txt") ' Copy picture files. For Each f As String In picList 'Remove path from the file name. Dim fName As String = f.Substring(sourceDir.Length + 1) ' Use the Path.Combine method to safely append the file name to the path. ' Will overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName), True) Next ' Copy text files. For Each f As String In txtList 'Remove path from the file name. Dim fName As String = f.Substring(sourceDir.Length + 1) Try ' Will not overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName)) ' Catch exception if the file was already copied. Catch copyError As IOException Console.WriteLine(copyError.Message) End Try Next For Each f As String In txtList File.Delete(f) Next For Each f As String In picList File.Delete(f) Next Catch dirNotFound As DirectoryNotFoundException Console.WriteLine(dirNotFound.Message) End Try 

Комментарии

Этот метод эквивалентен перегрузке Copy(String, String, Boolean) метода с параметром overwrite , равным false .

Параметры sourceFileName и destFileName могут указывать относительные или абсолютные сведения о пути. Относительные сведения о пути интерпретируются как относительные относительно текущего рабочего каталога. Чтобы получить текущий рабочий каталог, см. Directory.GetCurrentDirectory метод . Этот метод не поддерживает подстановочные знаки в параметрах.

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

См. также раздел

  • Move(String, String)
  • Move(String, String)
  • Файловый и потоковый ввод-вывод
  • Чтение текста из файла
  • Практическое руководство. Запись текста в файл
  • Практическое руководство. Считывание данных из нового файла и запись в этот файл

Применяется к

Copy(String, String, Boolean)

Копирует существующий файл в новый файл. Перезапись файла с тем же именем разрешена.

public: static void Copy(System::String ^ sourceFileName, System::String ^ destFileName, bool overwrite);
public static void Copy (string sourceFileName, string destFileName, bool overwrite);
static member Copy : string * string * bool -> unit
Public Shared Sub Copy (sourceFileName As String, destFileName As String, overwrite As Boolean)
Параметры

sourceFileName String
destFileName String

Имя целевого файла. Это не может быть имя каталога.

true Значение , если целевой файл следует заменить, если он уже существует; в противном случае — false .

Исключения

У вызывающего объекта отсутствует необходимое разрешение.

Объект destFileName доступен только для чтения.

overwrite равен true , destFileName существует и скрыт, но sourceFileName не скрыт.

sourceFileName или destFileName представляет собой строку нулевой длины, строку, содержащую только пробелы, или строку, содержащую один или несколько недопустимых символов. Вы можете запросить недопустимые символы с помощью метода GetInvalidPathChars().

Параметр sourceFileName или destFileName определяет каталог.

Параметр sourceFileName или destFileName имеет значение null .

Указанный путь, имя файла или оба значения превышают максимальную длину, заданную в системе.

В sourceFileName или destFileName указан недопустимый путь (например, ведущий на несопоставленный диск).

Не удалось найти sourceFileName .

destFileName существует, и overwrite равно false .

Произошла ошибка ввода-вывода.

Параметр sourceFileName или destFileName имеет недопустимый формат.

Примеры

В следующем примере файлы копируются в папку резервной копии C:\archives\2008. В нем используются две перегрузки Copy метода следующим образом:

  • Сначала используется перегрузка File.Copy(String, String) метода для копирования текстовых (.txt) файлов. Код показывает, что эта перегрузка не разрешает перезапись уже скопированных файлов.

Затем он использует перегрузку File.Copy(String, String, Boolean) метода для копирования изображений (.jpg файлов). Код показывает, что эта перегрузка разрешает перезапись уже скопированных файлов.

string sourceDir = @"c:\current"; string backupDir = @"c:\archives\2008"; try < string[] picList = Directory.GetFiles(sourceDir, "*.jpg"); string[] txtList = Directory.GetFiles(sourceDir, "*.txt"); // Copy picture files. foreach (string f in picList) < // Remove path from the file name. string fName = f.Substring(sourceDir.Length + 1); // Use the Path.Combine method to safely append the file name to the path. // Will overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName), true); >// Copy text files. foreach (string f in txtList) < // Remove path from the file name. string fName = f.Substring(sourceDir.Length + 1); try < // Will not overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName)); >// Catch exception if the file was already copied. catch (IOException copyError) < Console.WriteLine(copyError.Message); >> // Delete source files that were copied. foreach (string f in txtList) < File.Delete(f); >foreach (string f in picList) < File.Delete(f); >> catch (DirectoryNotFoundException dirNotFound)
let sourceDir = @"c:\current" let backupDir = @"c:\archives\2008" try let picList = Directory.GetFiles(sourceDir, "*.jpg") let txtList = Directory.GetFiles(sourceDir, "*.txt") // Copy picture files. for f in picList do // Remove path from the file name. let fName = f.Substring(sourceDir.Length + 1) // Use the Path.Combine method to safely append the file name to the path. // Will overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName), true) // Copy text files. for f in txtList do // Remove path from the file name. let fName = f.Substring(sourceDir.Length + 1) try // Will not overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName)) // Catch exception if the file was already copied. with | :? IOException as copyError -> printfn $"" // Delete source files that were copied. for f in txtList do File.Delete f for f in picList do File.Delete f // Catch exception if the file was already copied. with | :? DirectoryNotFoundException as dirNotFound -> printfn $"" 
Dim sourceDir As String = "c:\current" Dim backupDir As String = "c:\archives\2008" Try Dim picList As String() = Directory.GetFiles(sourceDir, "*.jpg") Dim txtList As String() = Directory.GetFiles(sourceDir, "*.txt") ' Copy picture files. For Each f As String In picList 'Remove path from the file name. Dim fName As String = f.Substring(sourceDir.Length + 1) ' Use the Path.Combine method to safely append the file name to the path. ' Will overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName), True) Next ' Copy text files. For Each f As String In txtList 'Remove path from the file name. Dim fName As String = f.Substring(sourceDir.Length + 1) Try ' Will not overwrite if the destination file already exists. File.Copy(Path.Combine(sourceDir, fName), Path.Combine(backupDir, fName)) ' Catch exception if the file was already copied. Catch copyError As IOException Console.WriteLine(copyError.Message) End Try Next For Each f As String In txtList File.Delete(f) Next For Each f As String In picList File.Delete(f) Next Catch dirNotFound As DirectoryNotFoundException Console.WriteLine(dirNotFound.Message) End Try 

Комментарии

Параметры sourceFileName и destFileName могут указывать относительные или абсолютные сведения о пути. Относительные сведения о пути интерпретируются как относительные относительно текущего рабочего каталога. Этот метод не поддерживает подстановочные знаки в параметрах.

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

Список распространенных задач ввода-вывода см. в разделе Общие задачи ввода-вывода.

См. также раздел

  • Move(String, String)
  • Move(String, String)
  • Файловый и потоковый ввод-вывод
  • Чтение текста из файла
  • Практическое руководство. Запись текста в файл
  • Практическое руководство. Считывание данных из нового файла и запись в этот файл

Статья Как скопировать файл с помощью языка C#?

Из этой статьи Вы узнаете, как скопировать файл, используя язык c#. Но, для начала хотелось бы сказать, что, не смотря на то, что данная операция на самом деле состоит из нескольких этапов, например, таких как создание нового файла, по байтовое копирование информации, удаление старого файла. В языке csharp нас избавили от всех этих «мелких нюансов», поэтому для того, чтобы скопировать файл 1.txt из папки c:\dir1 в папку с:\dir2, вам всего лишь нужно в своей программе написать буквально одну строчку кода.

using System.IO; //добавить! File.Copy(@"C:\dir1\1.txt", @"C:\dir2\2.txt", true);

Для работы мы используем класс File и метод Copy, в который в качестве первого параметра, передаём полный путь к файлу, который необходимо скопировать. Вторым параметров указываем, куда мы копируем файл. Третий, необязательный параметр, который имеет тип bool, позволяет определить действие, которое нужно выполнить, если в папке dir2 уже содержится файл (2.txt). Например, если установить значение true, то тогда при копировании файла (1.txt), файл (2.txt) будет перезаписан, если же мы установим значение false, то в таком случае получим выброс исключения, так как файл уже существует, а его изменение (перезапись) мы запретили.

Так же не забывайте при работе с пространством имён System.IO использовать блоки try catch.

try < File.Copy(); >catch (Exception ex)

Как скопировать все файлы?
И ещё один пример, в котором рассмотрим простую задачу, в которой нужно скопировать все файлы из папки Dir1 в папку Dir2.

//откуда копируем string Dir1 = @"C:\Dirs\Dir1"; //куда копируем string Dir2 = @"C:\Dirs\Dir2"; try < DirectoryInfo dirInfo = new DirectoryInfo(Dir1); foreach (FileInfo file in dirInfo.GetFiles("*.*")) < File.Copy(file.FullName, Dir2 + "\\" + file.Name, true); >> catch (Exception ex)

Сначала с помощью метода GetFiles, используя маску (*.*), получаем все файлы в папке Dir1, а затем по очереди копируем их. Если Вам необходимо скопировать все файлы только какого-то определенного типа, например все текстовые файлы (.txt), то тогда указываем маску (*.txt), для mp3 файлов (*.mp3) и так далее. Значение true указываем в том случаи, если требуется перезаписать старые файлы в папке Dir2.

  • Передача данных между формами в языке c#
  • Свойство ColumnCount элемента управления DataGridView
  • Определение дня недели по дате

Комментарии, перенесенные из блога

САНЯ
24.08.2016 в 09:37
хм, к примеру я получил список файлов в папке и подпапках с датой изменения

string[] files = Directory.GetFiles(@"C:2", "*", SearchOption.AllDirectories); for (int i = 0; i

а как теперь скопировать все файлы к примеру в c:1 и потом через некоторе время скопировать файлы которые изменились?

ADMIN
25.08.2016 в 06:15
«а как теперь скопировать все файлы к примеру в c:1»

string[] files = Directory.GetFiles(@"C:2"); FileInfo fi; foreach (string file in files) < fi = new FileInfo(file); File.Copy(file, "C:1" + fi.Name); //или //File.Copy(file, "C:1" + Path.GetFileName(file)); >//или DirectoryInfo dirInfo = new DirectoryInfo(@"C:2"); foreach (FileInfo file in dirInfo.GetFiles())

и потом через некоторе время скопировать файлы которые изменились?

Например, можно добавить таймер и запускать его сразу после первого копирования.

timer1.Enabled = true; timer1.Interval = //уст. какой-то интервал времени; timer1.Tick += new EventHandler(timer1_Tick); void timer1_Tick(object sender, EventArgs e) < //1. Проверяем есть ли изменения //2. Копируем файлы, которые изменились >

САНЯ
25.08.2016 в 20:24

string[] files = Directory.GetFiles(@"C:2"); FileInfo fi; foreach (string file in files)

пару вопросов, что не задал сразу, сорри!
этим кодом я копирую файлы в папке 2, но в ней есть подпапки, а как скопировать все папки со всеми файлами? список папок и файлов я получаю в приведенным мной кодом выше, так же я получаю дату изменения, к примеру я первый раз сразу копирую все папки и файлы из 2, а потом будет работать таймер по которому будет копирование измененых файлов. Точнее я же получаю список файлов и папок в листбокс1, это к примеру, при запуске программы и сразу их копирую, а потом работает таймер, где я уже вывожу список папок и файлов листбокс2, и потом ведь я могу их сравнить и удалить совпадения по дате изменения, и остануться те которые нужно будет скопировать&#8230 как указать копирование файлов и папок из листбокса1, при запуске и листбокс2 по таймеру?))))

ADMIN
27.08.2016 в 14:49
как скопировать все папки со всеми файлами

можно использовать рекурсию, например:

//рекурсия private void CopyDirsAndFiles(string FromDir, string ToDir) < Directory.CreateDirectory(ToDir); foreach (string file in Directory.GetFiles(FromDir)) < File.Copy(file, ToDir + "" + Path.GetFileName(file)); >foreach (string dir in Directory.GetDirectories(FromDir)) < CopyDirsAndFiles(dir, ToDir + "" + Path.GetFileName(dir)); >> //откуда - куда CopyDirsAndFiles("C:2", "C:1");

как указать копирование файлов и папок из листбокса1, при запуске и листбокс2 по таймеру?))))

private void Form1_Load(object sender, EventArgs e) < timer1.Enabled = false; CopyDirsAndFiles(); //копирует 1 раз timer1.Enabled = true; timer1.Tick += new EventHandler(timer1_Tick); >void timer1_Tick(object sender, EventArgs e) < //1. Проверяем есть ли изменения //2. Копируем файлы, которые изменились >

САНЯ
27.08.2016 в 23:58
если честно, то у меня ничего не выходит, что то я совсем запутался вот полный листинг кода, задача получить все файлы и папки с подпапками в с:2 вывести листбокс1, потом скопировать в c:1, а там уже сам))
[cut]

void CopyAllDirsAndFiles(string FromDir, string ToDir) < Directory.CreateDirectory(ToDir); listBox1.Items.Add(ToDir); foreach (string file in Directory.GetFiles(FromDir)) < File.Copy(file, ToDir + "" + Path.GetFileName(file)); listBox1.Items.Add(file); >foreach (string dir in Directory.GetDirectories(FromDir)) < CopyAllDirsAndFiles(dir, ToDir + "" + Path.GetFileName(dir)); >>

САНЯ
29.08.2016 в 17:48

File.Copy(file, ToDir + «» + Path.GetFileName(file));

подскажи, а как сделать перезапись файл — этот метод запрещает это сделать? и такой если файл будет открыт, он скопируеться?

ADMIN
31.08.2016 в 16:29
подскажи, а как сделать перезапись файл — этот метод запрещает это сделать?»

Ответ на этот вопрос есть в статье.

если файл будет открыт, он скопируеться?

Да, но лучше всё равно обработать возможность возникновения System.IO.IOException

САНЯ
31.08.2016 в 19:51
админ, я использую CopyDir(@»C:2″, @»C:1&#8243 а как указать вместо c:2 список папок в листбокс? пробывал пару вариантов, но видать не правильно

listBox1.Items.Add("c:2"); listBox1.Items.Add("c:3"); listBox1.Items.Add("c:4"); foreach (string dir in listBox1.Items)

САНЯ
02.09.2016 в 19:39
админ, новерно крайний вопрос)) в листбокс файл + дата изменения, скопировать как не получаеться и оно понятно, а как отделить при копировании дату изменения до пробела

foreach (string f in Directory.GetFiles(FromDir)) < listBox2.Items.Add(f + " " + Directory.GetLastWriteTime(FromDir)); try < File.Copy(f, ToDir + "" + Path.GetFileName(f), true); >catch (Exception ex) < MessageBox.Show(ex.Message); >>

ADMIN
04.09.2016 в 04:44
Получить только путь из строки?

string str = listBox1.Items[0].ToString(); string path = str.Substring(0, str.IndexOf(' '));

САНЯ
05.09.2016 в 05:30
Админ а что не правильно, пытаюсь удалить совпадение строк? удаляет только первую

for ( int i = 0; i < listBox1.Items.Count; i++) < if (listBox1.Items[i].ToString() == listBox2.Items[i].ToString()) < listBox1.Items.RemoveAt(i); >>

ADMIN
06.09.2016 в 03:32
Поставь точку остановы и посмотри, что происходит со списком listbox1 до удаления элемента и после.

САНЯ
07.09.2016 в 01:14
по идее должны быть так? переменные обьявлены в классе, я понимаю что это должно быть просто, но что то совсем не могу вникнуть…. очень хочу научится , но самоучкой трудно((

if (listBox1.Items[w].ToString() == listBox2.Items[q].ToString()) < for ( int w = 0; w < listBox1.Items.Count; w++) < listBox1.Items.RemoveAt(w); >>

ADMIN
07.09.2016 в 17:51

for (int i=0; i < listBox1.Items.Count; i++) < for (int k = 0; k < listBox2.Items.Count; k++) < if (listBox1.Items[i].Equals(listBox2.Items[k])) < listBox2.Items.Remove(listBox2.Items[k]); --k; >> >

САНЯ
09.09.2016 в 01:31
админ привет, подскажи что не так? после удаления сравнений, в листбоксе2 остаеться к примеру путь с:22.txt 11.11.11 11:11 но при использовании ниже приведенного кода, выдаёт ошибку!

foreach (string fi in listBox2.Items)

ADMIN
10.09.2016 в 07:27
выдаёт ошибку

САНЯ
11.09.2016 в 09:21
решил попробывать вставить рекурсию по нажатию кнопки

private void button2_Click(object sender, EventArgs e) < string ToDir = @"C:1"; string FromDir = listBox2.Items.ToString(); Directory.CreateDirectory(ToDir); foreach (string fi in listBox2.Items) - все нормально но потом когда возвращаеться сюда ошибка < string str = listBox2.Items[0].ToString(); string path = str.Substring(0, str.IndexOf(' ')); try < File.Copy(path, ToDir + "" + Path.GetFileName(fi), true); >catch (Exception ex) < MessageBox.Show(ex.Message); >foreach (string dir in Directory.GetDirectories(@"C:2")) < CopyDir(dir, ToDir + "" + Path.GetFileName(dir)); >> >

Необработанное исключение типа «System.InvalidOperationException» в System.Windows.Forms.dll

Дополнительные сведения: Список, к которому привязан данный перечислитель, был изменен. Перечислитель может использоваться, только если список не изменяется.

ADMIN
12.09.2016 в 04:21
По нажатию кнопки должно быть так:

private void button2_Click(object sender, EventArgs e)

Полный код метода CopyAllDirsAndFiles добавлял выше в комментариях.

Эта строка не содержит путь, хотя и не используется:

string FromDir = listBox2.Items.ToString();

CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt

Доброго времени суток!
Надо найти в определенных папках, заданных маской, определенные файлы, тоже заданные маской.
Найденные файлы скопировать в папку, откуда запущен bat-ник. Поскольку имена найденных файлов могут совпадать, то имена результирующих файлов должны состоять из имени папки, в которой они находились, и оригинального имени файла.
Вот код, который мне удалось написать. Он не делает из того, что мне надо только одно- не присваивает новые имена.
Помогите, пожалуйста.

 set folder_where=%~dp0 rem for /d %%B in (%USERPROFILE%\AppData\Roaming\PC\3*) do ( for %%C in ("%%B\*.txt") do copy /y "%%C" "%folder_where%" >NUL ) pause 

Из моего кода видно, что в каталоге %USERPROFILE%\AppData\Roaming\PC\ есть некие папки, названия которых начинаются с цифры 3 (три). Количество символов в имени папки (цифр), как правило, 12. В таких папках мне надо найти определенные файлы по маске *.txt. например: readme.txt. Такие файлы должны появиться в папке с батником под именем=имя папки+имя файла, например: 321098765432-readme.txt
И еще. Хотелось сделать проверку на наличие файла (321098765432-readme.txt). Если у записанного дата старее, чем у нового (readme.txt), то перезаписать, иначе не надо.
Заранее спасибо.

2 Ответ от andypetr 2022-06-15 07:39:31

  • andypetr
  • Разработчик
  • Неактивен

Re: CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt

123ksn, приветствую.

Вот мой вариант.
Присваиваются новые имена, обновляются существующие файлы (ключ /D команды XCOPY).

set "folder_where=%~dp0" for /d %%B in (%USERPROFILE%\AppData\Roaming\PC\3*) do ( for %%C in ("%%B\*.txt") do echo F|xcopy "%%C" "%folder_where%%%~nxB-%%~nxC" /d /h /k /r /y >NUL rem "echo F|" подавляет запрос на копирование новых файлов "(F = файл, D = каталог)". rem Ключи XCOPY: rem /D:m-d-y Копирует файлы, измененные либо в указанный день, либо после. rem Если дата не указана, копируются только те файлы, которые новее в исходной папке. rem /H Копирует скрытые и системные файлы. rem /R Заменяет файлы, доступные только для чтения. rem /K Копирует атрибуты. Простая команда Xcopy сбрасывает атрибут "Только чтение". rem /Y Подавляет запрос на подтверждение перезаписи существующего конечного файла. ) 

3 Ответ от 123ksn 2022-06-15 09:23:21 (изменено: 123ksn, 2022-06-15 09:29:13)

Re: CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt

andypetr
Большое спасибо. Проверил. Не работает. Добавил pause. Проскакивает черный экран, но файлы не появляются.

4 Ответ от andypetr 2022-06-15 10:43:31 (изменено: andypetr, 2022-06-15 10:47:29)

  • andypetr
  • Разработчик
  • Неактивен

Re: CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt

123ksn, попробуйте добавить последней строкой PAUSE.
И в строке «for %%C . >NUL» заменить «>NUL» на «>>1.txt«.
Что выводится на экран и в файл 1.txt?

PS. Точно ли у вас в папке %USERPROFILE%\AppData\Roaming содержится папка PC с папками, начинающимися на 3*, в которых есть файлы .txt?
Я у себя всё это создал для тестирования — например, есть файл C:\USERS\ПОЛЬЗОВАТЕЛЬ\APPDATA\ROAMING\PC\321098765432\readme.txt.

5 Ответ от 123ksn 2022-06-15 11:59:53

Re: CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt

andypetr
Извините меня пожалуйста. Оказывается РС у меня было на русском языке. Поэтому не сработало. Теперь файлы сохраняет как и хотел. Чуть позже проверю с логику с датами.
Я видимо наглею, но нельзя ли сделать вариант контроля не по дате, а по размеру. Я подумал, что нет смысла перезаписывать старый файл новым, из которого удалили часть информации.
В любом случае Вам огромное спасибо за работающий вариант и за обучение, как увидеть лог работы батника.

6 Ответ от andypetr 2022-06-15 13:47:31

  • andypetr
  • Разработчик
  • Неактивен

Re: CMD/BAT: Скопировать файлы (*w.txt) из папки (s\f\3*) =3хх-хw.txt

123ksn
Не хотел усложнять, но тут потребуется команда «SetLocal EnableDelayedExpansion«, которая позволяет легко обращаться к значению переменной внутри блока кода, ограниченного скобками — через восклицательные знаки.
Я первой строкой всех своих BAT-файлов всегда пишу «@echo off & SetLocal EnableExtensions EnableDelayedExpansion», так проще кодировать.
В данном примере я обращаюсь к значению переменной «doCopy»: «%doCopy%» не раскрывает значение переменной, а вот «!doCopy!» всё делает как надо.
Аналогично, можно было бы написать «for %%D in («!folder_where!%%~nxB-%%~nxC»)» — хотя тут и с процентами срабатывает.
В общем, я везде где можно раскрываю значения переменных через «!».
За исключением переменных-параметров (%0, %*, %1, . %9), переменных циклов (%%a-%%z, %%A-%%Z) и переменных окружения (%PATH% и т.д.).

@echo off & SetLocal EnableExtensions EnableDelayedExpansion set "folder_where=%~dp0" for /d %%B in (%USERPROFILE%\AppData\Roaming\PC\3*) do ( for %%C in ("%%B\*.txt") do ( for %%D in ("%folder_where%%%~nxB-%%~nxC") do ( rem Сравнение размеров файла-источника %%C и файла-приемника %%D: if exist "%%~D" ( set /a doCopy = %%~zC - %%~zD ) else ( set /a doCopy = 1 ) rem переменная doCopy: rem > 0, если файл %%C больше по размеру, чем файл %%D (нужно копирование) rem = 1, если файл %%D не существует (нужно копирование) rem = 0, если файлы равны по размеру (нужно копирование с ключом /D) rem < 0, если файл %%C меньше по размеру, чем файл %%D (не нужно копирование) if !doCopy! geq 1 ( echo F|xcopy "%%~C" "%%~D" /h /k /r /y >NUL ) else ( if !doCopy! equ 0 ( echo F|xcopy "%%~C" "%%~D" /d /h /k /r /y >NUL ) ) rem "echo F|" подавляет запрос на копирование новых файлов "(F = файл, D = каталог)". rem Ключи XCOPY: rem /D:m-d-y Копирует файлы, измененные либо в указанный день, либо после. rem Если дата не указана, копируются только те файлы, которые новее в исходной папке. rem /H Копирует скрытые и системные файлы. rem /R Заменяет файлы, доступные только для чтения. rem /K Копирует атрибуты. Простая команда Xcopy сбрасывает атрибут "Только чтение". rem /Y Подавляет запрос на подтверждение перезаписи существующего конечного файла. ) ) ) pause EndLocal exit /b 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *