Копирование каталога средствами 1с

1. DimaP 63 13.11.09 17:26 Сейчас в теме
Приветствую!
Задача: скопировать каталог в другое место средствами 1С; число и имена файлов заранее не известны. Видимо, нужно использовать средства WMI, но не понял как это работает; в WMI code creator 1C покопался и не понял как вытащить то, что нужно:
strComputer = ".";
objWMIService = ПолучитьCOMОбъект("winmgmts:\\" + strComputer + "\root\CIMV2");
// Получаем экземпляр класса
// используя ключ свойства.
objShare = objWMIService.Get("Win32_Directory.ReplaceKeyProperty = ReplacePropertyValue");

// Получаем входящие параметры объекта
// по методу.
objInParam = objShare.Methods_("CopyEx").
inParameters.SpawnInstance_();


// Добавить входящие параметры.

// Выполняем метод и получаем статус возврата.
// Исходяшщие параметры в objOutParams
// созданы провайдером.
objOutParams = objWMIService.ExecMethod("Win32_Directory.ReplaceKeyProperty = ReplacePropertyValue", "CopyEx", objInParam);

// Список исходящих параметров
Сообщить("Исходящие параметры: ");
Сообщить("ReturnValue: " + objOutParams.ReturnValue);
Сообщить("StopFileName: " + objOutParams.StopFileName);
Показать


Здесь должны быть входящие параметры ...

Подскажите, может быть есть проще путь?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. anig99 2843 13.11.09 17:30 Сейчас в теме
Дос команды...где-то тут пробегал кусок кода.
Средствами 1с рекурсивно
3. DimaP 63 13.11.09 17:42 Сейчас в теме
Боюсь, что с досом будет проблемно - длинные русские имена с пробелами.
Про рекурсивный метод можно подробнее?
4. magus 13.11.09 18:19 Сейчас в теме
(3)
1. присмотрись к команде robocopy
2. может так?
Код
   НайденныеФайлы = НайтиФайлы(Каталог1, "*.*");
   Для сч = 0 По НайденныеФайлы.Количество()-1 Цикл
      ОбработкаПрерыванияПользователя();
      Если НайденныеФайлы[сч].ЭтоКаталог() Тогда
         Продолжить;
      КонецЕсли;
      КопироватьФайл(НайденныеФайлы[сч].ПолноеИмя, Каталог2+НайденныеФайлы[сч].Имя);
   КонецЦикла;
Показать полностью
pavelpribytkin96; pvlunegov; +2 Ответить
18. user717534 11 10.08.22 12:11 Сейчас в теме
(4)
Показать
только в НайтиФайлы(), третий параметр ИскатьВПодкаталогах не забыть указать, чтобы рекурсивно искало
19. FatPanzer 10.08.22 12:16 Сейчас в теме
(18) Не рекурсивно, а иерархически.
Рекурсия - это совсем о другом!
5. DimaP 63 13.11.09 18:53 Сейчас в теме
Спасибо! Использовал второй способ - получилось!
6. Evg-Lylyk 4632 14.11.09 00:05 Сейчас в теме
Можно использовать метод FSO CopyDirectory

