8
votes

Vérifiez les autorisations d'écriture dans le fichier Windows / Linux

J'aimerais savoir comment vérifier si j'ai des autorisations d'écriture dans un dossier.

J'écris un projet C ++ et je devrais imprimer des données à un fichier résultat.txt, mais je dois savoir si j'ai des autorisations ou non.

est le chèque différent entre Linux et Windows? Parce que mon projet devrait fonctionner sur Linux et que je travaille actuellement dans Visual Studio.


0 commentaires

4 Réponses :


5
votes

À propos de la seule chose raisonnable à faire est d'essayer de créer le fichier et s'il échoue, dites à l'utilisateur qu'il y avait un problème. Toute tentative de test à l'avance et n'essayant que de créer le fichier si vous pourrez créer et écrire, il est ouvert aux problèmes des conditions de course (avait l'autorisation lorsque vous avez vérifié, mais il a été supprimé au moment où vous avez essayé Pour l'utiliser, ou vice versa) et des cas d'angle (par exemple, vous avez permission pour créer un fichier dans ce répertoire, mais tenter d'écrire là dépassera votre quota de disque). La seule façon de savoir est d'essayer ...


0 commentaires

3
votes

Le moyen le plus correct de tester réellement la permission d'écriture de fichier est d'essayer d'écrire dans le fichier. La raison en est que différentes plates-formes exposent des autorisations d'écriture de différentes manières. Pire encore, simplement parce que le système d'exploitation vous indique que vous pouvez (ou ne pouvez pas) écrire dans un fichier, il peut être réellement mené, par exemple, sur un système UNIX, les modes de fichiers peuvent permettre une écriture, mais le fichier est en lecture seule. Médias, ou inversement, le fichier peut en réalité être un périphérique de caractère créé par le noyau pour l'utilisation propre des processus, de sorte que ses filamodes sont réglés sur tous les zéros, le noyau permet de ce processus (et seulement ce processus) à la muck tout ce qu'il aime.


0 commentaires

12
votes

Le moyen portable de vérifier les autorisations est d'essayer d'ouvrir le fichier et de vérifier si cela a réussi. Sinon, et errno (de l'en-tête est défini sur la valeur etacces [Oui, avec un S], vous n'avez pas eu de suffisamment d'autorisations. Cela devrait fonctionner à la fois sur Unix / Linux et Windows . Exemple pour stdio: xxx

iostreams fonctionnera un peu différemment. Afaik, ils ne garantissent pas de définir errno sur les deux plates-formes ou signalez des erreurs plus spécifiques que de simplement "échec".

Comme Jerry Coffin a écrit, ne s'appuie pas sur des fonctions de test d'accès distinctes Puisque votre programme sera sujet aux conditions de course et aux trous de sécurité.


7 commentaires

Merci, mais je ne suis toujours pas sous lequel je peux savoir si j'ai des autorisations pour écrire un fichier sur le disque.


Si je vais essayer de n'avoir aucune autorisation, je suppose que le programme s'effondrera et je veux l'empêcher de vérifier auparavant. Existe-t-il une commande pour vérifier les autorisations d'écriture sur le disque (écrire un nouveau fichier)?


Pourquoi votre programme devrait-il s'effondrer? : S


En réalité, ce n'est pas un bon moyen sur Windows (du moins non pas, lorsque vous souhaitez vérifier, si vous souhaitez mettre à jour votre candidature): une exécutable en cours d'exécution est toujours en lecture seule, même si vous aviez l'autorisation d'écriture, si elle était terminée; Si vous essayez d'écrire dans le fichier, Windows peut créer une copie virtuelle de celui-ci dans un répertoire écrite, même si vous n'aviez aucune autorisation d'écriture.


CAN _CHDIR (DIRNAME) peut-il être utilisé pour déterminer si le dossier est écrit ou non?


Je recommanderais d'utiliser le mode "A". Supposons que vous ayez des autorisations d'écriture et vous utilisez "FLOSE"; Ensuite, le fichier existant sera écrasé par un fichier vide ...


@CHRISMAES: En fait, sous Windows au moins, le fichier est effacé même si fcFose n'est pas appelé ..... donc oui, il faut utiliser le mode "A" (au lieu de "W" pour vérifier Si le fichier est écrit sans le détruire!



0
votes

Semblable à la réponse acceptée, mais à l'aide du fopen_s Code> fonction ainsi que moderne C ++ et Ajoutez code> Mode ouvert pour éviter de détruire le contenu du fichier:

bool is_file_writable(const std::filesystem::path &file_path)
{
    FILE* file_handle;
    errno_t file_open_error;
    if ((file_open_error = fopen_s(&file_handle, file_path.string().c_str(), "a")) != 0)
    {
        return false;
    }

    fclose(file_handle);
    return true;
}


0 commentaires