Консультация № 172395
21.09.2009, 06:05
0.00 руб.
0 7 2
Добрый день, уважаемые эксперты!
У меня есть вот такой нестандартный вопрос.
Есть имя файла и/или папки. Нужно получить короткое имя (DOS-имя) как это сделать в 1Cv7.7
Заранее спасибо.

Обсуждение

Неизвестный
21.09.2009, 08:48
общий
21.09.2009, 13:16
это ответ
Здравствуйте, Vlads_K.
Есть функции работы со значениями типа строка:
1. Найти, нужно найти в этой строке последний символ "". Т.е. номер его позиции в строке.
2. Потом вычислить длину строки с помощью функции СтрДлина
3. Потом с помощью функции Прав, отрезать конец строки длиной (СтрДлина - позиция последнего "")
4. Полученная подстрока и будет коротким именем файла.

Приложение:
Встроенные функции языка
Найти (Find)
Синтаксис:
Найти(<Строка>, <Подстрока поиска>)
Параметры:
<Строка> (обязательный)
Тип: Строка. Исходная строка.
<Подстрока поиска> (обязательный)
Тип: Строка. Искомая подстрока.
Возвращаемое значение:
Тип: Число. Позиция первого знака найденной подстроки. Нумерация символов в строке начинается с 1. Если строка не содержит указанной подстроки, то возвращается 0.
Описание:
Находит вхождение искомой строки как подстроки в исходной строке.
Пример:
Если Найти(Сотрудник.Имя, "Борис") > 0 Тогда
Сообщить(Сотрудник.Имя + " таб. №" + Сотрудник.Код);
КонецЕсли;

Встроенные функции языка
СтрДлина (StrLen)
Синтаксис:
СтрДлина(<Строка>)
Параметры:
<Строка> (обязательный)
Тип: Строка. Исходная строка.
Возвращаемое значение:
Тип: Число. Длина строки.
Описание:
Получает количество символов в строке.
Пример:
ДлинаНаименования = СтрДлина(Товар.Наименование);

Встроенные функции языка
Прав (Right)
Синтаксис:
Прав(<Строка>, <Число символов>)
Параметры:
<Строка> (обязательный)
Тип: Строка. Исходная строка.
<Число символов> (обязательный)
Тип: Число. Количество выбираемых символов.
Возвращаемое значение:
Тип: Строка. Строка выбранных символов.
Описание:
Выбирает последние справа символы строки.
Пример:
// Пусть номер автомобиля в справочнике основных средств задается
// в виде х999хх99, где последние две цифры - код региона.
// Получим код региона из номера.
КодРегиона = Прав(ОсновноеСредство.ГосНомер, 2);
Неизвестный
21.09.2009, 09:12
общий
это ответ
Здравствуйте, Vlads_K.
Можно попробывать вот так:
Я думаю все понятно:
ДлинныйПуть - исходный файл
КороткийПуть - DOS имя тогоже файла
Файл ДлинныйПуть должен существовать
PS
в случае русских букв в пути будут определенные сложности.
как исправить - пока не знаю. Придумаю - напишу

Приложение:
Процедура Выполнить()
ДлинныйПуть = "C:\Documents and Settings\1.txt";
Фо = СоздатьОбъект("Scripting.FileSystemObject");
Фл = Фо.GetFile(ДлинныйПуть);
КороткийПуть = Фл.ShortPath;
Фл = "";
Фо = "";
Сообщить(КороткийПуть);
КонецПроцедуры
5
Идея понятна, но у меня при команде <br>Фл = Фо.GetFile(ДлинныйПуть);<br>Система выдаёт ошибку:<br>Фл = Фо.GetFile(ДлинныйПуть);<br>{S:\EVEREST\BASE\EXTFORMS\66.ERT(5)}: : <br><br>Что это может быть?
Неизвестный
21.09.2009, 10:28
общий
Piter:
Piter!
Ваш ответ лучше моего - процедура проще. Но выводит весь путь, не получает конкретно имя файла. Хотя действует верно!

Если Вы допишете отделение именно имени файла, я откорректирую Ваш ответ!
Неизвестный
21.09.2009, 11:08
общий
Piter:
Как исправить русские буквы в длинном пути - заключить путь в двойные кавычки:

ДлинныйПуть = """C:\Documents and Settings\1.txt""";
Неизвестный
21.09.2009, 13:45
общий
Vlads_K:
Перенес в мини-форум.

