程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c++文件系統概述(一)

c++文件系統概述(一)

編輯:關於C語言
 

一、概述

1.基本概念 (1)磁盤分區(Partitions) (2)卷(Volumes):是存儲設備上有文件系統管理區域的一塊區域,是在邏輯上的相互隔離的存儲單元。 2.文件系統的主要API (1)磁盤和驅動器管理類API (2)文件和目錄管理 (3)高級文件系統操作 二、磁盤和驅動器管理   1.遍歷卷並獲取屬性 獲取一個主機上的所有驅動器列表有兩種方法,一種是使用GetLogicalDrives或GetLogicalDrivesStrings;另一種是使用FindNextVolume組合。 (1)GetLogicalDrives 功能:獲取主機中所有的邏輯驅動器,以Bitmap的形式返回 函數原型:DWORD GetLogicalDrives(void); 返回值:GetLogicalDrives返回一個DWORD類型的值,第一位表示所對應的驅動器是否存在。 (2)GetLogicalDrivesStrings 功能:獲取主機中所有的邏輯驅動器,以驅動器根路徑字符串返回。 函數原型:DWORD  GetLogicalDrivesStrings(                                     DWORD  nBufferLength,                                     LPTSTR lpBuffer      //函數的返回結果存在lpBuffer所指向的內存區域中                                  ); 參數: nBufferLength:參數lpBuffer所指向的內存空間的大小,以字節為單位。 lpBuffer:指向存儲返回結果字符串的內存空間。 返回值: 函數的返回值指明函數調用是否成功,如果成功則為緩存區中返回結果的總長度。如果返回值大於nBufferLength,說明給定的緩沖區大小不夠,返回值是實際需要的大小。如果返回0,則說明函數運行出錯。 (3)FindFirstVolume 功能:查找主機中的第一個驅動器,返回驅動器設備名 函數原型: HANDLE FindFirstVolume( LPTSTR lpszVolumName, DWORD cchBufferLength ); 參數: lpszVolumName:指向驅動器名的內存緩沖區。 cchBufferLength:參數lpszVolumName所指向的緩沖區大小,以字節為單位。 返回值: 驅動器查找句柄,可作為FindNextVolume和FindVolumeClose的參數,如果執行失敗,返回NULL。 (4)FindNextVolume 功能:查找主機後繼的邏輯驅動器 BOOL FindNextVolume(                                         HANDLE hFindVolume,                                         LPTSTR lpszVolumeName,                                         DWORD cchBufferLength                                       ); 參數: hFileVolume:FindFirstVolume所返回的驅動器查找句柄。 lpszVolumeName:指向保存驅動器的內存緩沖區。 cchBufferLength:參數lpszVolumeName所指向的緩沖區大小,以字節為單位。 返回值: 返回BOOL表示是否成功,如果失敗說明已經查找所有的邏輯驅動器。 (5)FindVolumeClose 功能:關閉FindFirstVolume打開的卷遍歷句柄 函數原型: BOOL WINAPI FindVolumeClose( HANDLE hFileVolume ); 參數: hFindVolume:要關閉的驅動器查找句柄。 返回值: 返回BOOL值表示是否成功關閉句柄。 (6)GetDriveType 功能:獲取驅動器類型 函數原型: UINT GetDriveType( LPCTSTR lpRootPathName ); 參數: lpRootPathName:驅動器根路徑,如“C:\”。 返回值: 驅動器類型,如DRIVE_FIXED表示硬盤,DRIVE_CDROM表示光盤等。 (7)GetVolumeInformation 功能:獲取邏輯驅動器信息 函數原型: BOOL GetVolumeInfomation( LPCTSTR lpRootPathName, LPTSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPTSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize ); 參數: lpRootPathName:輸入參數,指向所要獲取屬性的驅動器的根路徑字符串。 lpvolumeNameBuffer:輸出參數,返回驅動器名。 nVolumeNameSize:輸入參數,lpVolumeNameBuffer的內存緩沖區的大小。 lpVolumeSerialNumber:輸出參數,存儲驅動器序列號。 lpMaximumComponentLength:輸出參數,返回文件系統所支持的文件組成部分的最大值。 lpFileSystemFlags:輸出參數,屬性可以用來判斷多種驅動器屬性值,如FILE_VOLUME_QUOTAS表示支持磁盤配額,       FILE_SUPPORTS_ENCRYPTION表示文件系統是否是支持EFS加密等。 lpFileSystemNameBuffer:輸出參數,表示文件類型,如“NTFS”,“CDFS”等。 nFileSystemNameSize:lpFileSystemNameBuffer的緩沖區的大小。 返回值: 返回BOOL值,表示信息獲取是否成功。 2.使用GetLogicalDriveStrings獲取驅動器的根路徑 /* ********************************************************** * GetVolumeInfo.c 遍歷驅動器獲取驅動器屬性 *  *********************************************************/ /*頭文件*/ #include <Windows.h> #include <stdlib.h> #include <stdio.h>
/*預定義*/ #define  BUFSIZE 1024
/*函數申明*/ BOOL GetDirverInfo(LPSTR szDrive);   /* ********************************************************** *  應用程序主函數,遍歷驅動器並調用GetDirverInfo,獲取驅動器屬性 * **********************************************************/ void main(void) { CHAR szLogicalDriveStrings[BUFSIZE]; PCHAR szDrive;   ZeroMemory(szLogicalDriveStrings,BUFSIZE); //獲取邏輯驅動器卷標名 GetLogicalDriveStrings(BUFSIZE - 1,szLogicalDriveStrings); szDrive = (PCHAR)szLogicalDriveStrings; //循環處理每個卷 do { if (!GetDirverInfo(szDrive)) { printf("\n Get Volume Infomation Error :%d",GetLastError()); } szDrive += (lstrlen(szDrive) + 1); } while (* szDrive != '\x00'); } 3.使用FindFirstVolume系列函數遍歷驅動器,獲取驅動器信息 /* ***************************************************************** *  Enumeratevolume.c    遍歷驅動器並獲取驅動器屬性 * ****************************************************************/ #define  _WIN32_WINNT 0x0501 /*頭文件*/ #include <Windows.h> #include <stdio.h> /*預定義*/ #define BUFSIZE MAX_PATH /*函數申明*/ BOOL GetDirverInfo(LPSTR szDrive);
/* ****************************************************************** * 功能 :應用程序主函數,遍歷驅動器並調用 * ******************************************************************/ int main(void) { TCHAR buf[BUFSIZE];       //卷標信息 HANDLE hVol;                   //卷遍歷句柄 BOOL bFlag;   hVol = FindFirstVolume(buf, BUFSIZE);   if (hVol == INVALID_HANDLE_VALUE) { printf(TEXT("No Volumes Found!\n")); return (-1); }   GetDirverInfo(buf); while (FindNextVolume( hVol, buf, BUFSIZE )) { GetDirverInfo(buf); } bFlag = FindVolumeClose(hVol); return (bFlag); } 4.調用GetVolumeInformation API函數,獲取驅動器相關屬性 /* *************************************************** * BOOL GetDirverInfo(LPSTR szDrive) * 功能:獲取驅動器屬性 * 參數:LPSTR szDrive             指明要獲取屬性的驅動器的根路徑,如C:\ * 返回值BOOL:表示是否成功 * **************************************************/ BOOL GetDirverInfo(LPSTR szDrive) { UINT  uDriveType; DWORD dwVolumeSerialNumer; DWORD dwMaximumComponentLength; DWORD dwFileSystemFlags; CHAR  szFileSystemNameBuffer[BUFSIZE]; CHAR szDirveName[MAX_PATH]; printf("\n %s \n",szDrive); uDriveType = GetDriveType(szDrive); switch(uDriveType) { case DRIVE_UNKNOWN: printf("The drive type cannot be determined."); break; case DRIVE_NO_ROOT_DIR: printf("The root path is invalid ,for example ,no volume is mounted at the path."); break; case DRIVE_REMOVABLE: printf("The drive is a type that has removeble media ,for example ,a floppy drive or removable hard disk."); break; case DRIVE_FIXED: printf("The drive is a type that cannot be removed ,for example ,a fixed hard drive."); break; case DRIVE_REMOTE: printf("The drive is a remote (network) drive."); break; case DRIVE_CDROM: printf("The drive is a CD_ROM drive."); break; case DRIVE_RAMDISK: printf("The drive is a RAM disk."); break; default: break; } if (!GetVolumeInformation( szDrive, szDirveName, MAX_PATH, &dwVolumeSerialNumer, &dwMaximumComponentLength, &dwFileSystemFlags, szFileSystemNameBuffer, BUFSIZE)) { return FALSE; } if (0 != lstrlen(szDirveName)) { printf("\n Drive Name is %s\n",szDirveName); } printf("\n Volume Serial Number is %u  ",dwVolumeSerialNumer); printf("\n Maxinum component Length is %u",dwMaximumComponentLength); printf("\nSystem type is %s \n",szFileSystemNameBuffer); if (dwFileSystemFlags & FILE_SUPPORTS_REPARSE_POINTS) { printf("The file system does not support volume volume mount points .\n"); } if (dwFileSystemFlags & FILE_VOLUME_QUOTAS) { printf("The file system supports disk quotas.\n"); } if (dwFileSystemFlags & FILE_CASE_SENSITIVE_SEARCH) { printf("The file system support case-sensitive file name.\n"); } printf("……\n"); return ture; } 三、驅動器掛載點 掛載點實際上是操作系統揮著用戶設置的,用來進入一個邏輯驅動器或者卷的入口。在設置了卷的掛載點後,用戶或者應用程序可以使用卷標或者指定的掛載點進入卷。 1.關鍵API (1)FindFirstVolumeMountPoint 功能:獲取指定卷的第一個掛載點 函數原型: HANDLE FindFirstVolumeMountPoint(     LPTSTR lpszRootPathName,     LPTSTR lpszVolumeMountPoint,                DWORD cchBufferLength ); 參數: lpszRootPathName,輸入參數,指定要查找的卷名,必須以反斜槓結尾 lpszVolumeMountPoint,輸出參數,找到的第一個掛載點 cchBufferLength,輸出參數,用來存儲輸出掛載點的緩存大小 返回值: 返回HANDLE值,為一個查找句柄,FindNextVolumeMountPoint用該句柄查找下一個掛載點。錯誤時值為INVALID_HANDLE_VALUE,並且可以使用GetLastError()函數獲取詳細的錯誤信息。 (2)FindNextVolumeMountPoint 功能:查找指定卷的後繼掛載點 函數原型: BOOL FindNextVolumeMountPoint(          HANDLE hFindVolumeMountPoint,          LPTSTR lpszVolumeMountPoint,          DWORD cchBufferLength     ); 參數: hFindVolumeMountPoint:輸入參數,查找句柄,由hFindFirstVolumeMountPoint獲取。 lpszFindVolumeMountPoint:輸出參數,找到後繼掛在點。 cchBufferLength:輸入參數,用來存儲輸出掛載點的緩存大小。 返回值: 返回BOOL值,表示查找是否成功,失敗並且GetLastError函數返回ERROR_NO_MORE_FILES代碼時表示已經查找完所有的掛載點。   (3)FindVolumeMountPointClose 功能:關閉FindFirstVolumeMountPoint打開的卷句柄 函數原型: BOOL FindVolumeMountPointClose(         HANDLE hFindVolumeMountPoint, ); 參數: hFindVolumeMountPoint:要關閉的掛載點的查找句柄。 返回值: 返回BOOL值,是否成功關閉句柄。、 (4)GetVolumeNameForVolumeMountPoint 功能:查找指定卷的後繼掛載點 函數原型: GetVolumeNameForVolumeMountPoint( LPTSTR lpszVolumeMountPoint, LPTSTR lpszVolumeName, DWORD cchBufferLength ) 參數: lpszVolumeMountPoint:輸入參數,指定需要查找掛載點或者根目錄,以反斜槓結束。 lpszFindVolumeName:輸出參數,掛載點對應的卷設備名,形式為"\\?\Volume{GUID}\"。 cchBufferLength:輸入參數,用來存儲輸出設備名的緩存大小。 返回值: 返回BOOL值,表示函數是否成功,同樣可以用GetLasterror()函數獲取更詳細的錯誤信息。  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved