| 
		
 
 |  |  | auteur : Farscape |  | Avec la fonction _access :
 | 
int_access(constchar*path,intmode );
 | 
Valeurs pour mode :
		 
 
			00 : test de l'existence uniquement ;02 : permission d'écriture ;04 : permission lecture ;06 : permission lecture / écriture. | 
#include <io.h>#include <errno.h>if((_access("troll.c",0))!=-1){printf("Fichier troll.c existe\n");if( (_access(" troll.c ",2))!=-1)printf("le Fichier troll.c est ok pour l'écriture\n");}else{switch(errno){caseEACCES :printf("accès interdit\n ");break;caseENOENT:printf("fichier ou chemin incorrect \n") ;break;}}
 | 
 | 
|  |  | auteur : Farscape |  | Avec la fonction SHBrowseForFolderA:Exemple complet d'implémentation:
 | 
CString strTmpPath;
intCALLBACKBrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData){TCHAR szDir[MAX_PATH];switch(uMsg){caseBFFM_INITIALIZED:if(lpData){strcpy(szDir, strTmpPath.GetBuffer(strTmpPath.GetLength()));SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)szDir);}break;caseBFFM_SELCHANGED:{if(SHGetPathFromIDList((LPITEMIDLIST) lParam ,szDir)){SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szDir);}break;}default:break;}return0;}BOOLGetFolder(CString*strSelectedFolder,constchar*lpszTitle,constHWND hwndOwner,constchar*strRootFolder,constchar*strStartFolder){charpszDisplayName[MAX_PATH];
    LPITEMIDLIST lpID;
    BROWSEINFOA bi;
    bi.hwndOwner=hwndOwner;if(strRootFolder==NULL){bi.pidlRoot=NULL;}else{LPITEMIDLIST  pIdl=NULL;
        IShellFolder*pDesktopFolder;charszPath[MAX_PATH];
        OLECHAR       olePath[MAX_PATH];
        ULONG         chEaten;
        ULONG         dwAttributes;strcpy(szPath, (LPCTSTR)strRootFolder);if(SUCCEEDED(SHGetDesktopFolder(&pDesktopFolder))){MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szPath,-1, olePath, MAX_PATH);
            pDesktopFolder->ParseDisplayName(NULL,NULL, olePath,&chEaten,&pIdl,&dwAttributes);
            pDesktopFolder->Release();}bi.pidlRoot=pIdl;}bi.pszDisplayName=pszDisplayName;
    bi.lpszTitle=lpszTitle;#if _MFC_VER < 0x0700bi.ulFlags=BIF_RETURNONLYFSDIRS|BIF_STATUSTEXT;#elsebi.ulFlags=BIF_RETURNONLYFSDIRS|BIF_STATUSTEXT|BIF_NEWDIALOGSTYLE;OleInitialize(NULL);#endifbi.lpfn=BrowseCallbackProc;if(strStartFolder==NULL){bi.lParam=FALSE;}else{strTmpPath.Format("%s", strStartFolder);
        bi.lParam=TRUE;}bi.iImage=NULL;
    lpID=SHBrowseForFolderA(&bi);if(lpID!=NULL){BOOL b=SHGetPathFromIDList(lpID, pszDisplayName);if(b==TRUE){strSelectedFolder->Format("%s",pszDisplayName);returnTRUE;}}else{strSelectedFolder->Empty();}returnFALSE;}
 | 
utilisation:
 | 
CString strRepertoire="c:\\";if(GetFolder(&strRepertoire,"Sélection du répertoire",this->m_hWnd,NULL,NULL)){if(!strRepertoire.IsEmpty()){}}
 | 
Une info intéressante pour rajouter un bouton de création de répertoire :
 | 
 bi.ulFlags=BIF_NEWDIALOGSTYLE;
 | 