Здравствуйте, Vlads_K.

Это очень просто. Можно обойтись только стандартными, встроенными в платформу методами: обе платформы, и 7.х, и 8.х поддерживают выполнение программ, а следовательно запуск интерепретатора команд и из него выполнение команд DOS.

Прежде всего, сама DOS дает возможность выводе коротких имен файлов, т.е. в формате 8.3 именно так, как она их и представляет. Этим и воспользуемся. Параметр, включающий такую возможноcть - /X.

Команды DOS поддерживают перенаправление вывода сообщений в указанный файл или устройство. Например, команда DOSDir /x> prn выведет список каталога с короткими именами на принтер, а команда DOSDir /x > text.txt в текстовый файл text.txt. Воспользуемся вторым способом - вывод результатов в файл и потом его распарсим.

Для простоты примера используем интерпретатор командной строки Windows XP, имя нужного файла или папки поместим в переменную имя_файла_или_папки. Чтобы "поймать" имя папки, необходимо найти родительский каталог этой папки (всё, что слева от последнего слэша). В прилагаемой обработке это делает функция ПолучитьКаталог(ВыбФайл).

Можно решить двумя способами: сгенерировать командный файл с командой dir имя_файла_или_папки /x > named8_3.txt и запустить интерпретатор команденой строки (в Windows 9.x это файл command.com, а в Windows с ядром NT - Windows NT, 200x, XP, Vista, Seven - cmd.exe) этот файл как параметр, или же эту команду выполнить процедурой КомандаСистемы("dir
имя_файла_или_папки /x > named8_3.txt");
.

Вот пример:
Код:
ФайлДляПарсинга = КаталогПользователя()+"named8_3.txt";
КомандаСистемы("dir """+имя_файла_или_папки+""" /x > "+ФайлДляПарсинга); // в двойные кавычки поместим длинное имя
Текст = СоздатьОбъект("Текст");
Текст.КодоваяСтраница(1); // кодировка DOS
Текст.Открыть(ФайлДляПарсинга);
Текст.Показать();
НомерСтроки = Текст.КоличествоСтрок()-3; // строка с именем файла - 4-я снизу
Сообщить("Короткое имя файла """+имя_файла_или_папки+""": "+Сред(Текст.ПолучитьСтроку(НомерСтроки), 37, 12)); // начиная с 37-й позиции, 12 символов включительно (8+3+точка)


Готовую обработку прикрепил к ответу. Дополнительно её можно скачать с сервера rfpro.ru (доступен до 21.03.2010 г.).

Успехов!
С уважением, Владимир.

P.S. Пока писал обработку, поступил замечательный ответ от Piter - он лаконичен и сразу показывает нужный результат даже для папки. Про объект Scripting я как-то забыл.
По крайней мере, из моей обработки можно взять процедуру определения имени файла.
Неизвестный
22.09.2009, 08:44
общий
Vlads_K:
1. По-поводу вопроса

>>Комментарий к оценке: Идея понятна, но у меня при команде
>>Фл = Фо.GetFile(ДлинныйПуть);
>>Система выдаёт ошибку:
>>Фл = Фо.GetFile(ДлинныйПуть);
>>{S:\EVEREST\BASE\EXTFORMS\66.ERT(5)}: :

Файл точно существует? Скорее всего нет.

2. Как верно указал Владимир Лазурко по заданию требоволось только ИМЯ файла а не путь, поэтому вместо ShortPath следует испльзовать ShotrName

Учитывая все вышеописанное пример должен быть примерно такой:
Код:

Процедура Выполнить()
ДлинныйПуть = "C:\Documents and Settings\All Users\Главное меню\Desktop.ini";
Фо = СоздатьОбъект("Scripting.FileSystemObject");
Если Фо.FileExists(ДлинныйПуть) = -1 Тогда
Фл = Фо.GetFile(ДлинныйПуть);
КороткоеИмя = Фл.ShortName;
Сообщить(КороткоеИмя);
Иначе
Сообщить("Файл не существует.");
КонецЕсли;
Фл = "";
Фо = "";
КонецПроцедуры

P.S.
В условии сравнение идет на -1 поскольку VisualBasic именно так и выглядит True а ActiveX и VB неразлучны :-)
Неизвестный
22.09.2009, 11:01
общий
Piter:
Спасибо большое, уже догадался.
Форма ответа