Précédent   Forum des professionnels en informatique > Autres langages > Pascal > Lazarus
Lazarus Forum d'entraide sur Lazarus, l'EDI RAD multiplateforme basé sur Free Pascal
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/02/2012, 17h14   #1
Membre expérimenté
 
Homme Gilles
Enseignant
Inscription : novembre 2006
Messages : 601
Détails du profil
Informations personnelles :
Nom : Homme Gilles
Âge : 53
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : novembre 2006
Messages : 601
Points : 570
Points : 570
Par défaut Upload de fichiers verrouillés sous Windows

Bonjour,

Je travaille avec Synapse sous Win 7. Je veux uploader quelques fichiers. Je rencontre un problème avec les fichiers verrouillés.
Citation:
The sharing mode parameter in the CreateFile function used to open files determines file-sharing. Files can be opened to allow sharing the file for read, write, or delete access. Subsequent attempts to open the file must be compatible with all previously granted sharing-access to the file. When the file is closed, sharing-access restrictions are adjusted to remove the restrictions imposed by that specific file open. Source
Ainsi par exemple dans un répertoire à uploader, un project1.exe (compilé avec FPC) en train de s'exécuter sur le poste Client peut être uploadé vers le serveur FTP... mais pas un fichier Sansnom1.odt ouvert.

Existe-t-il une solution en Lazarus pour déterminer le mode de "verrouillage à l'ouverture" des fichiers Windows ? Je n'ai rien vu. Mais je crois me rappeler que CopyFile rencontre "déjà" ce problème.

Je suppose qu'il est nécessaire de passer par les API puisqu'un copier-coller à partir de Windows est possible sur le fichier Sansnom1.odt ouvert. Et là, cela va se compliquer sérieusement entre les Windows 32 et 64 bits et peut-être même entre les versions de Windows (XP ou 7).

Donc en Lazarus... une "ruse" cachée, le "complément" d'un FileOpen ?

Merci. Cordialement.
Gilles
selzig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 13h26   #2
Membre expérimenté
 
Homme Gilles
Enseignant
Inscription : novembre 2006
Messages : 601
Détails du profil
Informations personnelles :
Nom : Homme Gilles
Âge : 53
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : novembre 2006
Messages : 601
Points : 570
Points : 570
OK sans utiliser les API, il est possible de détecter le blocage avec les TFileStream... et également de forcer une copie.
Cordialement. Gilles
selzig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 17h06   #3
Membre chevronné
 
Philippe
Inscription : avril 2002
Messages : 456
Détails du profil
Informations personnelles :
Nom : Philippe
Localisation : France

Informations forums :
Inscription : avril 2002
Messages : 456
Points : 688
Points : 688
Envoyer un message via ICQ à Ph. B.
Bonjour,

Par curiosité et bien que le sujet soit clos, j'ai repris votre exemple et j'ai constaté presque les mêmes choses, à savoir :
CopyFile fonctionne pour un exécutable démarré mais pas un fichier *.odt (j'utilise LibreOffice 3.4.5).
FileOpen, FileCreate, FileRead, FileWrite et FileClose fonctionnent si le fichier source a été ouvert avec le paramètre fmShareDenyNone, mais pas avec le paramètre fmOpenRead.
Dans ce dernier cas, le fichier peut être ouvert mais pas lu...

Pour information, en espérant que cela aidera...
--
Philippe.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 15h39   #4
Membre expérimenté
 
Homme Gilles
Enseignant
Inscription : novembre 2006
Messages : 601
Détails du profil
Informations personnelles :
Nom : Homme Gilles
Âge : 53
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : novembre 2006
Messages : 601
Points : 570
Points : 570
Bonjour,
pour les .odt, on peut procéder ainsi :

Code :
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
function isLockedFile(aFile : String) : Boolean;
var
 aFS : TFileStream;
begin
 Result := False;
 try
  aFS := TFileStream.Create(aFile, fmOpenRead);
  aFS.Free;
 except
  Result := True;
 end;
end;
 
function myCopy(aFileSrc, aFileDst : String) : Boolean;
var
 nTmp : int64;
 aFSsrc, aFSdst : TFileStream;
begin
 Result := True;
 try
  aFSsrc := TFileStream.Create(aFileSrc, fmOpenRead or fmShareDenyNone);
  try
   aFSdst := TFileStream.Create(aFileDst, fmCreate);
   try
    nTmp := aFSdst.CopyFrom(aFSsrc, 0);
   except
    Result := False;
   end;
  except
   Result := False;
  end;
 finally
  if Assigned(aFSdst) then aFSdst.Free;
  if Assigned(aFSsrc) then aFSsrc.Free;
 end;
end;
 
procedure TForm1.Button1Click(Sender : TObject);
begin
 Showmessage('LockedFile : ' + BoolToStr(isLockedFile('Sans nom1.odt')));
 Showmessage('FileCopy : ' + BoolToStr(myCopy('Sans nom1.odt','Sans nom2.odt')));
end;
En supposant le fichier Sans nom1.odt ouvert :
  • la fonction isLockedFile détecte bien que le fichier Sans nom1.odt est ouvert (-> -1),
  • la fonction myCopy copie Sans nom1.odt (en le laissant ouvert) en Sans nom2.odt.
Merci pour votre aide.
Cordialement. Gilles
selzig est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h48.


 
 
 
 
Partenaires

Hébergement Web