Article View: pl.comp.programming
Article #822Dlugie nazwy w WIN95
From: ce...
Date: Tue, 11 Jun 1996 00:00
Date: Tue, 11 Jun 1996 00:00
532 lines
12445 bytes
12445 bytes
.HI..All.
Oto te dwie wspanialem procedurki (szczerze mowiac to sie chyba niczym nie
roznia):
===> BeGIn Of Longname.Pas <===
USES Strings;
type
TSearchRec = record
attr : longint;
creation : comp;
lastaccess : comp;
lastmodification : comp;
highfilesize : longint;
lowfilesize : longint;
reserved : comp;
name : array[0..259] of char;
shortname : array[0..13] of char;
handle : word;
end;
const
faReadOnly = $01;
faHidden = $02;
faSysFile = $04;
faVolumeID = $08;
faDirectory = $10;
faArchive = $20;
faAnyFile = $3F;
function findfirst(filespec:string;attr:word;var S:TSearchRec):integer;
begin
filespec := filespec + #0;
S.attr := attr;
asm
push ds
push ss
pop ds
lea dx,filespec+1
les di,S
mov ax,$714e
mov cx,attr
mov si,0
int $21
les di,S
mov word ptr es:[di+TSearchRec.handle], ax
jc @1
xor ax,ax
@1:
mov @result,ax
pop ds
end;
end;
function FindNext(var S:TSearchRec):integer;
begin
asm
mov ax,$714f
mov si,0
les di,S
mov bx,word ptr es:[di+TSearchRec.Handle]
int $21
jc @1
xor ax,ax
@1:
mov @result,ax
end;
end;
function FindClose(var S:TSearchRec):integer;
begin
asm
mov ax,$71a1
les di,S
mov bx,word ptr es:[di+TSearchRec.Handle]
int $21
jc @1
xor ax,ax
@1:
mov @result,ax
end;
end;
procedure ShowLongNames(const path:string);
var
S : TSearchRec;
Res : Integer;
begin
Res := findfirst(path+'\*.*',faAnyFile-faVolumeID,S);
while Res = 0 do
begin
with S do
begin
if (S.Attr and faDirectory) <> 0 then
begin
if (StrComp(Name,'.') <> 0) and (StrComp(Name,'..') <> 0) then
begin
if ShortName[0] <> #0 then
ShowLongNames(path+'\'+StrPas(ShortName))
else
ShowLongNames(path+'\'+StrPas(Name));
end;
end;
if ShortName[0] <> #0 then
writeln('ren ',path+'\'+StrPas(ShortName),' "',name,'"');
end;
Res := FindNext(S);
end;
FindClose(S);
end;
var
x : integer;
begin
showlongnames('C:');
end.
===> EnD oF Longname.Pas <===
===> BeGIn Of Longnw95.Pas <===
� [7] PASCAL (2:480/54.35) �������������������������������������������� PASCAL
�
Msg : 298 of 300
From : Christoph Jaeger 2:240/5490.25 Fri 17 May 96 14:50
To : *.*
Subj : Longfilenames under WIN95
�������������������������������������������������������������������������������
�
Hallo *.*!
This is a short UNIT for uses with WIN95 longfilenames.
>>> [Longname.PAS] <<<
{ Long filename DOS unit, Arne de Bruijn, 19960402, Public Domain }
{ All functions return the errorcode, and store it in DosError in }
{ the Dos unit. }
{ The functions work only if Windows 95 is loaded! }
unit ldos;
interface
uses dos;
type
TLSearchRec=record
Attr:longint;
CreationTime,LastAccessTime,LastModTime:comp;
{ See below for conversion }
HiSize,LoSize:longint;
Reserved:comp;
Name:array[0..259] of char;
ShortName:array[0..13] of char; { Only if longname exists }
Handle:word;
end;
function LFindFirst(FileSpec:pchar; Attr:word; var SRec:TLSearchRec):word;
{ Search for files }
function LFindNext(var SRec:TLSearchRec):word;
{ Find next file }
function LFindClose(var SRec:TLSearchRec):word;
{ Free search handle }
function LTruename(FileName:pchar; Result:pchar):word;
{ Return complete path, if relative uppercased longnames added, }
{ in buffer Result (261 bytes) }
function LGetShortName(FileName:pchar; Result:pchar):word;
{ Return complete short name/path for input file/path in buffer }
{ Result (79 bytes) }
function LGetLongName(FileName:pchar; Result:pchar):word;
{ Return complete long name/path for input file/path in buffer }
{ Result (261 bytes) }
function LFileSystemInfo(RootName:pchar; FSName:pchar; FSNameBufSize:word;
var Flags,MaxFileNameLen,MaxPathLen:word):word;
{ Return File System Information,
for FSName 32 bytes should be sufficient }
{ Rootname is for example 'C:\' }
{ Flags: }
{ bit
{ 0 searches are case sensitive }
{ 1 preserves case in directory entries }
{ 2 uses Unicode characters in file and directory names }
{ 3-13 reserved (0) }
{ 14 supports DOS long filename functions }
{ 15 volume is compressed }
function LErase(Filename:pchar):word;
{ Erase file }
function LMkDir(Directory:pchar):word;
{ Make directory }
function LRmDir(Directory:pchar):word;
{ Remove directory }
function LChDir(Directory:pchar):word;
{ Change current directory }
function LGetDir(Drive:byte; Result:pchar):word;
{ Get current drive and directory. Drive: 0=current, 1=A: etc. }
function LGetAttr(Filename:pchar; var Attr:word):word;
{ Get file attributes}
function LSetAttr(Filename:pchar; Attr:word):word;
{ Set file attributes }
function LRename(OldFilename,NewFilename:pchar):word;
{ Rename file }
function LTimeToDos(var LTime:comp):longint;
{ Convert 64-bit number of 100ns since 01-01-1601 UTC to local DOS format
time }
{ (LTime is var to avoid putting it on the stack) }
procedure UnpackLTime(var LTime:comp; var DT:DateTime);
{ Convert 64-bit time to date/time record }
implementation
function LFindFirst(FileSpec:pchar; Attr:word; var SRec:TLSearchRec):word;
assembler;
{ Search for files }
asm
push ds
lds dx,FileSpec
les di,SRec
mov cx,Attr
xor si,si
mov ax,714eh
int 21h
pop ds
sbb bx,bx
mov es:[di].TLSearchRec.Handle,ax
and ax,bx
mov [DosError],ax
end;
function LFindNext(var SRec:TLSearchRec):word; assembler;
{ Find next file }
asm
mov ax,714fh
xor si,si
les di,SRec
mov bx,es:[di].TLSearchRec.Handle
int 21h
sbb bx,bx
and ax,bx
mov [DosError],ax
end;
function LFindClose(var SRec:TLSearchRec):word; assembler;
{ Free search handle }
asm
mov ax,714fh
mov bx,es:[di].TLSearchRec.Handle
int 21h
sbb bx,bx
and ax,bx
mov [DosError],ax
end;
function LTrueName(FileName:pchar; Result:pchar):word; assembler;
{ Return complete path, if relative uppercased longnames added, }
{ in buffer Result (261 bytes) }
asm
push ds
mov ax,7160h
xor cx,cx
lds si,FileName
les di,Result
int 21h
pop ds
sbb bx,bx
and ax,bx
mov [DosError],ax
end;
function LGetShortName(FileName:pchar; Result:pchar):word; assembler;
{ Return complete short name/path for input file/path in buffer }
{ Result (79 bytes) }
asm
push ds
lds si,FileName
les di,Result
mov ax,7160h
mov cx,1
int 21h
pop ds
sbb bx,bx
and ax,bx
mov [DosError],ax
end;
function LGetLongName(FileName:pchar; Result:pchar):word; assembler;
{ Return complete long name/path for input file/path in buffer }
{ Result (261 bytes) }
asm
push ds
lds si,FileName
les di,Result
mov ax,7160h
mov cx,2
int 21h
pop ds
sbb bx,bx
and ax,bx
mov [DosError],ax
end;
function LFileSystemInfo(RootName:pchar; FSName:pchar; FSNameBufSize:word;
var Flags,MaxFileNameLen,MaxPathLen:word):word; assembler;
{ Return File System Information,
for FSName 32 bytes should be sufficient }
asm
push ds
lds dx,RootName
les di,FSName
mov cx,FSNameBufSize
mov ax,71a0h
int 21h
pop ds
les di,Flags
mov es:[di],bx
les di,MaxFileNameLen
mov es:[di],cx
les di,MaxPathLen
mov es:[di],dx
sbb bx,bx
and ax,bx
mov [DosError],ax
end;
function LTimeToDos(var LTime:comp):longint; assembler;
{ Convert 64-bit number of 100ns since 01-01-1601 UTC
to local DOS format time }
{ (LTime is var to avoid putting it on the stack) }
asm
push ds
lds si,LTime
xor bl,bl
mov ax,71a7h
int 21h
pop ds
mov ax,cx
cmc
sbb cx,cx
and ax,cx
and dx,cx
end;
procedure UnpackLTime(var LTime:comp; var DT:DateTime);
{ Convert 64-bit time to date/time record }
begin
UnpackTime(LTimeToDos(LTime),DT);
end;
function LMkDir(Directory:pchar):word; assembler;
asm
push ds
lds dx,Directory
mov ax,7139h
int 21h
pop ds
sbb bx,bx
and ax,bx
mov [DosError],ax
end;
function LRmDir(Directory:pchar):word; assembler;
asm
push ds
lds dx,Directory
mov ax,713ah
int 21h
pop ds
sbb bx,bx
and ax,bx
mov [DosError],ax
end;
function LChDir(Directory:pchar):word; assembler;
asm
push ds
lds dx,Directory
mov ax,713bh
int 21h
pop ds
sbb bx,bx
and ax,bx
mov [DosError],ax
end;
function LErase(Filename:pchar):word; assembler;
asm
push ds
lds dx,Filename
mov ax,7141h
int 21h
pop ds
sbb bx,bx
and ax,bx
mov [DosError],ax
end;
function LGetAttr(Filename:pchar; var Attr:word):word; assembler;
asm
push ds
lds dx,Filename
mov ax,7143h
xor bl,bl
int 21h
pop ds
les di,Attr
mov es:[di],cx
sbb bx,bx
and ax,bx
mov [DosError],ax
end;
function LSetAttr(Filename:pchar; Attr:word):word; assembler;
asm
push ds
lds dx,Filename
mov ax,7143h
mov bl,1
mov cx,Attr
int 21h
pop ds
sbb bx,bx
and ax,bx
mov [DosError],ax
end;
function LGetDir(Drive:byte; Result:pchar):word; assembler;
asm
cld
les di,Result
mov al,Drive
mov dl,al
dec al
jns @GotDrive
mov ah,19h
int 21h
@GotDrive:
add al,41h
mov ah,':'
stosw
mov ax,'\'
stosw
push ds
push es
pop ds
mov si,di
dec si
mov ax,7147h
int 21h
pop ds
sbb bx,bx
and ax,bx
mov [DosError],ax
end;
function LRename(OldFilename,NewFilename:pchar):word; assembler;
asm
push ds
lds dx,OldFilename
les di,NewFilename
mov ax,7156h
int 21h
pop ds
sbb bx,bx
and ax,bx
mov [DosError],ax
end;
end.
=== LDOS.PAS end of part 2/2
=== LDOSTEST.PAS
{ Simple sample for LDOS unit, Arne de Bruijn, 19960402, Public Domain }
uses ldos,strings,dos;
type string2=string[2];
function Str0(B:byte):string2;
begin Str0[0]:=#2; Str0[1]:=char(B div 10+48); Str0[2]:=char(B mod 10+48);
end;
var
Buf,BufO:array[0..261] of char;
SRec:TLSearchRec;
DT:DateTime;
LN,SN:pchar;
W1,W2,W3:word;
begin
Write('Enter path:'); ReadLn(Buf);
WriteLn('LFileSystemInfo:',LFileSystemInfo(Buf,BufO,32,W1,W2,W3),
' = ',BufO,',',W1,',',W2,',',W3);
WriteLn('LTruename:',LTrueName(Buf,BufO),' = ',BufO);
WriteLn('LGetShortName:',LGetShortName(Buf,BufO),' = ',BufO);
WriteLn('LGetLongName:',LGetLongName(Buf,BufO),' = ',BufO);
LFindFirst(Buf,16,SRec);
while DosError=0 do begin
UnpackLTime(SRec.lastmodtime,DT);
if SRec.ShortName[0]=#0 then
begin SN:=@SRec.name; ln:=nil; end
else
begin SN:=@SRec.shortname; ln:=@SRec.name; end;
with DT do WriteLn(SN,'':13-StrLen(SN),SRec.LoSize:9,
' ',Day:3,'-',Str0(Month),'-',Year,' ',Hour:2,':',Str0(Min),' ',LN);
LFindNext(SRec); end;
LFindClose(SRec);
end.
CIAO,
Christoph
===> EnD oF Longnw95.Pas <===
.CUL8R..All.... UI120:ONJKBHESBATDFFDJCAEFAHDNLCMBAHCGDGGUHJCACIH
E-MAIL: ce...@plearn.edu.pl (frozen) UNHOLY: 101:1000/6.3
PGP FP: 38 A5 70 CE 0A CF B2 0E 4B E7 C8 04 B4 33 D6 E2
Technical Details
Message-ID:
<GoldED.199606112132055201.cezex@plearn.edu.pl>Path:
mbox-mo1.pugleaf.net!unknown!not-for-mailShow Full Headers
Complete Article Headers
From: "ce...@plearn.edu.pl" <cezex%ple...@p35.f54.n480.z2.fidonet.org> Subject: Dlugie nazwy w WIN95 Date: 1996/06/11 Message-ID: <GoldED.199606112132055201.cezex@plearn.edu.pl> X-Deja-AN: 159847044 x-ftn-origin: (2:480/54.35) x-ftn-path: 480/40 x-comment-to: All x-ftn-subject: Dlugie nazwy w WIN95 x-ftn-chrs: FIDOMAZ 2 x-ftn-seen-by: 480/0 33 40 53 54 55 66 86 87 4000 481/19 484/8 x-ftn-tearline: GEcho 1.00 x-ftn-from: ce...@plearn.edu.pl (Cezary Piekacz) x-ftn-msgid: <GoldED.19960611...@plearn.edu.pl> 31bde5d6 x-ftn-organization: cEZarY PieKAcZ (CîZîX) x-ftn-area: PL.COMP.PROGRAMMING organization: cEZarY PieKAcZ (CîZîX) x-ftn-x-mailreader: GoldED/386 2.50+ x-ftn-date: Tue, 11 Jun 1996 21:31:02 +0100 x-ftn-message-id: <GoldED.19960611...@plearn.edu.pl> x-ftn-sender: ce...@plearn.edu.pl (Cezary Piekacz) newsgroups: pl.comp.programming MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit