Адрес этой странички :
http://doc-prg.narod.ru/art_00100/art_00100.htm
Дата обновления : 12.07.2009
© 12.07.2009 Сергей Попов
1Cv7.
Некоторые полезные алгоритмы.
Файлы-Каталоги.
Статью в виде файла (7 кб) можно скачать здесь: art_00100.zip
1. Проверить на корректность имя Каталога.
//Возвращает "обработанное" имя каталога
Функция сп_НормализоватьИмяКаталога(ИмяКаталога)
NameDir = ИмяКаталога;
NameDir = СокрЛП(NameDir);
Если СтрДлина(NameDir)<=0 Тогда
NameDir = "A:\"; //Это если уж совсем ничего не назначено
КонецЕсли;
Если Прав(NameDir,1)<>"\" Тогда
NameDir = NameDir+"\";
КонецЕсли;
Возврат NameDir;
КонецФункции //сп_НормализоватьИмяКаталога
2. Проверить, это корневой каталог
//Возвращает 1, если каталог (заданный в ИмяКаталога) - КОРНЕВОЙ, 0-в противном случае
Функция сп_ЭтоКорневойКаталог(ИмяКаталога)
Перем Res; //целое
Res=0;
Sx=СокрЛП(ИмяКаталога);
Если СтрДлина(Sx)=3 Тогда
Если Найти(Sx,":\")=2 Тогда
Res=1;
КонецЕсли;
КонецЕсли;
Возврат Res;
КонецФункции //сп_ЭтоКорневойКаталог
3. Нормализовать КОРОТКОЕ имя файла.
//Заменяет некорректные символы (включая пробелы и "лишние" точки) из имени файла
//Возвращает "обработанное" имя файла
Функция сп_НормализоватьКороткоеИмяФайла(ИмяФайла)
Перем I,N,nEndPoint;
Перем ИмяФайлаВозвр;
ИмяФайлаВозвр = СокрЛП(ИмяФайла);
nEndPoint = 0; //положение точки (расширения), если расширение было
N=СтрДлина(ИмяФайлаВозвр);
Если N>0 Тогда
//Найдем позицию последней точки, если она есть
I=0;
Пока I<N Цикл
I=I+1;
S1=Сред(ИмяФайлаВозвр,I,1);
Если S1="." Тогда
nEndPoint = I;
КонецЕсли;
КонецЦикла;
//Уберем некорретные символы
ИмяФайлаВозвр=СтрЗаменить(ИмяФайлаВозвр, "/", "-");
ИмяФайлаВозвр=СтрЗаменить(ИмяФайлаВозвр, "\", "-");
ИмяФайлаВозвр=СтрЗаменить(ИмяФайлаВозвр, ":", "-");
ИмяФайлаВозвр=СтрЗаменить(ИмяФайлаВозвр, ".", "-");
ИмяФайлаВозвр=СтрЗаменить(ИмяФайлаВозвр, "?", "_");
ИмяФайлаВозвр=СтрЗаменить(ИмяФайлаВозвр, "*", "_");
ИмяФайлаВозвр=СтрЗаменить(ИмяФайлаВозвр, "'", "_");
ИмяФайлаВозвр=СтрЗаменить(ИмяФайлаВозвр, " ", "_");
Если nEndPoint>0 Тогда
//Было расширение - вернем точку на место
Sx="";
N=СтрДлина(ИмяФайлаВозвр);
I=0;
Пока I<N Цикл
I=I+1;
Если I<>nEndPoint Тогда
Sx=Sx+Сред(ИмяФайлаВозвр,I,1);
Иначе
Sx=Sx+".";
КонецЕсли;
КонецЦикла;
ИмяФайлаВозвр=Sx;
КонецЕсли;
КонецЕсли;
Возврат ИмяФайлаВозвр;
КонецФункции //сп_НормализоватьКороткоеИмяФайла
4. Проверить-выбрать каталог(папку)
//Проверяет свободное место на диске(заданном в имени каталога ИмяКаталога)
//Если кол-во свободного места (в байтах) меньше, чем значение MinКолвоБайтНаДиске,
//то выдается диалог для выбора иного каталога.
//Если MinКолвоБайтНаДиске = 0, то проверка на наличие свободного места НЕ производится.
Функция сп_ПроверитьНазначитьКаталог(MinКолвоБайтНаДиске,ИмяКаталога)
Перем Res; //целое, возвращаемое значение
Перем NameDir,ИмяДиска;
Перем Exit99,Yes;
Перем MinByte,СвобМесто;
Res=0;
СвобМесто = 0;
MinByte = ЧИСЛО(MinКолвоБайтНаДиске);
ИмяКаталога=сп_НормализоватьИмяКаталога(ИмяКаталога);
NameDir=ИмяКаталога;
Exit99=0;
Пока Exit99<=0 Цикл
ИмяДиска=Лев(NameDir,1)+":";
СвобМесто=ЧИСЛО(ФС.СвободноеМестоНаДиске(ИмяДиска));
Если СвобМесто<(-1) Тогда
СвобМесто=СвобМесто*(-1);//Это нейтрализация глюка в 1C для больших дисков
КонецЕсли;
Yes=0;
Если MinByte<>0 Тогда //ограничение на свободное место задано
Если СвобМесто<MinByte Тогда
//Места НЕ хватает на диске - выдать диалог для смены Каталога
Sx="Не хватает места на диске "+ИмяДиска+" (или он отсутствует)!";
Sx=Sx+" Смените диск или укажите иной каталог на Винче";
Сообщить(Sx);
Yes=1;
КонецЕсли;
КонецЕсли;
Если Yes>0 Тогда
Если ФС.ВыбратьКаталог(NameDir,"Выберите Каталог")<>1 Тогда
//Отказ Пользователя от выбора каталога
Sx="Продолжение НЕвозможно из-за отказа Пользователя указать соотв.каталог";
Сообщить(Sx);
Exit99=1;
Res=0;
КонецЕсли;
Иначе
//Места на диске хватает - Все ОК или нас это не волнует
ИмяКаталога=NameDir;
Exit99=2;
Res=1;
КонецЕсли;
КонецЦикла;
Возврат Res;
КонецФункции //сп_ПроверитьНазначитьКаталог
5. Получить список файлов заданного каталога по заданной маске
//Список файлов возвращается в переменной типа ТЕКСТ.
//Сама функция возвращает кол-во строк (файлов) в переменной СписФайлов
Функция сп_ПолучитьСписокФайлов(ИмяКаталога,МаскаФайлов,СписФайлов)
Перем Res,Exit99; //целые
Перем S1,CurFile,NameDir,Mask; //строки
Res = 0;//Возвращаемое значение(кол-во файлов)
NameDir=сп_НормализоватьИмяКаталога(ИмяКаталога);
Mask=СокрЛП(МаскаФайлов);
СписФайлов.Очистить();
Если СтрДлина(NameDir)>0 Тогда
Если СтрДлина(Mask)<=0 Тогда
Mask="*.*"; //если маска файлов НЕ задана, то выбираем ВСЕ
КонецЕсли;
CurFile = СокрЛП(ФС.НайтиПервыйФайл(NameDir+Mask));
Если СтрДлина(CurFile)>0 Тогда
S1=Лев(CurFile,1);
Если S1<>"." Тогда //Это НЕ каталог по правилам MS DOS
СписФайлов.ДобавитьСтроку(CurFile);
КонецЕсли;
Exit99=0;
Пока Exit99<=0 Цикл
CurFile = СокрЛП(ФС.НайтиСледующийФайл());
Если СтрДлина(CurFile)>0 Тогда
S1=Лев(CurFile,1);
Если S1<>"." Тогда //Это НЕ каталог по правилам MS DOS
СписФайлов.ДобавитьСтроку(CurFile);
КонецЕсли;
Иначе
Exit99=1; //Все файлы выбраны - выход из цикла
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Res=СписФайлов.КоличествоСтрок();//Кол-во найденных файлов
Возврат Res;
КонецФункции //сп_ПолучитьСписокФайлов
© 12.07.2009 Сергей Попов