ScriptFSO = Новый COMОбъект("Scripting.FileSystemObject");
ScriptFSO.CopyDirectory (<ПутьИсточник>,<ПутьПриемник>)
walp; waol; +2 Ответить
8. vovan519 276 17.11.09 09:47 Сейчас в теме
(6) Зачем Вы вводите людей в заблуждение. Нету у FileSystemObject метода CopyDirectory. Есть CopyFolder. И имеет он не два параметра, а три.
9. Evg-Lylyk 4632 17.11.09 17:35 Сейчас в теме
(8) Это метод как сделать я наизусть не помню, попробует найдет. Нах... я в форуме больше не буду писать после таких постов.
7. sound 535 16.11.09 23:14 Сейчас в теме
еще есть системная команда xcopy (см. xcopy /?)
10. user874767 13.12.17 16:28 Сейчас в теме
Процедура КопироватьКаталог(ИзКаталога,ВКаталог)            //копирует файлы и создаёт каталоги одного уровня, чтобы обработать вложенные каталоги запускаем рекурсию
	Перем АтрФ; 
	СпЗнПодКат = СоздатьОбъект("СписокЗначений");          //список значений вложенных подкаталогов которые нужно будет скопировать 
	//-------копируем файлы и создаём каталоги корневого уровня в папке назначения----------
	ФС.УстТекКаталог(ИзКаталога);
	ИмяФ = ФС.НайтиПервыйФайл("*.*");                      //получили имя файла в ИзКаталога
	Пока ИмяФ <> "" Цикл                                               //имя файла не пустое
		Если ИмяФ = "." Тогда ИмяФ = ФС.НайтиСледующийФайл(); Продолжить; КонецЕсли;
		Если ИмяФ = ".." Тогда ИмяФ = ФС.НайтиСледующийФайл(); Продолжить; КонецЕсли; 
		ФС.АтрибутыФайла(ИзКаталога+"\"+ИмяФ,,АтрФ,,,,);   //по атрибуту файла источника узнаем, что это каталог или файл
		Если Сред(АтрФ,4,1) = "1" Тогда                    //это каталог
			Если ФС.СуществуетФайл(ВКаталог+"\"+ИмяФ) = 0 Тогда //проверка и когда каталога не существует
				ФС.СоздатьКаталог(ВКаталог+"\"+ИмяФ);      //создали каталог
				СпЗнПодКат.ДобавитьЗначение(ИмяФ);         //добавили в список значений подкаталогов каталог который нужно будет скопировать
			КонецЕсли;
		ИначеЕсли Сред(АтрФ,4,1) = "0" Тогда               //это файл
			Если ФС.СуществуетФайл(ВКаталог+"\"+ИмяФ) = 0 Тогда //файла не существует
				ФС.КопироватьФайл(ИзКаталога+"\"+ИмяФ,ВКаталог+"\"+ИмяФ,1);//скопировали файл
			КонецЕсли;
		КонецЕсли;
		ИмяФ = ФС.НайтиСледующийФайл();
	КонецЦикла; 
	//-------перебираем каталоги следующего уровня для копирования и запускаем рекурсию---------
	Для н1 = 1 По СпЗнПодКат.РазмерСписка() Цикл
		ИмяПодКат = СпЗнПодКат.ПолучитьЗначение(н1);
        КопироватьКаталог(ИзКаталога+"\"+ИмяПодКат,ВКаталог+"\"+ИмяПодКат);
	КонецЦикла;
КонецПроцедуры
Показать
pavelpribytkin96; +1 Ответить
11. user929240 05.03.18 14:00 Сейчас в теме
12. ziercool 38 11.01.19 14:06 Сейчас в теме
Функция КопироватьПереместитьКаталог(СтарыйПуть, НовыйПуть, Переместить = Ложь) Экспорт
	
	Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл
		
		Если НайденныйОбъект.ЭтоКаталог() Тогда
			СоздатьКаталог(СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));			
			Продолжить;
			
		Иначе
			Если Переместить Тогда				
				ПереместитьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
				
			Иначе
				КопироватьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
				
			КонецЕсли;
		КонецЕсли;
				
	КонецЦикла;
	
	Если Переместить Тогда
		Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл
			
			Если НайденныйОбъект.Существует() Тогда
				УдалитьФайлы(НайденныйОбъект.ПолноеИмя);
				
			КонецЕсли;
			 		
		КонецЦикла;	
	КонецЕсли;
	
КонецФункции
Показать
pavelpribytkin96; +1 Ответить
13. Romeooo 78 06.06.19 14:11 Сейчас в теме
(12)
Функция КопироватьПереместитьКаталог(СтарыйПуть, НовыйПуть, Переместить = Ложь) Экспорт

Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл

Если НайденныйОбъект.ЭтоКаталог() Тогда
СоздатьКаталог(СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
Продолжить;

Иначе
Если Переместить Тогда
ПереместитьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));

Иначе
КопироватьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));

КонецЕсли;
КонецЕсли;

КонецЦикла;

Если Переместить Тогда
Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл

Если НайденныйОбъект.Существует() Тогда
УдалитьФайлы(НайденныйОбъект.ПолноеИмя);

КонецЕсли;

КонецЦикла;
КонецЕсли;

КонецФункции
Показать
Спасибо, классный вариант, только падает если файлы идут перед каталогами. Внес небольшие коррективы:

Процедура КопироватьПереместитьКаталог(СтарыйПуть, НовыйПуть, Переместить = Ложь) Экспорт
    
    Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл
        
        Если НайденныйОбъект.ЭтоКаталог() Тогда
            СоздатьКаталог(СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));            
            Продолжить;
            
		Иначе
			КаталогПереносимогоФайла = Новый Файл(СтрЗаменить(НайденныйОбъект.путь, СтарыйПуть, НовыйПуть));
			Если НЕ КаталогПереносимогоФайла.Существует() Тогда
				СоздатьКаталог(КаталогПереносимогоФайла.ПолноеИмя);
			КонецЕсли;
			
            Если Переместить Тогда                
                ПереместитьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
                
            Иначе
                КопироватьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
                
            КонецЕсли;
        КонецЕсли;
                
    КонецЦикла;
    
    Если Переместить Тогда
        Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл
            
            Если НайденныйОбъект.Существует() Тогда
                УдалитьФайлы(НайденныйОбъект.ПолноеИмя);
                
            КонецЕсли;
                     
        КонецЦикла;    
    КонецЕсли;
    
КонецПроцедуры
Показать
user717534; pavelpribytkin96; +2 Ответить
14. Aero 33 26.05.20 07:37 Сейчас в теме
(13) Еще доработал.
У вас копируется/перемещается не сам каталог, а его содержимое.
Я доработал, чтобы каталог целиком копировался и перемещался.

Процедура КопироватьПереместитьКаталог(СтарыйПуть, НовыйПуть, Переместить = Ложь)
	
	// Создадим исходный каталог по новому пути.
	Если Прав(НовыйПуть, 1) <> "\" Тогда
		НовыйПуть = НовыйПуть + "\";
	КонецЕсли;
	Файл = Новый Файл(СтарыйПуть);
	НовыйПуть = НовыйПуть + Файл.Имя;
	СоздатьКаталог(НовыйПуть);
	
	Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл
		
		Если НайденныйОбъект.ЭтоКаталог() Тогда
			СоздатьКаталог(СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));            
			Продолжить;
			
		Иначе
			КаталогПереносимогоФайла = Новый Файл(СтрЗаменить(НайденныйОбъект.путь, СтарыйПуть, НовыйПуть));
			Если НЕ КаталогПереносимогоФайла.Существует() Тогда
				СоздатьКаталог(КаталогПереносимогоФайла.ПолноеИмя);
			КонецЕсли;
			
			Если Переместить Тогда                
				ПереместитьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
				
			Иначе
				КопироватьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
				
			КонецЕсли;
		КонецЕсли;
		
	КонецЦикла;
	
	Если Переместить Тогда
		//Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл
		//    
		//    Если НайденныйОбъект.Существует() Тогда
		//        УдалитьФайлы(НайденныйОбъект.ПолноеИмя);
		//        
		//    КонецЕсли;
		//             
		//КонецЦикла;
		УдалитьФайлы(СтарыйПуть);
	КонецЕсли;
	
