Si haces un
echo $file2; verás que solo te muestra el nombre del archivo, pero no toda la ruta, por lo que tienes que hacer algo como:
copy('ruta/' . $file2, "ruta/{$Cabecera->Codigo}.xml");
Por cierto, encierra $Cabecera->Codigo entre llaves para garantizar que la cadena será interpretada correctamente.
Luego, readdir podría devolverte . (un punto = directorio actual) o .. (dos puntos = directorio en nivel superior) y, la verdad, no veo el sentido de usar opendir() y readdir() en cada iteración del foreach(), porque siempre devolverá el mismo nombre de archivo.
Tu lógica debería ser más o menos así:
Código PHP:
Ver original// Abres el directorio
// Recorres cada archivo
while($archivo = readdir($handle)) { // Aquí verificas que sea realmente un XML y...
// ... si es el caso, entonces copias o renombras
}