Comment nous pouvons vérifier si un répertoire est répertoire ou non? p>
5 Réponses :
Vous pouvez utiliser le Essayez ce code P> FileGetTatr code> fonction et Vérifiez si le drapeau Fareadonly CODE> est défini. function DirIsReadOnly(Path:string):Boolean;
var
attrs : Integer;
begin
attrs := FileGetAttr(Path);
Result := (attrs and faReadOnly) > 0;
end;
Idée: le code pourrait (en tant que «bonus spécial») lancer une exception si le chemin pointe sur «autre chose qu'un répertoire» - ou utilisez assertistion (path))?
Ce code ne fonctionne pas pour les dossiers sous Windows, uniquement des fichiers. Les attributs de fichiers Windows et de dossiers sont basés sur une graisse héritée qui n'inclut pas un attribut code> en lecture seule code> pour les dossiers. Celles-ci n'ont jamais été mises à jour en déplacement dans NTFS, mais avancé ACL code> ou Liste de contrôle d'accès code> Les fonctionnalités de NTFS peuvent être utilisées pour créer un dossier en lecture seule. Ma réponse ci-dessous (adaptée de Heartwave code> s) est plus fiable. Voir cet article pour plus de détails: support.microsoft.com/fr-gb/help/326549/...
dans Windows API Way, c'est le cas:
fa := GetFileAttributes(PChar(FileName))
if (fa and FILE_ATTRIBUTE_DIRECTORY <> 0) and (fa and FILE_ATTRIBUTE_READONLY <> 0) then
ShowMessage('Directory is read-only');
Cette réponse est correcte pour les fichiers mais pas pour les dossiers. Windows (toutes les versions) ne définit pas fichier_attribute_readonly pour les dossiers. Voir cette question qui donne plus de détails: superutilisateur.com/questions/1247843/...
Test si l'attribut de l'annuaire est R / O ne fait que partie de la réponse. Vous pouvez facilement avoir un répertoire R / W que vous ne pouvez toujours pas écrire à - en raison de droits d'accès.
La meilleure façon de vérifier si vous pouvez écrire dans un répertoire ou non - pour l'essayer: P>
ressemble à Cobol ou à Fortran pour moi au premier regard :)
Ce que vous avez fait est proche du pire moyen. Système de fichiers inutiles, charge HD. Ensuite, que se passe-t-il si vous avez une sorte d'abonnés de changement de FS attachés? Le meilleur moyen est d'écrire tout ce que vous avez planifié d'écrire là-bas. Si le répertoire est protégé, vous obtiendrez une erreur. C'est ça.
D'accord. Mais si pour une raison quelconque, vous devez savoir à l'avance si le répertoire est écritable, le seul moyen est - comme vous impliquez-vous - de le faire. La fonction ci-dessus fait juste cela et renvoie le résultat.
@Heartware: cool, ont supprimé mon commentaire précédent. La vérification supplémentaire est requise car Liste de contrôle active code> (ACL) peut refuser des autorisations d'écriture à l'utilisateur actuel. Lorsque j'ai testé le code, le fichier n'a pas été écrit ... mais aucune exception n'est lancée. Ceinture-et-bride: o)
La version Heartware code> a donné est agréable mais contient deux bugs. Ces versions modifiées fonctionnent de manière plus fiable et ont des commentaires pour expliquer ce qui se passe:
Ceci est beaucoup trop complexe. Voir: Stackoverflow.com/a/46094359/937125
Je ne connaissais pas cette autre question quand j'ai répondu celui-ci. Cependant, désaccord c'est trop complexe code>. Il fait la même chose: essayez d'écrire un fichier. Si cela réussit, le répertoire n'est pas en lecture seule.
Un moyen possible est d'essayer de répertorier les fichiers dans ce répertoire et de rechercher le statut. De cette façon, nous pouvons vérifier si c'est lisible. Cette réponse est applicable à 2009 ou moins. N'oubliez pas que nous devons vérifier si le dossier existe, puis si le dossier est lisible. Vous pouvez trouver la mise en œuvre ici
@ODed: tandis que la question était bien terminée, il a fait i> contient toutes les informations nécessaires pour y répondre, car elle est marquée Delphi ...