Accès concurrent sur un fichier

Signaler
Messages postés
10
Date d'inscription
dimanche 12 février 2006
Statut
Membre
Dernière intervention
2 décembre 2007
-
Messages postés
10
Date d'inscription
dimanche 12 février 2006
Statut
Membre
Dernière intervention
2 décembre 2007
-
Bonjour à tous,



J'utilise actuellement la méthode CreateProcess me permettant d'accéder à un serveur distant via IE...
J'aimerais pouvoir supprimer les traces dans IE.
Pour l'historique d'auto-complétion j'ai réussi à l'aide d'un objet COM (présent dans la MSDN), mais j'ai un soucis pour les dossiers Shell Historique :

Avec mon ordinateur (dual core, je sais pas si ça joue un rôle), j'arrive à ouvrir le fichier contenant l'historique, peu importe si IE est ouvert, mais avec certains PC l'accès y est bloqué tant qu'un processus IE est présent (je ne veux pas tous les fermer pour traiter l'information)...

Le fichier se trouve au path suivant :

%USERPROFILE%\Local Settings\Historique\History.IE5\MSHist012007120120071202\index.dat

Les chiffres présent dans le dernier dossier est la concaténation de la date d'aujourd'hui avec celle de demain (au format américain)...

L'idée est d'ouvrir ce fichier, de récupérer son contenu avant de créer le processus IE, puis de l'ouvrir une fois le processus fermé pour écraser son contenu (de cette manière je ne surcharge pas l'historique présent de IE).

Est-ce que qqn aurait une idée pour ouvrir ce fichier sans être bloqué ?

J'utilise la méthode ifstream pour l'ouverture de la manière suivante :

ifstream fileIn( path, ios::in | ios::binary )

La variable fileIn est NULL sur certain PC uniquement si un processus IEXPLORE est présent.

Y a t'il une autre méthode à utiliser pour garantir l'ouverture de ce fichier ?

Fermer les HANDLE des processus IE sur ce fichier pourrait être une solution ?

Si oui comment faire ? J'arrive à parcourir tous les processus, les ouvrir mais je ne sais pas quoi en faire...

Merci d'avance pour votre aide !

10 réponses

Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Salut,
Essaye CreateFile avec FILE_SHARE_READ et FILE_SHARE_WRITE
http://msdn2.microsoft.com/en-us/library/aa363858.aspx

Neo_Fr
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Et ne met pas %USERPROFILE% comme ca, ca marchera pas,
il faut que tu utilise SHGetFolderPath (http://msdn2.microsoft.com/en-us/library/bb762181.aspx) pour recuperer le path de l'utilisateur..

Neo_Fr
Messages postés
10
Date d'inscription
dimanche 12 février 2006
Statut
Membre
Dernière intervention
2 décembre 2007

Merci Neo_Fr pour tes réponses !

Je vais essayer et je te tiens au courant...

A juste titre informatif, en quoi la méthode CreateFile permettrait l'ouverture de ce fichier alors qu'ifstream est bloqué (quelle est la différence) ?

J'ai pas mis directement %USERPROFILE%, c'était juste pour l'exemple...
J'utilise GetEnvironmentVariable( "USERPROFILE" ) pour limiter au minimum l'exécution...

La méthode CreateFile va créer le fichier s'il n'existe pas ?

Il ne faudrai pas qu'il le créé, car s'il n'existe pas c'est que l'OS du PC est en anglais... L'idéal avec ifstream est qu'il retourne NULL si le fichier n'existe pas, alors je sais que le path sera ...\History\History.IE5\...

Est-ce que c'est possible d'ouvrir le fichier en binaire avec cette méthode ?

La structure du fichier contient plein de end_of_text et de end_of_line, il ne me faudrai pas que Windows interprête son contenu, j'aimerais simplement le récupère entièrement...

Merci pour ton aide !
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
CreateFile va ouvrir et/ou créer selon flags que tu passeras à la fonction.
API ne bosse QUE en mode binaire, aspire ou écrit des paquets d'octets et rien de plus. Ce sont les libs d'interprétation qui amènent de faux concepts, API jamais.

ciao...
BruNews, MVP VC++
Messages postés
10
Date d'inscription
dimanche 12 février 2006
Statut
Membre
Dernière intervention
2 décembre 2007

Ok merci pour l'info !

J'ai essayé avec CreateFile de la manière suivante :

HANDLE hShellHist = CreateFile( path, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0 );




Le path est juste, je l'ai contrôlé avec un éditeur de texte. Pourtant, si j'essaie avec un fichier de test sur mon bureau (genre test.txt), pas de problème (si le fichier n'existe pas, hShellHistorique = INVALID_HANDLE_VALUE, sinon je l'ouvre et récupère son contenu)...

En essayant ensuite sur le vrai path, je me rend compte que hShellHist est toujours égal à INVALID_HANDLE_VALUE...

Est-ce que quelqu'un aurait une idée ?!?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
donne le code exact qu'on sache le problème.

ciao...
BruNews, MVP VC++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Si iexplore a ouvert les fichiers sans FILE_SHARE_READ de toutes facons tu ne pourra pas le lire

_____________________________________
Messages postés
10
Date d'inscription
dimanche 12 février 2006
Statut
Membre
Dernière intervention
2 décembre 2007

Pourtant iexplore arrive à supprimer une entrée de l'historique peut importe le nombre de processus en cours...

Voici le code :

void DisplayURL::deleteFolderUrl( int etat )
{
    if( etat == CHARGER )
    {
        // Path utilisateur courant
        GetEnvironmentVariable( "USERPROFILE", envVar, TAILLE_BUFFER );
        strcat_s( envVar, "\\Local Settings\\Historique\\History.IE5\\MSHist01" );
        // Recuperation de la date du systeme
        GetLocalTime( &sysTime );
        string date = getDateTomorrow( ( int )sysTime.wDay, ( int )sysTime.wMonth, ( int )sysTime.wYear );
        strcat_s( envVar, date.c_str() );
        strcat_s( envVar, "\\index.dat" );

        // Ouverture du fichier
        hShellHist = CreateFile( envVar, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0 );
        if( hShellHist == INVALID_HANDLE_VALUE )
        {
            // OS Anglais
            // Path utilisateur courant
            GetEnvironmentVariable( "USERPROFILE", envVar, TAILLE_BUFFER );
            strcat_s( envVar, "\\Local Settings\\History\\History.IE5\\MSHist01" );
            strcat_s( envVar, date.c_str() );
            strcat_s( envVar, "\\index.dat" );
            hShellHist = CreateFile( envVar, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0 );
        }
        if( hShellHist == INVALID_HANDLE_VALUE )
        {
            // Le fichier n existe pas (ie n a pas encore ete ouvert)
            etatLecture = false;
        }
        else
        {
            // On se place sur le premier caractere
            SetFilePointer( hShellHist, NULL, NULL, FILE_BEGIN );
            // Recuperation du contenu
            ReadFile( hShellHist, bufferFile, sizeof( int ), &numberBytes, 0 );
            // Fermeture du fichier
            CloseHandle( hShellHist );
            // Recuperation effectuee avec succes
            etatLecture = true;
        }
    }
    else if( etat == REMPLACER )
    {
        // Ouverture du fichier
        hShellHist = CreateFile( envVar, GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0 );
        // Effacement de son contenu
        SetFilePointer( hShellHist, NULL, NULL, FILE_BEGIN );
        SetEndOfFile( hShellHist );
        // On ajoute le contenu precedent
        if( etatLecture )
        {
            WriteFile( hShellHist, bufferFile, numberBytes, NULL, 0 );
            // Fermeture du fichier
            CloseHandle( hShellHist );
            etatLecture = false;
        }
    }
}
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Rien a voir avec ton pb mais sa va te servir a quoi de récuperer 4 octet?
ReadFile( hShellHist, bufferFile, sizeof( int ), &numberBytes, 0 );

Neo_Fr
Messages postés
10
Date d'inscription
dimanche 12 février 2006
Statut
Membre
Dernière intervention
2 décembre 2007

Effectivement c'est une erreur de ma part, je commence à fatiguer...

Je vais calculer la taille du fichier afin d'allouer la taille du buffer en conséquence...

Merci pour la remarque...

Sinon, pour l'ouverture du fichier, une idée ?