Buscando puntuaciones altas para el flujo del programa del archivo mv.c en el código fuente de Linux~ ~ ~
2. Si tiene éxito, devuelve verdadero. */
3. Booleano estático
4.do_move (const char *fuente, const char *dest, const struct cp_options *x)
5.{
6.bool copy_to_self;
7.bool rename_succeeded
8.bool ok = copiar (fuente, destino, falso, x ,? _ into _ self amp;rename_success);
9.if (bueno)
10.{
11.char const * dir _ to _ remove
12.if (copiarse a sí mismo)
13.{
14./*Normalmente, cuando SOURCE coincide con DEST o el padre de DEST Cuando los directorios son los mismos , copiar devolverá copy_into_self. En este caso,
15. Sabemos que SOURCE aparece como directorio principal y no tiene sentido mover un directorio a sí mismo.
16. En algunos casos, hacerlo producirá resultados muy intuitivos. Ejecute mkdir b ';touch a c;
17.mv * b ' en un directorio vacío. En este caso, se devolverá un error. mv: no se puede mover el directorio 'b' a su propio subdirectorio 'b/b'. Maneje esto a través de un valor de característica
18., que elimina la copia a su propio directorio, DEST (' b/b ' en este ejemplo), y devuelve un error.
19. */
20.dir _ to _ remove = NULL
21.ok =False;
22.}
23. De lo contrario, si (rename_succeeded)
24.{
25./*El nombre de la fuente se cambia correctamente a DEST, se prohíbe la eliminación de cualquier archivo o se deniega el permiso para cambiar el nombre del archivo* /
26.dir _ to _ remove = NULL
27.}
28. >
30 ./* Esto puede significar que la fuente y DEST están en diferentes dispositivos, o puede significar que la fuente y DEST están en la misma configuración.
31. En espera pero no se permite cambiar el nombre.
32. Es como si usaras ftpfs para aplicar al servidor ftp la carga, descarga y eliminación, pero sin cambiar el nombre.
33. Al verificar can-rename, el número de dispositivo no es confiable porque algunos sistemas crean archivos desde diferentes dispositivos físicos, pero
34. NFS es así).
35. Si la fuente se copia correctamente a DECT, entonces debemos eliminar la fuente.
36. Esta función generalmente solo se usa para copiar cuando el cambio de nombre falla y errno se establece en EXDEV */
37.dir _ to _ remove = source
38.}
39.if (dir_to_remove!=null)
40.{
41.struct rm _ opciones rm _ opciones p >
42. Enumerar el estado de RM_status;
43.char const * dir[2];
44.rm_option_init. RM_opciones);
45.RM_opciones.
47.dir[1]= NULL;
48.status = rm ((void*) dir, ampRM_options);
49.assert(VALID_STATUS (STATUS)) ;
50.if(estado == RM_ERROR)
51.ok =False;
52.}
53.}
54. Regresar ok;
55.}
56./*Mover el origen del archivo a DEST. Maneja principalmente DEST ES UN DIRECTORIO si DEST_IS_DIRECTORY es un directorio.
57. Devuelve verdadero si tiene éxito. */
58. Booleano estático
59.movefile (char *source, char *dest, bool dest_is_dir,
60. Estructura de construcción cp_options *x)
61.{
62.bool ok
63./*
64. Ambigüedad semántica de mv causada por diferentes semánticas.
65. La función de cambio de nombre de algunos sistemas (como GNU/Linux) maneja el último "/".
66. La función de cambio de nombre en algunos otros sistemas (como Solaris 5, 6, 7, 6 y 7) ignora la última "/".
67.(Consulte los comentarios en el código fuente aquí)
68.*/
69.if (remove_trailing_slash)
70./* bool strip _ trailing _ slashes(char * file)
71. Esta función elimina el último "/"*/
72.strip_trailing_slashes (fuente);
73./*Si el segundo parámetro es un directorio*/
74.if (directorio de destino)
75.{
76./*Obtener la última parte de la ruta completa de la fuente*/
77.char const * src _ basename = last _ componente(fuente);
78./ *Concatenar la última parte y el destino obtenido a la nueva ruta de destino*/
79.char * new_dest = file_name_concat(dest, src_basename, NULL);
79.char p>
80.strip_trailing_slashes(new_dest);
81.ok = do_move (fuente, new_dest, x);
82./*Liberar memoria solicitada*/
83.free(new_dest);
84.}
85./*Si el segundo parámetro no es un directorio* /
86.
87.{
88.ok = do_move (fuente, destino, x
89.
90. está bien;
91.}
Jaja, no te ofendas, no es un diagrama de flujo del programa.