9
votes

Win32 API pour renommer un fichier en C

Si le répertoire source et le répertoire cible, Mélipfile effectuerait une copie du fichier source dans le fichier cible, ce qui signifie que je vais finir par voir deux fichiers.

Est-ce que la meilleure façon de renommer peut être réalisée?


3 commentaires

Que veux-tu dire exactement? MoveFileEx avec MoveFile_Copy_allowed ne vous donnera pas deux fichiers - il appelle CopyFile puis supprimez-la si les deux fichiers sont sur différents volumes.


Je pense que j'ai vu des cas où MOVELILE () fera copier () + Deletefile (), mais le fichier source est toujours verrouillé par quelqu'un de sorte que son statut sera configuré pour supprimer en attente; Puis quand il est déverrouillé, il disparaît comme par magie. Ou peut-être que je fais cela en haut; Je ne me souviens pas.


Si le programme se bloque ou le courant est perdu, des mouvements non atomiques (AKA Copy-Suppr) peuvent entraîner une incohérence.


4 Réponses :


2
votes

À quoi ressemble votre code? J'ai ceci: xxx

et il ne laisse pas la source derrière.


1 commentaires

Cela a fonctionné après avoir inclus: #include #include #include



1
votes

Vous voudrez peut-être essayer d'utiliser le mobilefileeex () API sans spécifier le mobilefile_copy_allowed pour voir si cela fournit le comportement que vous recherchez.


3 commentaires

Ne pas spécifier mobilefile_copy_allowed signifie simplement que les mouvements de volume croisé échoueront. Ce n'est pas ce que l'OP veut. Le "simulateur par copie / suppression" fait référence au fait que les mouvements de volume croisé ne peuvent pas être effectués en réécrivant simplement les métadonnées de disque, comme cela est effectué pour les mouvements de même volume.


@David: Je pensais que l'OP demandait une opération de renommée qui ne réussissait que si cela ne pouvait être fait en modifiant uniquement les métadonnées de fichiers au lieu d'une simulation de renommée de copie / Supprimer (je suppose que la question est un peu floue pour moi).


Eh bien, pour être juste, la question est extrêmement médiocre, comme c'est le cas si souvent, on ne peut que deviner que l'intention était. Peut-être que votre interprétation est correcte!



10
votes

the movefile La fonction est en effet ce que vous voulez. De la documentation:

La fonction MOVELFILE déplacera (renommer) un fichier ou un répertoire (y compris ses enfants) dans le même répertoire ou dans les répertoires.

Si les emplacements source et de destination sont à la fois sur le même volume, une opération de renommée atomique est effectuée. S'ils sont sur différents volumes, une opération de copie / suppression est terminée à la place (c'est le meilleur que vous puissiez faire).


1 commentaires

MoveFileEx Par défaut ne se déplace que, il sera pas copier sauf si vous ne passe pas movefile_copy_allowed drapeau.



5
votes

Essayez

#include <stdio.h>

int Result = rename( oldname , newname );

if (Result)
   // "Error occurred." );
else
   // "File was successfully renamed!";


0 commentaires