Le hic c'est que cette option fonctionne correctement à partir de Windows 2000 ,elle s'appuie sur shell32.dll et seulement la version 5.0 supporte cette nouvelle fonctionnalité.Elle n'est pas disponible  sous  NT4,w95 ou 98 (traduction doc MSDN).
 Il faudra rajouter à votre code
 | 
#ifndef BIF_NEWDIALOGSTYLE#define BIF_NEWDIALOGSTYLE 0x0040#endif
 | 
 | 
|  |  | auteur : Farscape |  | Avec la fonction GetOpenFileName:Exemple d'implémentation complet:
 | 
#include <direct.h>BOOLDlgSelFicName(CWnd*pParent,CString&rstrFileName,LPCTSTR pszExt,BOOL bUnlink=FALSE){#define MAXPATH 256charszDrive[_MAX_DRIVE];charszDir[_MAX_DIR];charszFname[_MAX_FNAME];charszExt[_MAX_EXT];
    OPENFILENAME ofn;charszFileBuf[MAXPATH];charszpathDir[128],*pszPath=NULL,
    szbufDir[128];
    CString strRet;
    pszPath=(char*)_getcwd(NULL,127);
    szFileBuf[0]=0;if(!rstrFileName.IsEmpty()){_splitpath((constchar*)rstrFileName, szDrive, szDir, szFname, szExt);strcpy(szpathDir,szDrive);strcat(szpathDir,szDir);strcpy(szFileBuf,szFname);strcat(szFileBuf,szExt);}else{strRet=AfxGetApp()->GetProfileString("OpenFileName","Path","");strcpy(szbufDir,strRet);if(strlen(szbufDir))strcpy(szpathDir,szbufDir);elsestrcpy(szpathDir,pszPath);}ofn.lStructSize=sizeof(OPENFILENAME);
    ofn.hwndOwner=(pParent?pParent->GetSafeHwnd():NULL);
    ofn.lpstrFilter=pszExt;
    ofn.lpstrCustomFilter=NULL;
    ofn.nFilterIndex=0;
    ofn.lpstrFile=szFileBuf;
    ofn.nMaxFile=MAXPATH;
    ofn.lpstrFileTitle=NULL;
    ofn.lpstrInitialDir=szpathDir;
    ofn.lpstrTitle=NULL;
    ofn.Flags=OFN_EXPLORER|OFN_PATHMUSTEXIST;
    ofn.lpstrDefExt=NULL;
    rstrFileName="";
    BOOL bOK=FALSE;if(GetOpenFileName(&ofn)){CString e;_splitpath(szFileBuf, szDrive, szDir, szFname, szExt);sprintf(szpathDir,"%s%s",szDrive,szDir);AfxGetApp()->WriteProfileString("OpenFileName","Path",szpathDir);sprintf(szFileBuf,"%s%s%s",szDrive,szDir,(strlen(szFname)?szFname:""));
        e=pszExt;
        e=e.Right(5);
        e=e.Left(4);strcat(szFileBuf,(strlen(szExt)?szExt:e));
        rstrFileName=szFileBuf;if(bUnlink)_unlink(szFileBuf);
        bOK=TRUE;}elserstrFileName="";if(pszPath){_chdir(pszPath);free(pszPath);}returnbOK;}
 | 
Utilisation 
 | 
CString strFileName;
::DlgSelFicName(this,strFileName,"Fichiers Txt (*.txt)\0*.txt\0");::DlgSelFicName(this,strFileName,"Fichiers Texte (*.txt)\0*.txt\0Fichiers csv (*.csv)\0*.csv\0Fichiers tabulations (*.txt)\0*.txt\0");
 | 
 | 
|  |  | auteur : Abelman |  | Affiche tous les fichiers et répertoires en utilisant le filtre c:\*.*La première version est avec les MFC:
 | 
CFileFind f;
BOOL bMoreFiles =f.FindFile("c:\\*.*");while(bMoreFiles){bMoreFiles=f.FindNextFile();if(f.IsDirectory())
    cout<<(LPCSTR)f.GetFileName()<<" : Repertoire"<<endl;elsecout<<(LPCSTR)f.GetFileName()<<" : Taille="<<f.GetLength()<<endl;}
 | 
