Использование длинных путей Pascal

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

mons
Сообщения: 12
Зарегистрирован: 15 фев 2007, 23:55

При использовании chdir('путь'), если длина пути превышает порядка 68 символов, выдается ошибка path not found.
С какой стороны это можно обойти?
Спасибо за внимание.
mons
Сообщения: 12
Зарегистрирован: 15 фев 2007, 23:55

Да, кажись чё-то не то спросил...
Может хоть идеи какие есть, буду признателен.
Не хочется на другой язык прогу перекладывать из-за этого.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Хочу заметить, что ChDir использует DOS имена, т.е. формата 8:3. Такая ошибка, типа "путь не найден" возникает при использовании длинных имен файлов или каталогов. Есть ли в пути нечто подобное?
It's a long way to the top if you wanna rock'n'roll
mons
Сообщения: 12
Зарегистрирован: 15 фев 2007, 23:55

Да нет, тут дело не в этом.
Pascal просто отказывается видеть путь длиней 68 символов.
Попробуйте например найти у себя на компе самый дальний угол и засунуть туда файл, с расширением *.pas. А потом запустить его, если в обычных ситуациях он запускается, то из дальних папок, общая длина пути которых превышает магическое число 68 это не получится.
Да кстати, пользую Pascal 7.0 под WinXP.
Аватара пользователя
Колядин Максим
Сообщения: 297
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

Могу сказать, что данной ошибки избежать невозможно. У меня когда-то тоже проблемка была - с расширением файла в ДОС. Как выяснилось, здесь много ограничений с длинной имени файла, длинной расширения, и длинной пути. Но всё же, в дос существуют специальные имена - если имя файла/каталога превышает 8 символов, то имя сокращается да 6-ти, далее "~1". Например папка Pragram files в ДОС'e будет как "PROGRA~1", папка "QWERTYUIO" - "QWERTY~1" и т.д.
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
mons
Сообщения: 12
Зарегистрирован: 15 фев 2007, 23:55

C cокращениями все правильно (Progra~1 и т. д.), только когда каталогов штук 8 наберется, и общая длина пути станет больше 68 все опять же упирается в стенку.
Ладно похоже одно из непреодолимых ограничений на длину пути. Пожалуй с этим вопросом, если только к разработчикам лезть, чтоб поправили в будущем.
Пошел посвежей версию Pascalя поищу. Пора вылазить из DOSа.
Можно закрывать ветку.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):Можно закрывать ветку.
А вот и зря, хотел предложить режение через ассемблер.
It's a long way to the top if you wanna rock'n'roll
mons
Сообщения: 12
Зарегистрирован: 15 фев 2007, 23:55

&quot писал(а):А вот и зря, хотел предложить режение через ассемблер.
А вот это можно, с удовольствием поглядел бы
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Код: Выделить всё

procedure ChDir(path : String);
begin
path := path + #0;
asm
push ds
push ss
pop ds
mov ah, 3bh
lea dx, path + 1
int 21h
pop ds
end;end;
Usage

Код: Выделить всё

ChDir('d:\other\pascal\abcde\abcde\abcde\abcde\abcde\abcde\abcde\abcde\abcde\abcde\abcde\abcde\abcde');
Вставляй в свой код и все будет ОК. Хотя функция Set current dir прерывания MS-DOS все же и возвращает код неудачи, но каталог меняет, т.к. параметры - null terminated (ASCIIZ) string, собственно никаких ограничений на длину не накладывается. Код неудачи - следствие внутренней функции MS-DOS проверки существования пути. Сам паскаль, точнее, функция ChDir(стандартная) использует другой номер функции, в которой путь представлен ASCIIZ 64-байтным массивом. Отсюда возможно магическое число 68, т.к. добавляются слеши и имя диска с двоеточием. Примечательно, что GetDir дает урезанный до 64 символов путь, хотя сам путь все-же остается правильным. Эту функцию также можно заменить через вызов других функций MS-DOS для получения текущего каталога.

Self test:
- запускаем интерпретатор cmd (WinXP,NT,2K) или command (Win95,98)
- запускаем через него среду TP
- меняем путь на "дальний угол", запустив программу
- выходим из среды, при этом TP ругнется, что не может сохранить настройки (путь ведь поменяли)
- в строке приглашения интерпретатора видим, что сидим в той папке, где надо.
It's a long way to the top if you wanna rock'n'roll
mons
Сообщения: 12
Зарегистрирован: 15 фев 2007, 23:55

Спасибо большое. Ща попробуем.
Ответить