Страница 3 из 3

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

Добавлено: 02 мар 2007, 11:55
somewhere
Товарисч mons, с вас чипсы и пиво, :-) , здесь данных на целый модуль.
Все протестино и работает, за комментами сюда или в личку.

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

{ (C) Somewhere 01.03.07 00:37 }
const
  FAM_Read = 0; {File access mode}
  FAM_Write = 1;
  FAM_ReadWrite = 2;
  FSM_Compat = 0; { File share mode }
  FSM_DenyAll = 16;
  FSM_DenyWrite = 32;
  FSM_DenyRead = 48;
  FSM_DenyNone = 64;
  FAC_ReadOnly = 1; { File attribute constant }
  FAC_Hidden = 2;
  FAC_System = 4;
  FAC_Volume = 8;
  FAC_Archive = 32;
var
  IOError : Word;
  hFile   : Word;
  rCount  : Word;
  Buf     : Array[0..199] of Word;

procedure OpenFile(var fHandle: Word; fPath :String; fAccessMode: Byte);
var h: Word;
begin
fPath := fPath + #0;
asm
push ds
push ss
pop ds
lea dx, fPath
inc dx
mov al, fAccessMode
mov ah, 3Dh
int 21h
pop ds
jnc @noerr
mov IOError, ax
jmp @ex
	@noerr:
mov h, ax
	@ex:
end;
fHandle := h;
end;

procedure CreateFile(var fHandle: Word; fPath :String; fAttr: Byte);
var h : Word;
begin
fPath := fPath + #0;
asm
push ds
push ss
pop ds
mov cl, fAttr
sub ch, ch
lea dx, fPath + 1
mov ah, 3Ch
int 21h
pop ds
jnc @noerr
mov IOError, ax
jmp @ex
	@noerr:
mov h, ax
	@ex:
end;
fHandle := h;
end;

procedure CloseFile(fHandle:Word);
begin
asm
mov bx, fHandle
mov ah, 3Eh
int 21h
jnc @ex
mov IOError, ax
	@ex:
end;end;

procedure ReadFile(fHandle: Word; Buffer :Pointer; Count: Word);
begin
asm
lea bx, buffer
mov dx, ss:[bx]
mov cx, ss:count
mov bx, ss:fHandle
mov ah, 3Fh
int 21h
jnc @ex
mov IOError, ax
	@ex:
end;
end;

procedure ReadFileEx(fHandle: Word; Buffer :Pointer; Count:Word; var Readed: Word);
var h : Word;
begin
asm
lea bx, buffer
mov dx, ss:[bx]
mov cx, ss:count
mov bx, ss:fHandle
mov ah, 3Fh
int 21h
jnc @noerr
mov IOError, ax
jmp @ex
	@noerr:
mov h, ax
	@ex:
end;
Readed := h;
end;

procedure WriteFile(fHandle: Word; Buffer :Pointer; Count: Word);
begin
asm
lea bx, buffer
mov dx, ss:[bx]
mov cx, ss:count
mov bx, ss:fHandle
mov ah, 40h
int 21h
jnc @ex
mov IOError, ax
	@ex:
end;
end;

procedure SetFilePosition(fHandle:Word; fPosition:Longint); { Seek analog }
begin
asm
mov ax, 4200h
mov bx, ss:fHandle
mov dx, word ptr ss:fPosition
mov cx, word ptr ss:fPosition+2
int 21h
end;end;

function GetFilePosition(fHandle:Word):Longint; { FilePos analog }
var h: Longint;
begin
asm
mov ax, 4201h
mov bx, ss:fHandle
xor dx, dx
xor cx, cx
int 21h
mov word ptr h, ax
mov word ptr h+2, dx
end;
GetFilePosition := h;
end;

function GetFileSize(fHandle:Word):Longint; { FileSize analog }
var h: Longint;
begin
asm
mov ax, 4202h
mov bx, ss:fHandle
xor dx, dx
xor cx, cx
int 21h
mov word ptr h, ax
mov word ptr h+2, dx
end;
GetFileSize := h;
end;

begin
OpenFile(hFile, 'D:\Other\Pascal\abcde\abcde\abcde\abcde\abcde\abcde\abcde\abcde\abcde\abcde\aaaddd.fff', FAM_ReadWrite);
ReadFileEx(hFile, @Buf, 100, rCount);
SetFilePosition(hFile, 10);
WriteFile(hFile, @Buf, rCount);
Writeln(GetFileSize(hFile));
end.

"Нет ребята, все не так, все не так, ребята..."

