Delphi, supprimer le dossier avec le contenu
quand j'ai des sous-dossier dans le dossier - ce code n'est pas de supprimer des dossiers... Est-il une erreur?
procedure TForm.Remove(Dir: String);
var
Result: TSearchRec; Found: Boolean;
begin
Found := False;
if FindFirst(Dir + '\*', faAnyFile, Result) = 0 then
while not Found do begin
if (Result.Attr and faDirectory = faDirectory) AND (Result.Name <> '.') AND (Result.Name <> '..') then Remove(Dir + '\' + Result.Name)
else if (Result.Attr and faAnyFile <> faDirectory) then DeleteFile(Dir + '\' + Result.Name);
Found := FindNext(Result) <> 0;
end;
FindClose(Result); RemoveDir(Dir);
end;
En aparté, ce code peut être écrit avec un répétez jusqu'à ce que la boucle et ainsi éviter la nécessité pour le
Aussi, c'est un peu drôle que
Si aucune des réponses ci-dessous résolu votre problème, vous devez l'accepter en cliquant sur la coche à gauche de la réponse. Si plus d'une réponse résolu votre problème, choisir la "meilleure" à accepter.
Certains de dup: stackoverflow.com/questions/16336761/..., stackoverflow.com/questions/11798783/...
Found
variable locale.Aussi, c'est un peu drôle que
Found
est false
si un fichier a été trouvé, et true
si un fichier n'a pas été trouvé...Si aucune des réponses ci-dessous résolu votre problème, vous devez l'accepter en cliquant sur la coche à gauche de la réponse. Si plus d'une réponse résolu votre problème, choisir la "meilleure" à accepter.
Certains de dup: stackoverflow.com/questions/16336761/..., stackoverflow.com/questions/11798783/...
OriginalL'auteur Emi | 2011-04-19
Vous devez vous connecter pour publier un commentaire.
Si j'étais vous, je voudrais simplement dire que le système d'exploitation de supprimer le dossier avec l'ensemble de son contenu. Le faire par écrit (
uses ShellAPI
)[Si vous ne
au lieu de cela, vous obtenez une belle boîte de dialogue de confirmation. Si vous ne
vous n'obtenez pas la boîte de dialogue de confirmation, mais vous n'obtenez pas une barre de progression si l'opération est longue. Enfin, si vous ajoutez le
FOF_ALLOWUNDO
drapeau, vous déplacez le répertoire à la poubelle au lieu de les supprimer définitivement.Bien sûr, vous pouvez combiner les drapeaux que vous le souhaitez:
ne présentent aucune confirmation (mais une boîte de dialogue de progression parce que vous ne spécifiez pas de
FOF_NO_UI
) et le répertoire sera déplacé à la poubelle et pas définitivement supprimé.]Selon la documentation, le
pFrom
chaîne doit être doublement null. Pour autant que je sais, sans l'ajout de#0
elle n'est garantie qu'à la fin, avec un seul caractère null.href="http://msdn.microsoft.com/en-us/library/bb759795%28v=VS.85%29.aspx" >SHFIleOperation attend une double-null liste de fichiers ou de dossiers. Le PChar cast fournit les premiers; la concaténation fournit la deuxième.
+1 pour l'utilisation de l'OS pour faire le travail... Mais je voudrais préciser "pas de l'INTERFACE utilisateur" en fonction de pourquoi j'ai été la suppression d'un dossier, de manière standard, les confirmations peuvent être amenés, lorsque les circonstances l'exigent. Par exemple, quand il ne rentre pas dans la corbeille, ou il y a des sous-dossiers qui nécessitent l'ajout de privilèges, etc.
FWIW cette méthode ne fonctionnera pas pour les services, seulement des applications de bureau, et il peut être très lent.
OriginalL'auteur Andreas Rejbrand
La chose la plus simple à faire est d'appeler
TDirectory.Supprimer(Dir, True)
.TDirectory
est trouvé dansIOUtils
ce qui est assez récente RTL plus.La
True
drapeau est passé à laRecursive
paramètre qui signifie que le contenu des répertoires sont empied avant que le répertoire est supprimé, une partie essentielle de la suppression des répertoires.Dans un commentaire, vous nous dites que vous utiliser Delphi 7 et donc ce ne peut pas être utilisé.
Votre code ressemble surtout amende. Cependant, vous ne veux pas dire:
Je pense que tu veux dire:
Je serais probablement de l'écrire comme suit:
Merci de ne pas capitaliser
End
,Try
, etFinally
!Il est trop tard! Je le fais pour les faire ressortir, car ils ont non standard de contrôle de flux. Ils sont comme posh gotos.
Bon, OK, juste assez...
+1 pour repérer l'erreur.
OriginalL'auteur David Heffernan
La dernière fois que j'ai besoin de supprimer un dossier avec le contenu, j'ai utilisé le JCL:
Le dernier paramètre indique si les fichiers doivent aller à la corbeille ou pas, c'est un joli bonus.
Derrière les scènes
DeleteDirectory
fait exactement ce Andreas solution: appelerSHFileOperation
. Mais si vous utilisez déjà le JCL, puis de l'appel DeleteDirectory est juste une seule ligne de code. Vous devriez vérifier la valeur de retour.ok merci, c'est bon à savoir
OriginalL'auteur Heinrich Ulbricht
Pour aborder le problème d'origine - essayez ceci:
OriginalL'auteur Remy Lebeau
DSiWin32 est un projet open source enregistrée avec "utiliser comme vous le souhaitez" licence.
OriginalL'auteur gabr