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

API, COM et SDKs Delphi Discussion :

[D2009][Win7]Blocage suppression puis re-création d'un dossier


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Par défaut [D2009][Win7]Blocage suppression puis re-création d'un dossier
    Bonjour, voilà j'ai un soucis avec Windows 7 pour la gestion d'un répertoire temporaire.
    Ce répertoire sert à extraire des images d'une vidéo; comme il peut-être long à nettoyer, c'est plus rapide de le supprimer (avec DelDir de la FAQ) puis de le recréer, ça marche très bien sous XP mais pas sous windows 7, qui lors de la recréation bloque le dossier, je ne peux rien faire dessus tant que mon programme est actif, si je l'arrête et le relance, j'ai de nouveau accès au dossier; donc pas moyen avec mon prog sous Win 7 de faire plus d'une vidéo à la fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      FolderTemp:= ExtractFilePath(Application.ExeName) + 'TempVideo';
      if DirectoryExists(FolderTemp) then
        DelDir(FolderTemp);
      ForceDirectories(FolderTemp);
    Quelqu'un a-t-il déjà été confronté à ce phénomène ? Des idées pour le corriger ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Par défaut
    Bon, j'ai trouvé une solution intermédiaire en modifiant le DelDir pour en faire un "CleanDir". Mais tout de même si quelqu'un avait une explication quant à la réaction de Windows 7, je serai curieux de savoir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function CleanDir(Dir: String): Boolean;
    var
      fos: TSHFileOpStruct;
    begin
      Dir:= IncludeTrailingPathDelimiter(Dir) + '*.*';
    
      ZeroMemory(@fos, SizeOf(fos));
      with fos do begin
        wFunc := FO_DELETE;
        fFlags := FOF_SILENT or FOF_NOCONFIRMATION or FOF_FILESONLY;
        pFrom := PChar(Dir + #0);
      end;
      Result := (0=ShFileOperation(fos));
    end;

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Si tu joue avec SetCurrentDir ?
    Le RAD a le même défaut, il semble "locker" le dossier du projet ou dernier fichier ouvert

    Sinon, as-tu tenté plutôt que supprimer le dossier, de faire un SHFileOperation sur *.*

    Idem, dans un projet de video, j'extrais des images dans le dossier temporaire de l'utilisateur en cours

    J'avais ce code en Delphi, je ne l'ai plus, voici la variante C++Builder XE2
    Code c++ : 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
    27
    28
     
     
      if ( ! TempPath.IsEmpty())
      {
        TFileName TempMask = TempPath + "*.*";
     
        int Len = TempMask.Length();
        int Size = Len + 1; // +1 pour le caractère zéro terminal de chaine
     
        wchar_t* pFormArray = new wchar_t[Size + 1]; // +1 pour le caractère zéro terminal de tableau de chaine
        try
        {
          StrCopy(pFormArray, TempMask.c_str());
          pFormArray[Size] = 0; // Indique la fin du tableau de chaine
     
          SHFILEOPSTRUCTW DeleteCriteria;
          ZeroMemory(&DeleteCriteria, sizeof(DeleteCriteria));
          DeleteCriteria.wFunc = FO_DELETE;
          DeleteCriteria.pFrom = pFormArray;
          DeleteCriteria.fFlags = FOF_FILESONLY | FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI;
     
          SHFileOperationW(&DeleteCriteria);
        }
        __finally
        {
          delete [] pFormArray;
        }
      }


    EDIT : Grillé par istam3
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Par défaut
    Merci pour ton intérêt au sujet, et de ta réponse que j'ai effectivement envisagé de suite après le premier post.

    Sais-tu si c'est le code compilé qui bloque le dossier (ce n'est pas l'EDI, j'ai testé mon exe à part) ou Windows 7 ? Surment un question de droit sur le dossier, il est bloqué tant que l'exe n'est pas terminé.

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    je n'avais pas vu que c'était toi qui te répondait à toi même

    Je n'ai encore jamais bossé sous Seven, donc je ne peux pas me prononcer
    Peut-être l'UAC ou effectivement les droits même si au moment où tu crées le dossier, l'utilisateur en cours devient son owner donc il doit avoir le droit de l'ajouter

    J'ai un collègue a qui j'ai conseillé ForceDirectories hier, il a un Vista, juste après Force, il faisait un CopyFile directement après sans soucis

    Ton ForceDirectories fonctionne bien ?
    C'est la création de fichier à l'intérieur qui pose problème ?
    Est-ce lié à la suppression-recréation ?

    J'ai eu des soucis un peu du même, une DLL tiers créait des fichiers mais lors d'une erreur, ils ont mal géré la libération du fichier, du coup, il faut arrêter l'appli pour nettoyer
    Dans l'absolu, c'est dans TEMP, ça sera nettoyé par le Clean de l'instance suivante
    Pour éviter des problèmes, je nomme mes fichiers avec un TimeStamp et FMonitorID est lui carrément unique (ID fourni par la DLL, une sorte de Handle)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            DHString TempFileName = ShaiFormatString("%sSNP_%08x_%s.BMP",
              (TempPath, FMonitorID, FormatDateTime("YYYYMMDD_HHNNSSZZZ", Now())));
    fais pareil pour ton dossier temp un nom qui réduit les collisions, et tu nettoies tout à la fermeture du programme
    ..\TEMP\MonEXE\Video\Application->Handle\YYYYMMDD_HHNNSSHandle étant unique, tu nettoie le dossier de l'instance en cours
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Par défaut
    Le ForceDirectories ne fonctionne que si le dossier n'a pas été supprimé dans la même instance du programme.

    Le problème vient uniquement du fait de faire DelDir(dir) puis ForceDirectories(dir), là le dossier est encore visible dans l'explorer mais inaccessible (je pense que le ForceDirectories échoue, je n'ai pas testé le retour) et il est réellement supprimé à la fermeture du prog.

    Merci pour ta méthode, mais en soi je ne cherche pas plus loin, mon CleanDir fonctionne très bien, j'avais juste peur d'avoir à repartir dans du vieux code de suppression (avant d'utiliser DelDir et de connaître TSHFileOpStruct) je faisais une boucle avec un FindFirst(dir+'*', faanyfile, sr) et DeleteFile(sr.name) ce qui était vraiment beaucoup plus long.....

Discussions similaires

  1. Réponses: 9
    Dernier message: 14/09/2012, 18h06
  2. [D2009][Win7]Installation de police ttf par code de copie
    Par istam3 dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 05/11/2010, 14h13
  3. Blocage au niveau de création d'une mesure
    Par laimus dans le forum Conception/Modélisation
    Réponses: 1
    Dernier message: 22/03/2009, 23h15
  4. [VBA-A97] DAO : Suppression champs et création MCD...
    Par JeremieT dans le forum VBA Access
    Réponses: 27
    Dernier message: 01/06/2006, 17h34
  5. Récuperez la date de création d'un dossier
    Par @dinsx dans le forum C++Builder
    Réponses: 4
    Dernier message: 19/07/2005, 09h42

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