Добавлено: 02 мар 2007, 12:30
BBB
somewhere писал(а):Товарисч mons, с вас чипсы и пиво, :-) , здесь данных на целый модуль.
Все протестино и работает, за комментами сюда или в личку.
Нет ребята...
Все-таки, насколько я помню, окраничение в 79 символов на длину пути - это не "паскалевско-Борландовское изобретение", это какое-то ограничение DOS.

Ну нельзя не в 32-разрядных приложениях (какие создает Pascal 7.0) достучаться до файлов по имени, если его длина более 79 символов. Ну не из вредности же они объявили
в модуле DOS тип PathStr как string[79] !


somewhere, извини, но не пашет твоя программа, скомпилированная 7-м Паскалем.

В процедуре OpenFile попадаю (ходил отладчиком пошагово) на оператор
mov IOError, ax
Код ошибки - 3 (троечка). Т.е. "Path not found"
Кстати, в fHandle (из дальнейшего оператора fHandle := h;) естественно попадает какая-то муть, так как переменная h в этом случае оказывается непроинициализирована.

Укоротил чуть-чуть путь, так чтобы длина "уложилась" в 79 символов
(вместо
'D:\Other\Pascal\abcde\abcde\abcde\abcde\abcde\abcde\abcde\abcde\abcde\abcde\aaaddd.fff'
указал
'D:\Other\Pascal\abcde\abcde\abcde\abcde\abcde\abcde\abcde\abcde\aaaddd.fff')
- файл успешно открылся.


Разумеется, оба файла СУЩЕСТВОВАЛИ.

UPD: Когда смотрю свое сообщение, то вижу, что в обоих именах файлов в одном из каталогв виден пробел: '\abc de\'. Это какой-то глюк форума. На самом деле там, разумеется, никаких пробелов нет!

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

Добавлено: 02 мар 2007, 12:43
namomelkor
Можно парсить строку пути и рекурсивно делать chdir() последовательно для каждой папки а потом работать с файлов в этой папке без указания пути.

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

Добавлено: 02 мар 2007, 12:52
somewhere
Но это все же лучше, чем 64. Насчет мути в fHandle - туда попадает код ошибки. Конечно, код не доработанный, можно поставить if IOError <> 0 then fHandle := h; и первоначально IOError := 0;
Насчет 80 символов - хрен знает, у меня на диске 20 уровней вложенности \abcde - до последнего достукиваюсь. Может DOS эмуляторы разные ???
&quot писал(а):Можно парсить строку пути и рекурсивно делать chdir() последовательно для каждой папки а потом работать с файлов в этой папке без указания пути.
MS-DOS все равно внутри себя собирает все пути в единый - проверял, не канает

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

Добавлено: 02 мар 2007, 13:35
BBB
somewhere писал(а):Но это все же лучше, чем 64. Насчет мути в fHandle - туда попадает код ошибки. Конечно, код не доработанный, можно поставить if IOError <> 0 then fHandle := h; и первоначально IOError := 0;
Насчет 80 символов - хрен знает, у меня на диске 20 уровней вложенности \abcde - до последнего достукиваюсь. Может DOS эмуляторы разные ???
1. Нет, не код ошибки. Именно не проинициализированное ничем (в случае ошибки открытия файла) значение локальной переменной h.
2. Фиг знает. У меня здесь Win2000.
somewhere писал(а):
namomelkor писал(а):Можно парсить строку пути и рекурсивно делать chdir() последовательно для каждой папки а потом работать с файлов в этой папке без указания пути.
MS-DOS все равно внутри себя собирает все пути в единый - проверял, не канает
Ага. Тоже проверил. С какого-то момента (видимо, все то же превышение длины пути) паскалевский ChDir тоже возвращает ошибку 3 (путь не найден)

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

Добавлено: 02 мар 2007, 16:47
Колядин Максим
Да,... ограничений в DOS конечно много. Бывает создаю-создаю программу, а потом раз... ошибка Patch not found - не перезаписывает и не открывает на чтение файлы, в состав имени которого входят две точки. Так же мало цветов, ограничения в длинне пути, имени файла, да и вообще, DOS какой-то несовременный.
Вывод: пора переходить на оконный режим, пока не поздно. Ато случиться с нами то же, что и с теми, кто програмирует на Бэйсике....

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

Добавлено: 02 мар 2007, 20:42
mons
somewhere писал(а):Товарисч mons, с вас чипсы и пиво, :-)
Это можно, это заслужил... Только куда нести, что-то подсказывает не близок путь.
Пошел разгребать написанное, надеюсь все как надо будет работать.
Спасибо огромное за труды праведные.
Если что обращайся, может тоже чем подсоблю.