3 votes

Déplacement de dossier Windows C++ : Fonctionne avec Vista et plus, pas XP

J'ai travaillé sur ce point pendant quelques heures maintenant, et ça marche. parfaitement sous Windows Vista et Windows 7, mais lorsque je l'exécute sous Windows XP, il échoue sans aucun message. Malheureusement, je n'ai pas d'environnement de développement sous XP et je ne peux donc pas l'exécuter avec un débogueur pour vérifier, ai-je manqué quelque chose d'évident ? Le même morceau de code utilise effectivement un CopyFile et quelques commandes pour écrire des données vers C:\ donc si c'est une erreur de permissions, c'est une erreur étrange.

EDIT : La valeur de retour est 1223, ERROR_CANCELLED ce qui signifie annulé par l'utilisateur.

EDIT 2 : J'ai désactivé le s.fFlags et il a immédiatement fait apparaître une boîte de dialogue demandant s'il devait créer le fichier dir-test alors je suis passé à FOF_NOCONFIRMATION et il semblait ignorer le drapeau. Je l'utilise également lors d'une suppression en utilisant la même méthode. SHFileOperation de sorte qu'elle ne s'applique pas non plus aux copies de fichiers.

LPTSTR source = L"dir-test\\*\0";               
LPTSTR dest = L"C:\\dir-test\0";

SHFILEOPSTRUCT s = { 0 };
s.hwnd = 0;
s.wFunc = FO_COPY;
s.fFlags = FOF_SILENT;
s.pTo = dest;
s.pFrom = source;
int n;
n = SHFileOperation(&s);`

1voto

Nicholas Smith Points 4792

Il s'avère donc, pour une raison étrange, que l'utilisation de la fonction SHFileOperation forcera une boîte de dialogue de confirmation pour Windows XP (mais pas pour Vista ou 7) et ignorera les drapeaux lui indiquant de simplement confirmer. Une solution simple consiste à utiliser CreateDirectory() avant d'exécuter la copie, ce qui ne nécessite pas de dialogue de confirmation.

0voto

Mark Ransom Points 132545

La documentation pour SHFILEOPSTRUCT a cet avertissement :

On ne saurait trop insister sur le fait que vos chemins doivent toujours être des chemins complets. Si les membres pFrom ou pTo sont des noms non qualifiés, les répertoires actuels sont tirés des paramètres globaux du lecteur et du répertoire actuels, gérés par les fonctions GetCurrentDirectory et SetCurrentDirectory.

Votre source est un nom non qualifié.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X