КонецПроцедуры
Показать
user717534; +1 Ответить
17. PowerBoy 3367 27.07.22 09:04 Сейчас в теме
(14) Еще доработал :).


Процедура КопироватьПереместитьКаталог(СтарыйПуть, НовыйПуть, Переместить = Ложь)
    
    Если Прав(НовыйПуть, 1) <> "\" Тогда
        НовыйПуть = НовыйПуть + "\";
    КонецЕсли;
    Файл = Новый Файл(СтарыйПуть);
    НовыйПуть = НовыйПуть + Файл.Имя;
    СоздатьКаталог(НовыйПуть);
    Если Прав(НовыйПуть, 1) <> "\" Тогда
        НовыйПуть = НовыйПуть + "\";
    КонецЕсли;
	
    Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл
        
        Если НайденныйОбъект.ЭтоКаталог() Тогда
            СоздатьКаталог(СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));            
            Продолжить;
        Иначе
            КаталогПереносимогоФайла = Новый Файл(СтрЗаменить(НайденныйОбъект.путь, СтарыйПуть, НовыйПуть));
            Если НЕ КаталогПереносимогоФайла.Существует() Тогда
                СоздатьКаталог(КаталогПереносимогоФайла.ПолноеИмя);
            КонецЕсли;
            
            Если Переместить Тогда                
                ПереместитьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
            Иначе
                КопироватьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
            КонецЕсли;
        КонецЕсли;
        
    КонецЦикла;
    
    Если Переместить Тогда
        УдалитьФайлы(СтарыйПуть);
    КонецЕсли;
    
КонецПроцедуры

Показать
15. waol 314 26.06.20 21:51 Сейчас в теме
я конечно извиняюсь, друзья, но зачем столько сложного кода да еще и с рекурсией когда можно воспользоваться FileSystemObject
artichoke; +1 Ответить
16. TipsyKID 15.11.21 12:01 Сейчас в теме
(15)
но зачем столько сложного кода да еще и с рекурсией


Linux.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот