8
votes

Vérifiez si un répertoire est lisible

Comment nous pouvons vérifier si un répertoire est répertoire ou non?


1 commentaires

@ODed: tandis que la question était bien terminée, il a fait contient toutes les informations nécessaires pour y répondre, car elle est marquée Delphi ...


5 Réponses :


4
votes

Vous pouvez utiliser le FileGetTatr code> fonction et Vérifiez si le drapeau Fareadonly CODE> est défini.

Essayez ce code P>

function DirIsReadOnly(Path:string):Boolean;
var
 attrs    : Integer;
begin
 attrs  := FileGetAttr(Path);
 Result := (attrs  and faReadOnly) > 0;
end;


2 commentaires

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 en lecture seule pour les dossiers. Celles-ci n'ont jamais été mises à jour en déplacement dans NTFS, mais avancé ACL ou Liste de contrôle d'accès 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 s) est plus fiable. Voir cet article pour plus de détails: support.microsoft.com/fr-gb/help/326549/...



0
votes

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');


1 commentaires

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/...



2
votes

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: xxx


4 commentaires

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 (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)



1
votes

La version Heartware 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: xxx


2 commentaires

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 . Il fait la même chose: essayez d'écrire un fichier. Si cela réussit, le répertoire n'est pas en lecture seule.



0
votes

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 http://simplebasics.net/delphi-how-a-check-if-you-have-read-permission-on-a-directory/


0 commentaires