def rm_file(self, iso_path, rr_name=None, joliet_path=None, udf_path=None):
        '''
        Remove a file from the ISO.
        Parameters:
         iso_path - The path to the file to remove.
         rr_name - The Rock Ridge name of the file to remove.
         joliet_path - The Joliet path to the file to remove.
         udf_path - The UDF path to the file to remove.
        Returns:
         Nothing.
        '''
        if not self._initialized:
            raise pycdlibexception.PyCdlibInvalidInput('This object is not yet initialized; call either open() or new() to create an ISO')
        iso_path_bytes = utils.normpath(iso_path)
        if not utils.starts_with_slash(iso_path_bytes):
            raise pycdlibexception.PyCdlibInvalidInput('Must be a path starting with /')
        child = self._find_iso_record(iso_path_bytes)
        if not child.is_file():
            raise pycdlibexception.PyCdlibInvalidInput('Cannot remove a directory with rm_file (try rm_directory instead)')
        if self.eltorito_boot_catalog is not None:
            if any([id(child) == id(rec) for rec in self.eltorito_boot_catalog.dirrecords]):
                raise pycdlibexception.PyCdlibInvalidInput("Cannot remove a file that is referenced by El Torito; either use 'rm_eltorito' to remove El Torito first, or use 'rm_hard_link' to hide the entry")
            eltorito_entries = {}
            eltorito_entries[id(self.eltorito_boot_catalog.initial_entry.inode)] = True
            for sec in self.eltorito_boot_catalog.sections:
                for entry in sec.section_entries:
                    eltorito_entries[id(entry.inode)] = True
            if id(child.inode) in eltorito_entries:
                raise pycdlibexception.PyCdlibInvalidInput("Cannot remove a file that is referenced by El Torito; either use 'rm_eltorito' to remove El Torito first, or use 'rm_hard_link' to hide the entry")
        num_bytes_to_remove = 0
        udf_file_ident = None
        udf_file_entry = None
        if udf_path is not None:
            if self.udf_root is None:
                raise pycdlibexception.PyCdlibInvalidInput('Can only specify a udf_path for a UDF ISO')
            udf_path_bytes = utils.normpath(udf_path)
            (udf_file_ident, udf_file_entry) = self._find_udf_record(udf_path_bytes)
        if child.inode is None:
            num_bytes_to_remove += self._remove_child_from_dr(child,
                                                              child.index_in_parent,
                                                              self.pvd.logical_block_size())
        else:
            while child.inode.linked_records:
                rec = child.inode.linked_records[0]
                if isinstance(rec, dr.DirectoryRecord):
                    num_bytes_to_remove += self._rm_dr_link(rec)
                elif isinstance(rec, udfmod.UDFFileEntry):
                    num_bytes_to_remove += self._rm_udf_link(rec)
                else:
                    raise pycdlibexception.PyCdlibInternalError('Saw a linked record that was neither ISO or UDF')
        if udf_file_ident is not None and udf_file_entry is None and udf_file_ident.parent is not None:
            self._rm_udf_file_ident(udf_file_ident.parent, udf_file_ident.fi)
            num_bytes_to_remove += self.pvd.logical_block_size()
        self._finish_remove(num_bytes_to_remove, True)