• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 200
  • Last Modified:

Reading long firl names

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
mmilan
Asked:
mmilan
1 Solution
 
omsecCommented:
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
 
scrapdogCommented:
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

Important Lessons on Recovering from Petya

In their most recent webinar, Skyport Systems explores ways to isolate and protect critical databases to keep the core of your company safe from harm.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now