Страница 1 из 3
Использование длинных путей Pascal
Добавлено: 16 фев 2007, 00:12
mons
При использовании chdir('путь'), если длина пути превышает порядка 68 символов, выдается ошибка path not found.
С какой стороны это можно обойти?
Спасибо за внимание.
Добавлено: 16 фев 2007, 16:55
mons
Да, кажись чё-то не то спросил...
Может хоть идеи какие есть, буду признателен.
Не хочется на другой язык прогу перекладывать из-за этого.
Re: Использование длинных путей Pascal
Добавлено: 16 фев 2007, 17:10
somewhere
Хочу заметить, что ChDir использует DOS имена, т.е. формата 8:3. Такая ошибка, типа "путь не найден" возникает при использовании длинных имен файлов или каталогов. Есть ли в пути нечто подобное?
Добавлено: 16 фев 2007, 21:17
mons
Да нет, тут дело не в этом.
Pascal просто отказывается видеть путь длиней 68 символов.
Попробуйте например найти у себя на компе самый дальний угол и засунуть туда файл, с расширением *.pas. А потом запустить его, если в обычных ситуациях он запускается, то из дальних папок, общая длина пути которых превышает магическое число 68 это не получится.
Да кстати, пользую Pascal 7.0 под WinXP.
Re: Использование длинных путей Pascal
Добавлено: 17 фев 2007, 01:45
Колядин Максим
Могу сказать, что данной ошибки избежать невозможно. У меня когда-то тоже проблемка была - с расширением файла в ДОС. Как выяснилось, здесь много ограничений с длинной имени файла, длинной расширения, и длинной пути. Но всё же, в дос существуют специальные имена - если имя файла/каталога превышает 8 символов, то имя сокращается да 6-ти, далее "~1". Например папка Pragram files в ДОС'e будет как "PROGRA~1", папка "QWERTYUIO" - "QWERTY~1" и т.д.
Добавлено: 17 фев 2007, 14:30
mons
C cокращениями все правильно (Progra~1 и т. д.), только когда каталогов штук 8 наберется, и общая длина пути станет больше 68 все опять же упирается в стенку.
Ладно похоже одно из непреодолимых ограничений на длину пути. Пожалуй с этим вопросом, если только к разработчикам лезть, чтоб поправили в будущем.
Пошел посвежей версию Pascalя поищу. Пора вылазить из DOSа.
Можно закрывать ветку.
Re: Использование длинных путей Pascal
Добавлено: 19 фев 2007, 14:29
somewhere
" писал(а):Можно закрывать ветку.
А вот и зря, хотел предложить режение через ассемблер.
Re: Использование длинных путей Pascal
Добавлено: 19 фев 2007, 19:22
mons
" писал(а):А вот и зря, хотел предложить режение через ассемблер.
А вот это можно, с удовольствием поглядел бы
Re: Использование длинных путей Pascal
Добавлено: 20 фев 2007, 09:30
somewhere
Код: Выделить всё
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 ругнется, что не может сохранить настройки (путь ведь поменяли)
- в строке приглашения интерпретатора видим, что сидим в той папке, где надо.
Re: Использование длинных путей Pascal
Добавлено: 20 фев 2007, 18:25
mons
Спасибо большое. Ща попробуем.