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?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

BoRiSCommented:
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

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
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
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Delphi

From novice to tech pro — start learning today.