version sans les MFC
 | 
WIN32_FIND_DATA data;
HANDLE h =FindFirstFile("c:\\*.*",&data);
BOOL bMoreFiles=(h!=INVALID_HANDLE_VALUE);while(bMoreFiles){if(data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
    cout<<data.cFileName<<" : Repertoire"<<endl;elsecout<<data.cFileName<<" : Taille="<<(data.nFileSizeHigh*MAXDWORD)+data.nFileSizeLow<<endl;
    bMoreFiles=FindNextFile(h,&data);}if(GetLastError()!=ERROR_NO_MORE_FILES)
    cout<<"erreur  = "<<GetLastError()<<endl;if(h!=INVALID_HANDLE_VALUE)FindClose(h);
 | 
 | 
|  |  | auteur : Farscape |  | | 
TCHAR szDir[MAX_PATH] ="";if(!::GetCurrentDirectory(sizeof(szDir)-1, szDir)){}
 | 
 | 
|  |  | auteur : Farscape |  | | 
if(::SetCurrentDirectory("c:\\MyProjects\\Dvp")==FALSE){}
 | 
 | 
|  |  | auteur : Farscape |  | | 
TCHAR szWindDir[MAX_PATH] ="";
UINT nRetLen=::GetWindowsDirectory(szWindDir,sizeof(szWindDir));if(!nRetLen){}elseif(nRetLen>sizeof(szWindDir)){}else{}
 | 
 | 
|  |  | auteur : Farscape |  | Le petit exemple ci-dessus explore les lettres de B à Z et récupère  L'information concernant l'unité trouvée,Les lecteurs réseaux sont aussi détectés et reconnectés le cas  échéant.
 | 
voidExploreDrives(){charlet,szbuf[5];intnError;charszRemote[256];
    DWORD l=255;shortint*pt=NULL;
    CString str;
    UINT ntyp;for(let='B';let<='Z';let++){sprintf(szbuf,"%c:",let);if((nError=WNetGetConnection(szbuf,szRemote,&l))==NO_ERROR){TRACE("\nWnet:%s",szRemote);}else{str.Format("%c:\\",let);
            ntyp=GetDriveType(str);TRACE("\nDrive :%s :%d"",(const char *)str,ntyp);if(ntyp==DRIVE_CDROM){continue;}if(ntyp==DRIVE_REMOVABLE){continue;}if(ntyp==DRIVE_FIXED){continue;}elseif(nError==ERROR_CONNECTION_UNAVAIL){if(WNetAddConnection(szRemote,NULL,szbuf)==NO_ERROR){}}}}}
 | 
 | 
|  |  | auteur : nico-pyright(c) |  | | charmesDocumentsPath[MAX_PATH];SHGetSpecialFolderPath(0,mesDocumentsPath,CSIDL_PERSONAL,0);charapplicationData[MAX_PATH];SHGetSpecialFolderPath(0,applicationData,CSIDL_COMMON_APPDATA,0);charbureau[MAX_PATH];SHGetSpecialFolderPath(0,bureau,CSIDL_DESKTOPDIRECTORY,0);charfavoris[MAX_PATH];SHGetSpecialFolderPath(0,favoris,CSIDL_FAVORITES,0);charmaMusique[MAX_PATH];SHGetSpecialFolderPath(0,maMusique,CSIDL_MYMUSIC,0);charmesImages[MAX_PATH];SHGetSpecialFolderPath(0,mesImages,CSIDL_MYPICTURES,0);charprofile[MAX_PATH];SHGetSpecialFolderPath(0,profile,CSIDL_PROFILE,0);charprogramFiles[MAX_PATH];SHGetSpecialFolderPath(0,programFiles,CSIDL_PROGRAM_FILES,0);charsendTo[MAX_PATH];SHGetSpecialFolderPath(0,sendTo,CSIDL_SENDTO,0);
 | 
Note: Si le dernier paramètre est positionné à 1, il permet de créer l'entrée. 
 | 
|  |  | auteur : nico-pyright(c) |  | il y a plusieurs façons de le faire, le but étant d'obtenir une variable de type FILETIME correctement renseignée.Voilà un exemple en utilisant l'API GetFileAttributesEx
 
 | 
charnomFichier[]="test.txt";
WIN32_FILE_ATTRIBUTE_DATA attr;
FILETIME ftlocal;
SYSTEMTIME st;GetFileAttributesEx( nomFichier, GetFileExInfoStandard,&attr);FileTimeToLocalFileTime(&attr.ftCreationTime,&ftlocal);FileTimeToSystemTime(&ftlocal,&st);chardate[50];wsprintf(date,"%02d/%02d/%04d-%02d:%02d:%02d",
st.wDay,st.wMonth,st.wYear,st.wHour,st.wMinute,st.wSecond);MessageBox(0,date,"Date de création du fichier",MB_ICONSTOP);
 | 
la structure WIN32_FILE_ATTRIBUTE_DATA nous donne aussi la possibilité d'utiliser la date de dernier accès ftLastAccessTime
 la date de derniere écriture ftLastWriteTime
 
 
 | 
|  |  | auteur : nico-pyright(c) |  | On peut éviter de faire une fonction récursive qui supprime tous les fichiers dans tous les répertoires en déléguant ceci aux fonctions Shell de l'API.Ici en l'occurence, on se sert d'une fonctionnalité de l'API SHFileOperation.
 | #include <shellapi.h>boolmyDeleteDirectory(LPCTSTR repertoire,boolsuppressionDefinitive=true){ints=strlen(repertoire);
    TCHAR*rep=newTCHAR[strlen(repertoire)+2];strcpy(rep, repertoire);
    rep[strlen(repertoire)+1]='\0';
    SHFILEOPSTRUCT sh;
    sh.hwnd=NULL;
    sh.wFunc=FO_DELETE;
    sh.pFrom=rep;
    sh.pTo=NULL;
    sh.fFlags=FOF_NOCONFIRMATION|FOF_SILENT;if(!suppressionDefinitive)
        sh.fFlags|=FOF_ALLOWUNDO;
    sh.fAnyOperationsAborted=FALSE;
    sh.lpszProgressTitle=NULL;
    sh.hNameMappings=NULL;delete[] rep;return(SHFileOperation(&sh)==0);}
 | 
|    myDeleteDirectory("d:\\test",false);
 | 
NB : Prendre garde à ne pas utiliser de chemin relatif et à toujours utiliser un chemin absolu.Sinon, cette utilisation n'est pas garantie et peut provoquer un comportement indéterminé.
 On utilise une liste d'emplacements à supprimer, séparés par des \0, et qui se termine par un double \0
 
 | 
|  |  | auteur : Farscape |  | En utilisant la fonction :
 | 
BOOL PathFileExists(LPCTSTR pszPath);
 | 
Cette fonction détermine si un fichier ou un chemin existe.Pour l'utiliser vous devrez inclure l'entête "Shlwapi.h"
 et rajouter la librairie Shlwapi.lib à l'assemblage des liens (link) .
 
 | 
|  |  | auteur : nico-pyright(c) |  | En parcourant la chaîne renvoyée par GetLogicalDriveStrings() qui contient la liste des lecteurs
On peut observer aussi comment calculer l'espace disque disponible avec l'API GetDiskFreeSpaceEx().
 | 
voidexploreDisque(){charbuff[264];GetLogicalDriveStrings(264,buff);char*c;
    c=buff;while(*c!=NULL){printf("%s",c);chardisqueReseau[20]=" --> disque réseau";
        UINT type=GetDriveType(c);switch(type){caseDRIVE_UNKNOWN:printf(" --> type inconnu");break;caseDRIVE_REMOVABLE:printf(" --> disque extractible");break;caseDRIVE_FIXED:printf(" --> disque dur");break;caseDRIVE_REMOTE:CharToOem(disqueReseau,disqueReseau);printf(disqueReseau);break;caseDRIVE_CDROM:printf(" --> CDROM");break;caseDRIVE_RAMDISK:printf(" --> Ram disque");break;}__int64 FreeBytesToCaller;
        __int64 TotalBytes;
        __int64 FreeBytes;if(GetDiskFreeSpaceEx(c,
            (PULARGE_INTEGER)&FreeBytesToCaller,
            (PULARGE_INTEGER)&TotalBytes,
            (PULARGE_INTEGER)&FreeBytes)){printf(" ; %d Ko",FreeBytesToCaller/1024);}printf("\n");while(*c!=NULL)
            c++;
        c++;}}
 | 
 | 
|  |  | auteur : nico-pyright(c) |  | Pour manipuler un fichier en C/C++ il existe différentes méthodes.
 
 
Sous windows, on utilisera directement les API Win32 (CreateFile, ReadFile, ...) ou une surcouche comme les MFC (CFile et ses dérivées)
 
 | 
|  |  | auteur : nico-pyright(c) |  | Tant qu'à utiliser les bibliothèques MFC, il est plus intéressant de privilégier les classes CFile ou CStdioFile qui sont plus faciles à manipuler que les fonctions de l'API. On utilisera les fonctions de l'API que lorsque le projet ne doit pas utiliser les MFC. Globalement, on choisit d'utiliser CFile lorsqu'on utilise des fichiers en mode binaire et CStdioFile pour des fichiers en mode texte.
 L'API Win32 manipule les fichiers comme étant des fichiers binaires.
 
 | 
|  |  | auteur : nico-pyright(c) |  | Un fichier est une suite d'octets. Donc tout fichier est un fichier binaire en soit. On va lire une suite d'octets dans ce fichier. L'abstraction d'un fichier en mode texte, permet d'établir un séparateur de lignes dans un fichier texte. Ce séparateur va permettre de lire plutôt des lignes dans un fichier qu'une suite d'octets.
 Ce séparateur de lignes correspond à un ou plusieurs caractères suivant les plateformes.
 
 Par exemple, sur MAC, le séparateur est un simple retour chariot (0x0D en ascii), tandis que sur des OS basés sur Unix, on utilise le caractère de retour en début de ligne (0x0A en ascii).
 Par contre, sous DOS/OS2 et Windows, c'est une combinaison de ces deux caractères (à savoir 0x0D0A). Donc si on utilise un fichier en mode texte en lisant octet par octet, il faudra faire attention au séparateur suivant les OS.
 Heureusement, les fonctions du C/C++ nous permettent de manipuler les fichiers sans se soucier de la plateforme tant que nous ouvrons le fichier en mode texte.
 
 On a tendance à dire que l'utilisation d'un fichier binaire, bien que pratique dans certains cas, peut présenter des inconvénients à long terme.
 Imaginons que l'on veuille stocker les coordonnées de sa souris dans un fichier.
 On va utiliser deux entier (int) pour les stocker, soit à l'heure actuelle 2*4 = 8 octets dans le fichier.
 Mais imaginons que d'ici quelques années, les entiers ne soient plus stockés sur 4 octets mais sur 8.
 Si on recompile notre programme avec des entier sur 8 octets, la lecture d'un entier dans ce fichier ne produira pas le même résultat.
 L'inconvénient d'un fichier texte bien sur est qu'il est plus délicat de stocker n'importe quelle suite d'octet.
 
 Il faut donc bien choisir son type de fichier en fonction de ses besoins.
 
 | 
|  |  | auteur : nico-pyright(c) |  | API Win32 : on utilise SetFilePointer
 | SetFilePointer(fichier,NULL,NULL,FILE_END);
 | 
CFile et ses dérivées : on utilise Seek, SeekToBegin ou SeekToEnd  | 
|  |  | auteur : nico-pyright(c) |  | Cette pratique est souvent utilisée pour éviter les multiaccès au fichier
Api Win32
 | HANDLE hFile; 
hFile =CreateFile("test.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(hFile==INVALID_HANDLE_VALUE)returnfalse;
DWORD dwSize;
dwSize=GetFileSize (hFile,NULL);if(dwSize==INVALID_FILE_SIZE)returnfalse;char*buffer=newchar[dwSize+1];
DWORD bLu;ReadFile(hFile,buffer,dwSize,&bLu,NULL);deletebuffer;
 | 
CFile
 |    CFile f2 ("c:\\test.txt",CFile::modeRead|CFile::typeBinary );
   ULONGLONG taille=f2.GetLength();char*buffer=newchar[(int)taille+1];
   CString str;
   UINT nOctetsLu=f2.Read(buffer, (int)taille);
   str=buffer;
   f2.Close();deletebuffer;
 | 
NB : Lorsqu'on utilise des gros fichiers, new peut échouer par manque de place sur le tas. Il est recommandé d'avoir recours à une allocation dynamique. | 
char*buffer=(char*)VirtualAlloc(NULL, dwSize*sizeof(char), MEMDISPO, PAGE_READWRITE);if(!buffer){return1;}VirtualFree(buffer,0, MEM_RELEASE);
 | 
 | 
|  |  | auteur : nico-pyright(c) |  | | CStdioFile f1 ("c:\\test.txt",CFile::modeCreate|CFile::modeWrite|CFile::typeText );
f1.WriteString("premiere ligne\n");
f1.WriteString("deuxieme ligne");
f1.Close();
CStdioFile f2 ("c:\\test.txt",CFile::modeRead|CFile::typeText );
CString s1, s2;
f2.ReadString(s1); 
f2.ReadString(s2); 
f2.Close();
 | 
Nb : pour ajouter un caractère de séparation de ligne, on utilise \n (0x0A).La fonction WriteString le transforme alors en 0x0D, 0x0A. Inversement, lorsqu'on lit la paire 0x0D, 0x0A, la fonction ReadString le transforme en \n (0x0A)
 
 | 
|  |  | auteur : nico-pyright(c) |  | par exemple, lire et ecrire un tableau de 5 entiersavec les API Win32
 | intt1[5]={1,2,3,4,5};
HANDLE fichier; 
DWORD octetsEcrits;
fichier=CreateFile("test.txt", GENERIC_WRITE, FILE_SHARE_WRITE,NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL);if( fichier==INVALID_HANDLE_VALUE)returnfalse;if(!WriteFile(fichier, t1 ,sizeof(int)*5,&octetsEcrits,NULL)){}CloseHandle(fichier);
hFile=CreateFile("test.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(hFile==INVALID_HANDLE_VALUE)returnfalse;intt2[5];
DWORD octetsLu;if(!ReadFile(hFile,t2,sizeof(int)*5,&octetsLu,NULL)){}CloseHandle(fichier);
 | 
Avec CFile
 |    intt1[5]={1,2,3,4,5};
   CFile f1 ("c:\\test.txt",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary );
   f1.Write(t1,sizeof(int)*5);
   f1.Close();intt2[5];
   CFile f2 ("c:\\test.txt",CFile::modeRead|CFile::typeBinary );
   UINT nOctetsLu=f2.Read( t2,sizeof(int)*5);
   f2.Close();
 | 
 | 
|  |  | auteur : Aurelien.Regat-Barrel |  | En utilisant les IOCTL (donc devrait marcher avec les lecteurs Zip etc...). On peut aussi spécifier quel lecteur éjecter / refermer.
 | #include <windows.h>boolSendSimpleIOCTL( LPCTSTR DeviceName, DWORD IoControlCode ){HANDLE hDevice=::CreateFile(
        DeviceName,
        GENERIC_READ,0,0,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,0);if( hDevice==INVALID_HANDLE_VALUE ){returnfalse;}DWORD unused;
    BOOL res=::DeviceIoControl(
        hDevice,
        IoControlCode,NULL,0,NULL,0,&unused,NULL);::CloseHandle( hDevice );returnres==TRUE;}boolEjectDevice( LPCTSTR DeviceName ){returnSendSimpleIOCTL(
        DeviceName, 
        IOCTL_STORAGE_EJECT_MEDIA );}boolCloseDeviceDoor( LPCTSTR DeviceName ){returnSendSimpleIOCTL(
        DeviceName, 
        IOCTL_STORAGE_LOAD_MEDIA );}intmain(){EjectDevice("\\\\.\\D:");CloseDeviceDoor("\\\\.\\CdRom0");}
 | 
 | 
|  |  | auteur : nico-pyright(c) |  | En utilisant les commandes MCI, exemple : 
pour éjecter le CD | 
#include <mmsystem.h>boolejectCD(void){boolejected=false;if(mciSendString("open cdaudio",NULL,0,NULL)==0){charbuffer[10];if(mciSendString("capability cdaudio can eject",buffer,sizeof(buffer),NULL)==0){if(stricmp(buffer,"true")==0){ejected=mciSendString("set cdaudio door open",NULL,0,NULL)==0;}}mciSendString("close cdaudio",NULL,0,NULL);}return(ejected);}
 | 
Pour fermer le lecteur : | 
boolcloseCD(void){boolclosed=false;if(mciSendString("open cdaudio",NULL,0,NULL)==0){charbuffer[10];if(mciSendString("capability cdaudio can eject",buffer,sizeof(buffer),NULL)==0){if(stricmp(buffer,"true")==0){closed=mciSendString("Set cdaudio door closed wait",NULL,0,NULL)==0;}}mciSendString("close cdaudio",NULL,0,NULL);}return(closed);}
 | 
NB : Ces fonctions nécessitent le link de la librairie Winmm.lib
 | #pragma comment (lib, "Winmm.lib")
 | 
 | 
|  |  | auteur : nico-pyright(c) |  | Il faut parcourir récursivement tous les fichiers à partir du répertoire racine.
 Voici, une petite fonction qui fait le travail
 | #include <windows.h>voidmycalculTaille(char*rep, __int64*taille){WIN32_FIND_DATA FindFileData;charpath[MAX_PATH];strcpy(path,rep);strcat(path,"\\*.*");
    HANDLE hFind=FindFirstFile(path,&FindFileData);if(hFind==INVALID_HANDLE_VALUE)return;if(strcmp(FindFileData.cFileName,".")!=0&&strcmp(FindFileData.cFileName,"..")!=0){strcpy(path,rep);strcat(path,"\\");strcat(path,FindFileData.cFileName);mycalculTaille(path, taille);}DWORD a=0;while(a!=ERROR_NO_MORE_FILES){if(!FindNextFile(hFind,&FindFileData))
            a=GetLastError();else{if(strcmp(FindFileData.cFileName,".")!=0&&strcmp(FindFileData.cFileName,"..")!=0){strcpy(path,rep);strcat(path,"\\");strcat(path,FindFileData.cFileName);if(FindFileData.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY)mycalculTaille(path, taille);else{*taille=*taille+(FindFileData.nFileSizeHigh*((long)MAXDWORD+1)+FindFileData.nFileSizeLow);}}}}FindClose(hFind);}__int64calculTaille(char*rep){__int64 taille;
   taille=0;mycalculTaille(rep,&taille);returntaille;}intWINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine,intiCmdShow){__int64 taille=calculTaille("d:\\truc");return1;}
 | 
 | 
 
 
						Consultez les autres F.A.Q.
					 
  
 |  |