cadyf
Messages postés7Date d'inscriptiondimanche 25 mars 2007StatutMembreDernière intervention 8 décembre 2018
-
12 avril 2009 à 20:04
cadyf
Messages postés7Date d'inscriptiondimanche 25 mars 2007StatutMembreDernière intervention 8 décembre 2018
-
16 avril 2009 à 11:15
bonjour,
Essayer d'écrire sur un média protégé en écriture génère un message windows qui n'est pas intercepté par le programme.
Existe-t-il un moyen pour savoir, dans un programme, si un média est réellement disponible en écriture avant que windows n'intervienne?
merci.
cadyf.
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 12 avril 2009 à 21:20
Il y a aussi la fonction FileIsReadOnly(constFileName:string) qui renvoie la valeur true si elle a pu trouver et ouvrir FileName alors que le processus en cours n'a pas le droit d'écrire dans le fichier...
cadyf
Messages postés7Date d'inscriptiondimanche 25 mars 2007StatutMembreDernière intervention 8 décembre 2018 13 avril 2009 à 12:39
Bonjour,
<FileIsReadOnly(constFileName:string)>
je ne maitrise pas tout et ne disposant que de la version 5 de Delphi, je n'ai pas trouvé cette fonction...
<Regarde à FindFirst et FindNext ou encore à FileGetAttr dans l'aide Delphi>
je vais tester cette composition.
Miquel75
Messages postés41Date d'inscriptionmercredi 5 mars 2008StatutMembreDernière intervention23 avril 2009 13 avril 2009 à 22:03
FindFirst et FindNext n'ont rien à voir là-dedans (!)
Soit un disable la dialog Système, soit on teste avec l'api win32 Système si Disc writable = TRUE.
C'est une FAQ Win32 api depuis 1995 (voir [news://nntp.aioe.org/fr.comp.os.ms-windows.programmation groupe expert Win32 ]où ça a été largement détaillé ..)
Vous n’avez pas trouvé la réponse que vous recherchez ?
cadyf
Messages postés7Date d'inscriptiondimanche 25 mars 2007StatutMembreDernière intervention 8 décembre 2018 13 avril 2009 à 23:55
bonjour,
les premières solutions proposées ne conviennent pas (findfirst etc...).
mon problème reste de détecter si un média pouvant être protégé en écriture (par exemple un clé usb vue comme un disque) est effectivement protégé avant que windows ne prenne la main pour avertir l'utilisateur.
merci de m'aider, mais ne vous fâchez pas.
Cadyf
Personne se fache . Attention à l'utilisation du mot média (Un média est un fichier) et non un périphérique de stockage. C'est pour cela que Cari t'a proposé ses fonctions afin de faire une recherche de tes fichiers et de les tester. Pour répondre à ta question : si j'ai bien compris tu veux avertir l'utilisateur avant que windows le fasse, de la fermeture en écriture d'un tel périphérique : Et pourquoi ne pas intercepter ces messages windows justement ? Regarde du coté des hooks systeme .
Allez un petit extrait qui en dit long sur le personnage :
Et quel est le problème ?
Ce genre de sites n'a que des codes étant faits par du copier-coller, comme partout.
Il y a des dizaines d'extraits des mes codes aussi, postés sur tous les newsgroups depuis 18 ans.
Sans parler des copies intégrales de MSDN.
Qu'est-ce que ça peut bien faire ?
En fait tout les codes qu'il y a sur CS ne sont que des plagiats de ses codes : Bon Miquel pour mon prochain poste, je te donne combien pour les copyrights ??
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 15 avril 2009 à 14:16
Salut,
Miquel75 -> Ton aide est d'une rare inutilité. Soit plus précis ou abstiens toi.
cadyf ->
Regarde du côté de IOCTL_DISK_IS_WRITABLE, utilisable via DeviceIoControl.
Si tu as des problèmes avec la récupération du handle via CreateFile (Vista...), regarde les pré-requis nécessaires.
Je n'ai pas essayé ce code sur un heu... media en lecture seule.
const
IOCTL_DISK_IS_WRITABLE = $70024;
...
procedure TForm1.Button1Click(Sender: TObject);
var
hDisk: THandle; // Handle sur le disque
nReturned: Cardinal; // Taille des données retournées
begin
// Récupération d'un handle sur le disque
hDisk:= CreateFile('\\.\C:', 0,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING, 0, 0);
if hDisk = INVALID_HANDLE_VALUE then RaiseLastOSError;
if DeviceIoControl(hDisk,
IOCTL_DISK_IS_WRITABLE, // Code de contrôle
nil, // Buffer d'entrée
0, // Taille du buffer d'entrée
nil, // Buffer de sortie
0, // Taille du buffer de sortie
nReturned, // Nombre d'octets écris dans le buffer de sortie
nil) then // Overlapped
ShowMessage('Disque accessible en écriture')
else
if GetLastError = ERROR_WRITE_PROTECT then
ShowMessage('Le disque est read only')
else
RaiseLastOSError;
cadyf
Messages postés7Date d'inscriptiondimanche 25 mars 2007StatutMembreDernière intervention 8 décembre 2018 15 avril 2009 à 22:10
bonjour
moyennant le remplacement de RaiseLastOSError (inconnu) par RaiseLastWin32Error ce code fonctionne et répond exactement à ce que je souhaitais réaliser.
merci pour ce coup de main efficace,
Cadyf
cadyf
Messages postés7Date d'inscriptiondimanche 25 mars 2007StatutMembreDernière intervention 8 décembre 2018 16 avril 2009 à 11:15
bonjour,
j'ai bien noté la correction.
Pour le moment j'utilise la fonction dérivée suivante :
function disquedispoecriture(xx:char):boolean;
const IOCTL_DISK_IS_WRITABLE = $70024;
var ll : string;
hDisk : THandle; // Handle sur le disque
nReturned : Cardinal; // Taille des données retournées
begin
// Récupération d'un handle sur le disque
ll:='\\.\'+xx+':';
hDisk:= CreateFile(pchar(ll),0,FILE_SHARE_READ or FILE_SHARE_WRITE,nil, OPEN_EXISTING, 0, 0);
if hDisk = INVALID_HANDLE_VALUE then result:=false
else
begin
if DeviceIoControl(hDisk,
IOCTL_DISK_IS_WRITABLE, // Code de contrôle
nil, // Buffer d'entrée
0, // Taille du buffer d'entrée
nil, // Buffer de sortie
0, // Taille du buffer de sortie
nReturned, // Nombre d'octets écris dans le buffer de sortie
nil) then // Overlapped