Solved

Reading long firl names

Posted on 1998-09-29
2
180 Views
Last Modified: 2010-04-16
How can I get long names of files and directoriums of Windows 95. I am using Turbo Pascal 7.0. Can somebody help me and send me code?
0
Comment
Question by:mmilan
2 Comments
 
LVL 2

Expert Comment

by:omsec
ID: 1215712
sorry, can't give code, so this is only a commant:

Long file names are quite simple.  Windows simply creates multiple entries
for each file with a long name.  The entries are tagged with every
attribute, including (and this is the key) the volume attribute.  Windows
sees this, and chains the entries together to make one long file name.  The
only directory entry that doesn't have all the attributes set is the short
filename, which is the only one that makes any sense to DOS, so that's the
only one it displays when you type "dir"

0
 
LVL 5

Accepted Solution

by:
scrapdog earned 50 total points
ID: 1215713
This piece of code came from SWAG.  It works in TP 7.0
-------------------------------------------------------


{Here's my BP code for a little program that prints both the short and
long version of any longnamed file on C:.  it'll be pretty similar in Delphi,
if the INT 21 approach is what you're supposed to use in Win16.}


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('D:');
end.
{written by Duncun Murdoch}

---------------------------------------

The showlongnames procedure prints out a list of all the files found on the path sent to it.  If you don't want to print it to the screen, all you have to do is alter the showlongnames procedure to fit your needs (i.e. pass it the first file back, pass all files back, etc.) Just look at how the procedure works and alter it accordingly.

Scrapdog
0

Featured Post

Netscaler Common Configuration How To guides

If you use NetScaler you will want to see these guides. The NetScaler How To Guides show administrators how to get NetScaler up and configured by providing instructions for common scenarios and some not so common ones.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Returning BSTR from a Delphi COM .DLL 2 1,891
Determine Drive Types 2 475
MAPI Error1: User cancelled request ? 7 1,166
proper way to parse text with delphi 7 122
If you thought ransomware was bad, think again! Doxware has the potential to be even more damaging.
Each year, investment in cloud platforms grows more than 20% (https://www.immun.io/hubfs/Immunio_2016/Content/Marketing/Cloud-Security-Report-2016.pdf?submissionGuid=a8d80a00-6fee-4b85-81db-a4e28f681762) as an increasing number of companies begin to…
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …

803 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question