Следующие функции языка 1С позволяют манипулировать файлами:
- СоздатьКаталог 1С
- НайтиФайлы 1С
- КопироватьФайл 1С
- ПереместитьФайл 1С
- УдалитьФайлы 1С
- РазделитьФайл 1С
- ОбъединитьФайлы 1С.
Работа с каталогами — СоздатьКаталог 1С
//создает недостающие каталоги в указанном пути
//если каталога нет – создаст всю вложенную структуру
//если есть D:\Temp, то создаст подкаталоги
СоздатьКаталог("D:\Temp\1\2\3")
Поиск файлов — НайтиФайлы 1С
//найти все файлы 1С в каталоге «Sc»
НайденныеФайлы = НайтиФайлы("D:\Sc", "*");
//найти все ТЕКСТОВЫЕ файлы 1С в каталоге, включая вложенные подкаталоги
НайденныеФайлы = НайтиФайлы("D:\Sc", "*.txt", Истина);
//найти все файлы 1С в каталоге, в имени которых встречается слово "копия"
НайденныеФайлы = НайтиФайлы("D:\Sc", "*копия*");
//найти все файлы 1С в каталоге, в имени которых встречается любая цифра в скобочках, например "(1)" или "(100)"
НайденныеФайлы = НайтиФайлы("D:\Sc", "*(*)*");
//найти все файлы 1С в каталоге, в имени которых встречается цифра в скобочках меньше 10, например "(1)" или "(9)"
НайденныеФайлы = НайтиФайлы("D:\Sc", "*(?)*");
Для каждого Файл из НайденныеФайлы Цикл
Если Файл.ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;
ИмяФайла = Файл.ПолноеИмя;
Сообщить(ИмяФайла);
КонецЦикла;
Копирование, перемещение и удаление файлов — КопироватьФайл 1С, ПереместитьФайл 1С, УдалитьФайлы 1С
ИмяФайла = "Текстовый файл.txt";
КаталогИсточник = "D:\sc\";
КаталогПриемник = "D:\";
//копирование файла
ФайлИсточник = Новый Файл(КаталогИсточник + ИмяФайла);
Если не ФайлИсточник.Существует() или ФайлИсточник.ЭтоКаталог() Тогда
ВызватьИсключение "Файл '" + КаталогИсточник + ИмяФайла + "' не существует или является каталогом";
КонецЕсли;
Попытка
КопироватьФайл(КаталогИсточник + ИмяФайла, КаталогПриемник + ИмяФайла);
Исключение
ВызватьИсключение "Нет прав на копирование файла";
КонецПопытки;
ФайлПриемник = Новый Файл(КаталогПриемник + ИмяФайла);
Если не ФайлПриемник.Существует() или ФайлПриемник.Размер() <> ФайлИсточник.Размер() Тогда
ВызватьИсключение "Не удалось корректно скопировать файл";
КонецЕсли;
//перемещение файла
Попытка
ПереместитьФайл(КаталогИсточник + ИмяФайла, КаталогПриемник + ИмяФайла);
Исключение
ВызватьИсключение "Нет прав на копирование файла";
КонецПопытки;
ФайлПриемник = Новый Файл(КаталогПриемник + ИмяФайла);
Если не ФайлПриемник.Существует() Тогда
ВызватьИсключение "Не удалось корректно перенести файл";
КонецЕсли;
Разделение и слияние файлов — РазделитьФайл 1С, ОбъединитьФайлы 1С
//функция создает каталог с именем файла
//в нем создает разделенные части файла, каждая размером в указанное кол-во мегабайт
//каждую часть сжимает архиватором
//возвращает имя каталога
[VIP_CONTENT]
Функция РазделениеФайла(ИмяФайла, МбЧасть)
//проверим, что файл существует и он не каталог
Файл = Новый Файл(ИмяФайла);
Если не Файл.Существует() или Файл.ЭтоКаталог() Тогда
ВызватьИсключение "Файл не найден или является каталогом или найдено больше одного файла с указанным именем";
КонецЕсли;
//МБЧасть - это требуемый размер части файла в мегабайтах
//проверим, что в параметре не забыли указать корректный размер
//проверим, что файл больше чем заданный размер, иначе как его разрезать?
Если МбЧасть <= 0 или Файл.Размер() <= МбЧасть *1024 *1024 Тогда
ВызватьИсключение "Файл не требуется разделять, так как он меньше, чем требуемый размер";
КонецЕсли;
//создадим каталог, где имя каталога равно имени файла + ".parts"
ИмяКаталога = ВРЕГ(ИмяФайла + ".parts\");
Попытка
СоздатьКаталог(ИмяКаталога);
Исключение
ВызватьИсключение "Нет прав на создание каталога: " + ОписаниеОшибки();
КонецПопытки;
//разделим файл на части
//имя файла - что делить
//второй параметр - размер в байтах каждой части (последняя меньше - по остатку)
//имя каталога - где создавать части файла, если не указать - части будут созданы там же, где и файл-источник
ИменаЧастейФайла = РазделитьФайл(ИмяФайла, МбЧасть *1024 *1024, ИмяКаталога);
//пройдем по частям и заархивируем их
Для каждого ИмяЧастиФайла из ИменаЧастейФайла Цикл
//первый параметр - имя файла zip
//четвертый и пятый параметры - метод архивации
//мы создаем ПУСТОЙ архив
Зип = Новый ЗаписьZipФайла(ИмяЧастиФайла + ".zip",,, МетодСжатияZIP.Сжатие, УровеньСжатияZIP.Максимальный);
//теперь в пустой архив добавляем файл - одну часть файла
Зип.Добавить(ИмяЧастиФайла);
//записываем архив и закрываем
Зип.Записать();
//файл части удаляем, оставим только созданный архив
УдалитьФайлы(ИмяЧастиФайла);
КонецЦикла;
Сообщить("Разделение файла завершено");
Возврат ИмяКаталога;
КонецФункции
//функция обратная разделению - разархивирует части файла, производит слияние в файл с именем каталога
//возвращает имя файла
Функция СлияниеФайла(ИмяКаталога)
//проверим, что каталог с таким именем есть и является каталогом
Файл = Новый Файл(ИмяКаталога);
Если не Файл.Существует() или не Файл.ЭтоКаталог() Тогда
ВызватьИсключение "Каталог не найден или не является каталогом";
КонецЕсли;
//в каталоге найдем все файлы с расширением zip
//аккуратно - мы не проверяем их наименование, допущение, что каталог с файлами создан предыдущим методом
мЧастейФайла = НайтиФайлы(?(Прав(СокрП(ИмяКаталога), 1) = "\", ИмяКаталога, ИмяКаталога + "\"), "*.zip");
Если мЧастейФайла.Количество() < 2 Тогда
ВызватьИсключение "В каталоге отсутствуют zip файлы или их количество менее двух";
КонецЕсли;
//все имена добавим в список значений, чтобы отсортировать в верном порядке (допущение то же, что и в предыдущей строке)
спЧастейФайла = Новый СписокЗначений();
Для каждого ИмяЧастиФайла из мЧастейФайла Цикл
спЧастейФайла.Добавить(ИмяЧастиФайла.ПолноеИмя);
КонецЦикла;
спЧастейФайла.СортироватьПоЗначению();
//мы будем разархивировать части файла из архива, сохраним их имена в массив, чтобы удалить после объединения
мФайловДляУдаления = Новый Массив();
//идем в цикле по списку найденных заархивированных частей файла
Для каждого ЧастьФайла из спЧастейФайла Цикл
//параметр архиватора - имя файла с заархивированной частью файла
Зип = Новый ЧтениеZipФайла(ЧастьФайла.Значение);
//каждый архив содержит от одного до нескольких файлов ("элементов"), проверим что архив не пустой
Если Зип.Элементы.Количество() = 0 Тогда
ВызватьИсключение "Ошибка. Файл '" + Файл.Значение + "' некорректный zip файл.";
КонецЕсли;
//убираем из имени архива части файла расширение zip - должно остатся то имя, которое было до архивации
ЧастьФайла.Значение = СтрЗаменить(ВРЕГ(ЧастьФайла.Значение), ".ZIP", "");
//извлекаем файлы из архива
//первый параметр - файл в архиве ("элемент архива")
//второй параметр - имя файла, в который будем разархивировать
Зип.Извлечь(Зип.Элементы[0], ЧастьФайла.Значение);
//разархивированный файл нужно будет удалить, сохраним имя файла в массив
мФайловДляУдаления.Добавить(ЧастьФайла.Значение);
//запомним фактическое имя разархивированного файла
ЧастьФайла.Значение = ЧастьФайла.Значение + "\" + Зип.Элементы[0].Имя;
КонецЦикла;
//имя файла, в который будем производить объединение
ИмяФайла = Файл.Путь + Файл.ИмяБезРасширения;
//производим объединение
//первый параметр - массив имен файлов (полных имен, с каталогом)
//второй параметр - имя конечного файла, в которой производится объединение
Попытка
ОбъединитьФайлы(спЧастейФайла.ВыгрузитьЗначения(), ИмяФайла);
Исключение
ВызватьИсключение "Ошибка объединения файлов: " + ОписаниеОшибки();
КонецПопытки;
//удалим разархивированные части, чтобы осталось "все как было"
Для каждого ИмяЧастиФайла из мФайловДляУдаления Цикл
УдалитьФайлы(ИмяЧастиФайла);
КонецЦикла;
Сообщить("Объединение файла завершено");
КонецФункции
[/VIP_CONTENT]