code: def _CalculateHashesFileEntry(
        self, file_system, file_entry, parent_full_path, output_writer):
      
      # Since every file system implementation can have their own path
      # segment separator we are using JoinPath to be platform and file system
      # type independent.
      full_path = file_system.JoinPath([parent_full_path, file_entry.name])
      for data_stream in file_entry.data_streams:
        hash_value = self._CalculateHashDataStream(file_entry, data_stream.name)
        display_path = self._GetDisplayPath(
            file_entry.path_spec, full_path, data_stream.name)
        output_writer.WriteFileHash(display_path, hash_value or 'N/A')
  
      for sub_file_entry in file_entry.sub_file_entries:
        self._CalculateHashesFileEntry(
            file_system, sub_file_entry, full_path, output_writer)
docs: Recursive calculates hashes starting with the file entry.
  
      Args:
        file_system (dfvfs.FileSystem): file system.
        file_entry (dfvfs.FileEntry): file entry.
        parent_full_path (str): full path of the parent file entry.
        output_writer (StdoutWriter): output writer.