D1 and Win 95 Long File Names

I need a code snippet for reading long file names into D1.  I read somewhere that it can be done using Assembler within Delphi.  Can anyone enlighten me??
LVL 3
jdthedjAsked:
Who is Participating?
 
BoRiSConnect With a Mentor Commented:
jdthedj

here is a snippit I used a long time ago in D1

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.

can't remember were I got it

Anyway hope this helps

Later
BoRiS          
0
 
BoRiSCommented:
jdthedj

I was informed by a friend of mine were the code is from, it's from a old tips list and the snippit is for BP, but with a few modifactions this code can work for D1

Later
BoRiS
0
 
ZifNabCommented:
You could also try this :

How do I convert "Long File Name.pas" to
"longfi~1.pas"?

From: "DynaSoft." <TimH@onaustralia.com.au>

Here try these procedures.



Function GetShortFileName(Const FileName : String) : String;
var
  aTmp: array[0..255] of char;
begin
  if GetShortPathName(PChar(FileName),aTmp,Sizeof(aTmp)-1)=0 then
     Result:= FileName
  else
     Result:=StrPas(aTmp);
end;

Function GetLongFileName(Const FileName : String) : String;
var
  aInfo: TSHFileInfo;
begin
  if SHGetFileInfo(PChar(FileName),0,aInfo,Sizeof(aInfo),SHGFI_DISPLAYNAME)<>0 then
     Result:= String(aInfo.szDisplayName)
  else
     Result:= FileName;
end;

Regards, Zif.
0
 
jdthedjAuthor Commented:
Thanks for the help BoRis, I'm very grateful.  Also thanks ZifNab for your contribution
0
All Courses

From novice to tech pro — start learning today.