Работа с файловой системой из 1С

Следующие функции языка 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]