IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Impossible d'écrire/créer un fichier


Sujet :

C

  1. #1
    Membre éclairé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2015
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Septembre 2015
    Messages : 204
    Points : 839
    Points
    839
    Par défaut Impossible d'écrire/créer un fichier
    Bonjour

    J'ai un programme qui n'a pas le même comportement sur 2 ordis différents (pourtant même OS : Win 7 64bits; j'ai même tenté sur Win 8 et je ne reproduis pas)
    Mon problème est que je n'ai pas accès à l'ordi qui a l'erreur (donc échanges par mail/téléphone)
    donc pour diagnostiquer


    J'ai la fonction CreateFile qui génère l'erreur : aucune création du fichier
    GetLastError me retourne l'erreur ERROR_ACCESS_DENIED
    L'exécutable est lancé sur le disque C

    J'appelle CreateFile avec ces paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        HANDLE hFile;
        hFile = CreateFile ("log.txt",
                            GENERIC_WRITE,
                            0,
                            NULL,
                            OPEN_ALWAYS,
                            FILE_ATTRIBUTE_NORMAL,
                            NULL);
    alors que la lecture du fichier (s'il existe) fonctionne
    La création/modification du fichier est possible avec le bloc notes

    Comment savoir ce qui empêche l'écriture ?
    Comment corriger ?

    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    L'erreur est probablement en dehors du programme. Autre chose a déjà ouvert le fichier et le maintien.
    Sur Windows 10, nous avons remarqué que VS a du mal à écraser l'exe après compilation quand... le dossier qui le contient est ouvert et que les fichiers sont réordonnés par date et non par l'ordre par défaut.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Pour faire suite au post de Bousk (qui te répond à 5h15 un dimanche quand il rentre de boite ), il faut voir si la suppression est possible (une bête suppression par clic droit). S'il est vraiment maintenu par un autre truc, la suppression sera impossible. Toutefois si la modification par bloc note est possible cela pourrait alors signifier que l'hypothèse du maintien n'est pas la bonne.

    Il faudrait aussi peut-être essayer de corriger le chemin (ie hFile = CreateFile ("c:\...\...\log.txt", ...) car avec un chemin relatif "log.txt" le fichier sera créé à l'endroit où tu te trouves quand tu appelles le programme. Ainsi déjà tu seras sûr que tu le crées au bon endroit et que c'est bien ce fichier dont il s'agit.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bousk (qui te répond à 5h15 un dimanche quand il rentre de boite
    Il me semble qu'il poste ces derniers temps à cette heure : donc non


    Citation Envoyé par Sve@r Voir le message
    Il faudrait aussi peut-être essayer de corriger le chemin (ie hFile = CreateFile ("c:\...\...\log.txt", ...) car avec un chemin relatif "log.txt" le fichier sera créé à l'endroit où tu te trouves quand tu appelles le programme. Ainsi déjà tu seras sûr que tu le crées au bon endroit et que c'est bien ce fichier dont il s'agit.
    Je vais faire mon vieux chiant , mais depuis Windows 10, (mais initié avec Vista et surtout Windows 8), tu as 1 grosse architecture de dossiers, et évidemment chacun à ses droits.
    Par exemple, le dossier ProgramData, tu peux lire, mais pour modifier il faut les droits du logiciel. Pour le dossier AppData, la lecture et l'écriture est libre (ce sont tes droits)

    Donc, si @Xelland veut utiliser 1 dossier sur le disque système, le mieux est de passer par l'API Windows : SHGetKnownFolderPath et les Ids des dossiers

    Code approximatif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
        PWSTR path = NULL;
     
        HRESULT hr = SHGetKnownFolderPath(&FOLDERID_Documents, 0, NULL, &path);
     
        if ( SUCCEEDED(hr) ) {
            size_t folder_path_size = wcslen(path);
     
            if (path[folder_path_size - 1] != L'\\') { folder_path_size++; }
     
            if ((folder_path_size + 7) < MAX_PATH) {
                wchar_t file_path[MAX_PATH];
                HANDLE hFile;
     
                if (path[folder_path_size - 1] != L'\\') {
                    wcsprintf(file_path, L"%s\\%s", path, L"log.txt");
                } else {
                    wcsprintf(file_path, L"%s%s", path, L"log.txt");
                }
     
                hFile = CreateFile(file_path, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
     
    //         ....
            } /* else manage error */
        } /* else manage error */
     
        CoTaskMemFree(path);

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par foetus Voir le message
    Il me semble qu'il poste ces derniers temps à cette heure : donc non
    Ben, si, c'est le temps des vacances donc il est en boite tout le temps

    Citation Envoyé par foetus Voir le message
    Donc, si @Xelland veut utiliser 1 dossier sur le disque système, le mieux est de passer par l'API Windows
    Oui éventuellement dans un second temps. Mais d'abord essayer la première version sur un autre chemin permettrait de détecter si le souci vient du programme ou du chemin.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Vu que tu es sur Win7, et que ça se lance dans C, il faut vérifier les permissions de l'utilisateur, de son groupe AD, de la machine, etc.
    Ouvrir juste log.txt va l'ouvrir à côté de l'exe, ce qui n'est pas terrible. Depuis une certaine version de Win7 il me semble que les fichiers devraient être ouverts dans un dossier où l'écriture est permise, généralement le dossier User ou AppData. Et que Microsoft a renforcé les restrictions dans les dossiers systèmes et Program Files où c'était yolo auparavant.

    Reste ce dont je parlais dans mon premier post : une restriction cachée de Windows que nous avons constaté. Depuis la dernière màj de Windows, ou peut-être la précédente, nous étions nombreux à avoir des erreurs d'écriture de fichier après une compilation - l'exe final.
    Nous pouvons ouvrir les fichiers dans le dossier, et les modifier. Nous pouvons aussi supprimer l'exe problématique, et bien sûr sa création fonctionne alors.
    Mais quand VS finit de compiler et veut écraser l'exe, erreur d'accès.
    Et nous avons remarqué que quand l'explorer est ouvert dans le dossier où l'exe sort, et que les fichiers sont réordonnés par date (parce que nous voulons avoir les logs récents en haut), l'erreur se produit. L'erreur a été remonté à MS il me semble.
    Donc il existe des morceaux de magie noire pas ou peu documentés.
    Donc est-ce que l'erreur se produit alors qu'un fichier existe déjà uniquement ? Ou bien sa création initiale échoue aussi ?
    Tu pourrais aussi utiliser un nom plus unique, qui contient une date d'exécution par exemple, afin d'avoir non pas un unique gros log.txt mais de plus petits pour chaque lancement. Et si la création initiale fonctionne tout le temps, ça corrigera le problème au passage.

    ps: svear : ta théorie est intéressante, mais la réalité est plus simple : https://fr.wikipedia.org/wiki/Fuseau_horaire et tu remarqueras le drapeau Canadien dans mon profil . Ce que tu appelles 5h15 un dimanche matin, j'appelle samedi 23h15 .
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre éclairé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2015
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Septembre 2015
    Messages : 204
    Points : 839
    Points
    839
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    il faut voir si la suppression est possible (une bête suppression par clic droit). S'il est vraiment maintenu par un autre truc, la suppression sera impossible. Toutefois si la modification par bloc note est possible cela pourrait alors signifier que l'hypothèse du maintien n'est pas la bonne.

    Il faudrait aussi peut-être essayer de corriger le chemin (ie hFile = CreateFile ("c:\...\...\log.txt", ...) car avec un chemin relatif "log.txt" le fichier sera créé à l'endroit où tu te trouves quand tu appelles le programme. Ainsi déjà tu seras sûr que tu le crées au bon endroit et que c'est bien ce fichier dont il s'agit.
    je vais voir avec un chemin absolu
    sinon je pense à l'antivirus ou un problème de droits, mais la personne n'étant pas informaticienne, je vais m'amuser pour expliquer
    mais je ne vois pas pourquoi l'antivirus bloquerait la création d'un fichier qui n'est pas dans un dossier système


    Citation Envoyé par Bousk Voir le message
    Donc est-ce que l'erreur se produit alors qu'un fichier existe déjà uniquement ? Ou bien sa création initiale échoue aussi ?
    l'erreur se produit :
    - création initiale => pas de création
    - fichier existe déjà => le fichier n'est pas écrasé


    Citation Envoyé par Bousk Voir le message
    Tu pourrais aussi utiliser un nom plus unique, qui contient une date d'exécution par exemple, afin d'avoir non pas un unique gros log.txt mais de plus petits pour chaque lancement. Et si la création initiale fonctionne tout le temps, ça corrigera le problème au passage.
    le code original est bien plus gros
    j'ai isolé la partie qui pose problème et la personne reproduit avec ce simple appel à CreateFile
    donc à priori pas un problème dans le nom du fichier

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Xelland Voir le message
    l'erreur se produit :
    - création initiale => pas de création
    - fichier existe déjà => le fichier n'est pas écrasé
    Ouais cela sent les droits d'écriture que tu n'as pas pour le dossier

  9. #9
    Membre éclairé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2015
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Septembre 2015
    Messages : 204
    Points : 839
    Points
    839
    Par défaut
    Citation Envoyé par foetus Voir le message
    Ouais cela sent les droits d'écriture que tu n'as pas pour le dossier
    la personne avait mis exécutable dans un dossier en dessous de "Mes Documents"

    En mettant l'exe sous C:\TEMP, là tout fonctionne correctement

    Citation Envoyé par Sve@r Voir le message
    Mais d'abord essayer la première version sur un autre chemin permettrait de détecter si le souci vient du programme ou du chemin.
    C'était bien le chemin


    Bizarre, sur mon poste, je n'ai pas ce problème sous "Mes Documents", peut-être une différence dans les droits ou une mise à jour sur un des 2 postes

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Xelland Voir le message
    je n'ai pas ce problème sous "Mes Documents"
    Moi je ne trouve cela pas anormal, même normal
    • 1 programme n'est pas censé écrire ses données dans ce dossier. Il y a par exemple, les dossiers ProgramData (pour tous les utilisateurs) et AppData (pour 1 utilisateur particulier)
    • Avec 1 ordinateur public ou pro, le dossier "Mes Documents" peut-être + ou - bloqué, parce que c'est le dossier par défaut de téléchargement des butineurs Internet, et donc 1 porte ouverte pour tout 1 tas de cochonneries. Cela peut être aussi faire parti d'1 politique que l'utilisateur ne peut rien installer, et donc on s'assure qu'il ne puisse pas télécharger de logiciels.

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Xelland Voir le message
    C'était bien le chemin
    Nom : 18020301335723496215532527.gif
Affichages : 691
Taille : 9,7 Ko
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Impossible d'écrire dans un fichier
    Par paulo.arras dans le forum C
    Réponses: 10
    Dernier message: 20/09/2009, 19h39
  2. Impossible d'écrire dans le fichier de log
    Par JCitrouille dans le forum Logging
    Réponses: 2
    Dernier message: 07/08/2008, 12h52
  3. Impossible d'écrire dans un fichier
    Par Olivier Regnier dans le forum Langage
    Réponses: 2
    Dernier message: 25/01/2008, 09h20
  4. Impossible d'écrire dans un fichier
    Par laurentUTC dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 30/04/2007, 12h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo