ludo2223
Messages postés49Date d'inscriptionjeudi 4 septembre 2008StatutMembreDernière intervention31 janvier 2010
-
15 avril 2009 à 10:56
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 2021
-
15 juin 2009 à 10:26
Bonjour à tous,
Je travaille sur une application utilisant des bases de données Paradox.
Lorsque l'utilisateur supprime un élément depuis l'application je supprime sa base de données associée (fonctionne).
Le répertoire est donc vide mais je ne peux pas le supprimer, windows indique que le répertoire est en cours d'utilisation.
(si je ferme mon programme la suppression redeviens possible. Je pense donc à une ressource non libérée mais je ne vois pas laquelle étant donné que le répertoire ne contient que la base que je libère pour la supprimer.)
Je fait donc appel à vous, si vous avez des idées ?
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 15 avril 2009 à 14:02
peut etre que le repertoire courant est ton dossier en question (que tu peux verifier par un getDir), il faut donc que tu fasse un ChDir si c'est le cas
ludo2223
Messages postés49Date d'inscriptionjeudi 4 septembre 2008StatutMembreDernière intervention31 janvier 2010 15 avril 2009 à 14:56
Bonjour,
Merci pour votre réponse.
Je viens de tester getDir mais il ne me renvoie pas le dossier en question, de même avec GetCurrentDir.
J'ai tout de même testé un ChDir avant la suppression au cas où mais malheureusement cela n'a pas résolu le problème.
En tout cas merci pour l'info, je ne connaissais pas.
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 15 avril 2009 à 16:03
@cantador : je suis pas sur que la piste de la connexion a la base soit en cause, vu qu'il arrive bien a supprimer le fichier (donc il ne doit pas etre verouillé). Apres, je sais pas tout ce qui se passe derriere la connexion mais je suis pas sur que ce soit ca qui verouille le dossier.
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 15 avril 2009 à 16:28
hummhhhh, oui c'est bien vu mais la connexion est établie
soit sur un .db ou un alia, c'est-à-dire le chemin d'accès à la base et ensuite on choisit la table, donc le dossier est verrouillé d'après moi..
on a pas suffisamment (comme dab..) d'élèments pour se prononcer.
En tout cas, ça ne coûte rien d'essayer cette déconnexion
ludo2223
Messages postés49Date d'inscriptionjeudi 4 septembre 2008StatutMembreDernière intervention31 janvier 2010 16 avril 2009 à 09:37
Bonjour,
Merci pour vos réponses. Je vais essayer d'être plus précis.
Je travaille sur une base paradox (fichier de type .db) située en local sur le même disque que mon application.
Pour l'utiliser dans une procédure par exemple, j'ai un objet de type TTable, je lui donne le chemin de ma table (C:\maTable.db) à l'aide de TableName.
Ensuite je met l'attribut Active à True et je fait mes modification dedans.
Une fois que tout est terminé et fait un commit (méthode post par exemple), je rends la table inactive (Active := False) et je fait un Free dessus pour libérer la mémoire.
Je n'utilise par de méthode qui permettent de choisir une base et mon dossier ne contient que le fichier maTable.db et ses index.
Une fois le Free effectué je supprime le contenu du répertoire (cela fonctionne parfaitement) et ensuite j'essaie de supprimer le répertoire (et là, ça ne fonctionne pas). Le message d'erreur dit que le dossier est en cours d'utilisation.
J'ai affiché les fichiers caché et les fichiers système et le dossier est bien vide.
(Comme dis précedemment le getDir ne me retourne pas le répertoire bloqué et le ChDir juste avant de supprimer ne corrige pas le problème mais ces deux méthodes me rendront service pour la suite ;) )
ludo2223
Messages postés49Date d'inscriptionjeudi 4 septembre 2008StatutMembreDernière intervention31 janvier 2010 16 avril 2009 à 10:03
C'était juste pour l'exemple désolé, à remplacer par C:\toto\maTable.db. (Le blocage étant sur toto).
Le blocage persiste même après la fermeture de la fenêtre concernée mais disparait lorsque je fermer l'appli.
ludo2223
Messages postés49Date d'inscriptionjeudi 4 septembre 2008StatutMembreDernière intervention31 janvier 2010 16 avril 2009 à 11:30
J'ai créé une maquette qui ne fait que se "connecter" à la base et fermer la connexion avec un bouton par action.
Pour que le dossier soit libéré je suis obligé de faire ouvrir une autre base au composant.
Voici mon code de création de l'objet et connexion :
(code d'un bouton)
Si je ne met pas le bloc 2 mon dossier n'est pas libéré.
De même dans le bloc 2 si je ne fait pas le "Open" je rencontre le même problème. Je suis obligé de charger une autre table (d'un autre répertoire) pour libérer le précédent.
function DelDir(Dir: string): Boolean;
var
fos: TSHFileOpStruct;
begin
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_DELETE;
fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
pFrom := PChar(Dir + #0);
end; Result :(0 ShFileOperation(fos));
end;
procedure EffaceFichier(CurDir: string);
var
searchResult: TSearchRec;
begin
SetCurrentDir(CurDir);
if FindFirst('*.*', faAnyFile, searchResult) = 0 then
begin
repeat
DeleteFile(searchResult.Name);
until FindNext(searchResult) <> 0;
FindClose(searchResult);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Table1.Open;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Table1.Close; // ferme la table
EffaceFichier('c:\Test'); // efface tous les fichiers du dossier
if DelDir('c:\Test\') then // et là ce p.. de dossier devrait virer mais
showmessage('ok') // quedal !
else
showmessage('no');
end;
end.
ludo2223
Messages postés49Date d'inscriptionjeudi 4 septembre 2008StatutMembreDernière intervention31 janvier 2010 16 avril 2009 à 16:04
Merci beaucoup pour vos recherches.
Ce que je ne comprend pas dans cette histoire c'est que j'ai l'impression que même si on fait un close puis un free, BDE ne veut pas lâcher le morceau !
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 16 avril 2009 à 16:56
il faut dire aussi que la connexion par le path du .db dans TableName est peu utilisé..
on lui préfère la déclaration d'un alia qui pointe sur le dossier et on choisit ensuite le .db dans une liste déroulante
ludo2223
Messages postés49Date d'inscriptionjeudi 4 septembre 2008StatutMembreDernière intervention31 janvier 2010 16 avril 2009 à 18:03
Oui vous avez raison. J'ai cherché du coté des alias pour savoir si ils se créaient automatiquement et j'ai parcouru la liste pour les supprimer mais le problème reste présent.
La seule méthode qui a fonctionné jusqu'à présent c'est de lui faire ouvrir une autre base. Je sais pas si on peut lui donner une constante particulière parce que si le chemin est incorrect le Open échoue et le problème persiste.
J'ai également tenté une suppression manuelle des index puis de celle de table : ca me vide le dossier mais il reste bloqué.
Je travaille sur une application assez importante qui existe déjà donc changer la méthode de connexion et d'exécution représente un travail énorme. C'est pour ca que je cherche une alternative ;)
Merci beaucoup pour vos recherches en tout cas. Je continue encore demain ! ;)
ludo2223
Messages postés49Date d'inscriptionjeudi 4 septembre 2008StatutMembreDernière intervention31 janvier 2010 12 mai 2009 à 16:11
Bonjour,
Depuis cette semaine je recommence à travailler sur ce projet. Je me suis donc penché à nouveau sur le problème et j'ai donc essayé les sessions et alias.
Voici mon code (qui compile et ne génère pas d'erreur mais continue de bloquer le répertoire) :
procedure TForm1.Button1Click(Sender: TObject);
var Session : TSession;
List : TStringList;
base:TDatabase;
TableSession:TTable;
begin
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 12 mai 2009 à 19:20
Lorsque l'utilisateur supprime un élément depuis l'application je supprime sa base de données associée (fonctionne).
Le répertoire est donc vide mais je ne peux pas le supprimer, windows indique que le répertoire est en cours d'utilisation.
il y a manifestement encore quelque chose qui est loggé sur le dossier...
essaie de voir avec le directory
base.Directory := 'C:\xxx';
si tu ne peux pas le vider..
Quand on est bloqué, il faut chercher à contourner l'obstacle et reprendre l'hypothèse de départ que j'ai rappelée.
Est-ce vraiment nécessaire de supprimer ce dossier ?