def self.files(file_system_image)
files=FileContainer.new
granule_allocation_table=file_system_image.get_sector(directory_track,0)
return files if granule_allocation_table.nil?
file_system_image.volume_name=granule_allocation_table[0xd0,8].unpack("A*")
(file_system_image.sectors_in_track(directory_track)-[0,1]).each do |sector_no|
fde_sector=file_system_image.get_sector(directory_track,sector_no)
(fde_sector.length/FDE_SIZE).times do |fde_number|
fde=fde_sector[fde_number*FDE_SIZE,FDE_SIZE]
attributes=fde[0x00]
is_fpde = ((attributes & 0b10010000)==(0b00010000))
next if !is_fpde
eof_low=fde[0x03]
filename_base=fde[0x05,8].unpack("A8")
filename_extension=fde[0x0D,3].unpack("A3")
filename="#{filename_base}/#{filename_extension}"
contents=""
eof_mid=fde[0x14]
eof_high=fde[0x15]
file_length=(eof_high<<16)+(eof_mid<<8)+eof_low
if (eof_low>0) then
file_length-=0x100
end
5.times do |extent_no|
extent=fde[(extent_no*2)+0x16,2]
break if extent[0]==0xFF
break if extent[0]==0xFE
track_no=extent[0]
granule_offset=extent[1]>>5
number_of_granules=1+(extent[1] & 0b00011111)
start_sector=granule_offset*sectors_per_granule(file_system_image)
number_of_sectors=number_of_granules*sectors_per_granule(file_system_image)
number_of_sectors.times {|i| contents<<file_system_image.get_sector(track_no,start_sector+i)}
end
contents=contents[0,file_length]
files<<NativeFileType.best_fit(file_system_image,filename,contents,filename_extension)
end
end
files
end