Win32_文件系统

一 Windows卷(Volumn)

  1 卷的获取
    GetLogicalDrives 返回一个DWORD值,这个值的每个位代表是否存在相应的卷
    GetLogicalDriveStrings 获取一个所有卷的盘符的字符串

DWORD GetLogicalDriveStrings(
                  DWORD nBufferLength,//BUFF的大小
                  LPTSTR lpBuffer //BUFF的指针
                 );

   BUFF存放数据格式:A:\ + 0 + C:\ + 0 ...+0  
    Windows 的盘符从 A- Z

  2 卷的类型

UINT GetDriveType(
            LPCTSTR lpRootPathName //盘符
           );

    返回盘的类型

  3 卷的信息

BOOL GetVolumeInformation(
    LPCTSTR lpRootPathName, //盘符
    LPTSTR lpVolumeNameBuffer, //存放卷标的BUFF
    DWORD nVolumeNameSize, //存放卷标BUFF的长度
    LPDWORD lpVolumeSerialNumber,//卷的序列号
    LPDWORD lpMaximumComponentLength,//路径最大字符串的长度
    LPDWORD lpFileSystemFlags,//文件系统的标识
    LPTSTR lpFileSystemNameBuffer,//存放文件系统的名称BUFF
    DWORD nFileSystemNameSize //文件系统BUFF的长度
    );

  4 卷的大小
   4.1 获取指定卷的大小
    GetDiskFreeSpace - 2G 以下使用

BOOL GetDiskFreeSpace(
  LPCTSTR lpRootPathName,//盘符
  LPDWORD lpSectorsPerCluster,//每个簇包含的扇区
  LPDWORD lpBytesPerSector,//每个扇区的字节数
  LPDWORD lpNumberOfFreeClusters,//空余簇的数量
  LPDWORD lpTotalNumberOfClusters//总共的簇的数量
  );

    GetDiskFreeSpaceEx - 不限制

BOOL GetDiskFreeSpaceEx(
  LPCTSTR lpDirectoryName,//盘符
  PULARGE_INTEGER lpFreeBytesAvailableToCaller,//可用的空余字节数
  PULARGE_INTEGER lpTotalNumberOfBytes,//全部的字节数
  PULARGE_INTEGER lpTotalNumberOfFreeBytes//空余的字节数
  );

     4.2 簇
      文件系统是通过簇管理硬盘,每个簇是由连续的几个扇区组成,如:1/2/4/8/16
        扇区构成一个簇
      常见的文件系统和簇的大小
        FAT32 文件系统 1 个簇 = 8K字节
        NTFS  文件系统 1 个簇 = 4K字节
      簇是文件系统存放文件数据的最小单位,即使文件只有一个字节也需要占用一个簇
  5 修改卷的名称

BOOL SetVolumeLabel(
  LPCTSTR lpRootPathName,//盘符
  LPCTSTR lpVolumeName //新名称
  );
View Code
 1 #include "stdafx.h"
 2 #include "windows.h"
 3 
 4 void ShowSpace(LPSTR pszDrive)
 5 {
 6     //获取盘的大小
 7     DWORD nSecPerCluster    = 0;
 8     DWORD nBytesPerSector    = 0;
 9     DWORD nFreeClusters        = 0;
10     DWORD nTotalclusters    = 0;
11     GetDiskFreeSpace(pszDrive,&nSecPerCluster,&nBytesPerSector,
12         &nFreeClusters,&nTotalclusters);
13     printf("\t SecCluster =  %d BytesSector = %d FreeClusters = %d TotalClusters = %d\n",
14         nSecPerCluster,nBytesPerSector,nFreeClusters,nTotalclusters);
15     //获取大小
16     UINT64 nFreeAvailable    = 0;
17     UINT64 nTotalBytes        = 0;
18     UINT64 nFreeBytes        = 0;
19     GetDiskFreeSpaceEx(pszDrive,(PULARGE_INTEGER)&nFreeAvailable,
20         (PULARGE_INTEGER)&nTotalBytes,(PULARGE_INTEGER)&nFreeBytes);
21     printf("FreeAvailable = %I64d Total = %I64d Free = %I64d\n",
22         nFreeAvailable >> 20,nTotalBytes >> 20,nFreeBytes >> 20);
23 
24 }
25 void ShowVolumneInfo(LPSTR pszDrive)
26 {
27     CHAR szVolumneName[260] = {0};
28     DWORD nVolumneSerial    = 0;
29     DWORD nMaxLength        = 0;
30     DWORD nFileSystem        = 0;
31     CHAR szFileSystem[260]    = {0};
32     //获取卷信息
33     GetVolumeInformation(pszDrive,szVolumneName,260,&nVolumneSerial,
34         &nMaxLength,&nFileSystem,szFileSystem,260);
35     printf("\tName = %s Serial = %08X Length = %d FileSystem = %08X %s\n",
36         szVolumneName,nVolumneSerial,nMaxLength,nFileSystem,szFileSystem);
37 }
38 void ShowType(LPSTR pszDrive)
39 {
40     //获取盘的类型
41     UINT nType = GetDriveType(pszDrive);
42     switch(nType)
43     {
44     case DRIVE_FIXED:
45         printf("硬盘\n");
46         break;
47     case DRIVE_CDROM:
48         printf("光驱\n");
49         break;
50     }
51 }
52 void ShowVolumn()
53 {
54     //获取系统卷的位的标识
55     DWORD nDrives = GetLogicalDrives();
56     printf("Drives:%08X\n",nDrives);
57     //获取系统卷的所有盘符
58     CHAR szText[260] = {0};
59     GetLogicalDriveStrings(260,szText);
60     //输出盘符
61     CHAR *pszTmp = szText;
62     while(0 != pszTmp[0])
63     {
64         printf("Drives:%s\n",pszTmp);
65         ShowSpace(pszTmp);
66         ShowType(pszTmp);
67         ShowVolumneInfo(pszTmp);
68         pszTmp = strlen(pszTmp) + 1 + pszTmp;
69     }
70     
71 }
72 
73 int main(int argc, char* argv[])
74 {
75     //SetVolumeLabel("C:\\","SYSTEM"); //修改卷名称
76     ShowVolumn();
77     return 0;
78 }

 二 目录

  1 系统和当前目录
    1.1 获取Windows目录(Windows)

UINT GetWindowsDirectory(
  LPTSTR lpBuffer,//BUFF的地址
  UINT uSize);//BUFF的长度

    例如:C:\Windows
    1.2 获取 System 目录(System32)

UINT GetSystemDirectory(
  LPTSTR lpBuffer, //BUFF的地址
  UINT uSize); //BUFF的长度

    例如:C:\Windows\System32
    1.3 获取临时文件的路径

DWORD GetTempPath(
  DWORD nBufferLength,//BUFF的长度
  LPTSTR lpBuffer);//BUFF的地址

    1.4 当前目录
      应用程序当前正在使用的默认目录
    获取

DWORD GetCurrentDirectory(
  DWORD nBufferLength,//BUFF的长度
  LPTSTR lpBuffer);//BUFF的地址

    设置

BOOL SetCurrentDirectory(LPCTSTR lpPathName);//新的当前目录

  2 目录的使用
    2.1 创建目录

BOOL CreateDirectory(
  LPCTSTR lpPathName,//创建的目录的路径
  LPSECURITY_ATTRIBUTES lpSecurityAttributes);//安全属性

    2.2 删除目录

BOOL RemoveDirectory(LPCTSTR lpPathName);//删除的目录的路径

      要删除目录中不能包含其它文件,只能删除空目录
    2.3 修改目录名称

BOOL MoveFile(
  LPCTSTR lpExistingFileName,//旧名称
  LPCTSTR lpNewFileName);//新名称
View Code
 1 #include "stdafx.h"
 2 #include "windows.h"
 3 
 4 
 5 void UseDirectory()
 6 {
 7     
 8     CreateDirectory("C:\\test",NULL);//创建目录
 9 
10     RemoveDirectory("C:\\test2");//删除目录,目录必须为空
11     
12     MoveFile("C:\\test","C:\\test3");//修改目录名称
13 }
14 void ShowDirectory()
15 {
16     //获取Windows目录
17     CHAR szWindow[MAX_PATH] = {0};
18     GetWindowsDirectory(szWindow,MAX_PATH);
19     printf("WindowsDirectory: %s\n",szWindow);
20     //获取System目录
21     CHAR szSystem[MAX_PATH] = {0};
22     GetSystemDirectory(szSystem,MAX_PATH);
23     printf("System Directory:%s\n",szSystem);
24     //获取临时文件的路径
25     CHAR szTemp[MAX_PATH] = {0};
26     GetTempPath(MAX_PATH,szTemp);
27     printf("Temp Path: %s\n",szTemp);
28     //获取程序的当前目录
29     CHAR szCurrent[MAX_PATH] = {0};
30     GetCurrentDirectory(MAX_PATH,szCurrent);
31     printf("Current Directory:%s\n",szCurrent);
32     //设置当前目录
33     SetCurrentDirectory("C:\\");
34     GetCurrentDirectory(MAX_PATH,szCurrent);
35     printf("Current Directory:%s\n",szCurrent);
36 }
37 
38 int main(int argc, char* argv[])
39 {
40     ShowDirectory();
41     return 0;
42 }

三 文件
  1 文件的创建或打开

HANDLE CreateFile(
  LPCTSTR lpFileName,//文件路径和名称
  DWORD dwDesiredAccess,//访问方式
  DWORD dwShareMode,//共享模式
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,//安全属性
  DWORD dwCreationDisposition,//创建方式
  DWORD dwFlagsAndAttributes,//文件属性
  HANDLE hTemplateFile//拷贝的文件句柄
);

  2 文件的关闭

BOOL CloseHandle(HANDLE hObject);//要关闭的句柄

   3 文件的数据写入

BOOL WriteFile(
  HANDLE hFile,//文件句柄
  LPCVOID lpBuffer,//写入数据的BUFF的地址
  DWORD nNumberOfBytesToWrite,//写入数据的BUFF的长度
  LPDWORD lpNumberOfBytesWritten,//返回被写入数据的长度
  LPOVERLAPPED lpOVerlapped);//默认NULL

  4 文件的数据读取

BOOL ReadFile(
  HANDLE hFile,//文件句柄
  LPVOID lpBuffer,//读入数据的BUFF的地址
  DWORD nNumberOfBytesToRead,//读入数据的BUFF的长度
  LPDWORD lpNumberOfBytesRead,//返回被读入数据的长度
  LPOVERLAPPED lpOverlapped);//默认NULL

  5 获取文件长度

DWORD GetFileSize(
  HANDLE hFile,//文件的句柄
  LPDWORD lpFileSizeHigh);//高32位

  返回值是低32位,文件的长度64位 = (低32位,高32位)
  6 设置文件指针

DWORD SetFilePointer(
  HANDLE hFile,//文件句柄
  LONG lDistanceToMove,//偏移量,低32位
  PLONG lpDistanceToMoveHigh,//偏移量,高32位
  DWORD dwMoveMethod//相对位置
  );

  返回值是返回偏移最的低32
  7 拷贝文件

BOOL CopyFile(
  LPCTSTR lpExistingFileName,//
  LPCTSTR lpNewFileName,//目的
  BOOL bFailIfExists);//是否覆盖目的同名文件,FALSE为覆盖

  8 删除文件

BOOL DeleteFile(LPCTSTR lpFileName);//要删除的文件

  9 文件的属性
    9.1 GetFileAttributes

DWORD GetFileAttributes(LPCTSTR lpFileName);//文件名

  返回值是获取到的文件的属性标示
    9.2 GetFileAttributesEx

BOOL GetFileAttributesEx(
  GET_FILEEX_INFO_LEVELS fInfoLevelId,//获取文件属性信息级别
  LPVOID lpFileInformation);//对应级别的数据结构的地址

    9.3 设置文件属性

BOOL SetFileAttributes(
  LPCTSTR lpFileName,//文件名
  DWORD dwFileAttributes);//属性标示
View Code
 1 #include "stdafx.h"
 2 #include "stdlib.h"
 3 #include "windows.h"
 4 
 5 void Create()
 6 {
 7     //创建文件
 8     HANDLE hFile = CreateFile("C:\\file.txt",GENERIC_READ | GENERIC_WRITE,
 9         0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
10     //关闭文件
11     CloseHandle(hFile);
12 }
13 
14 void Write()
15 {
16     //打开文件
17     HANDLE hFile = CreateFile("C:\\file.txt",GENERIC_WRITE,0,NULL,
18         OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
19     //写入数据
20     CHAR szBuff[] = "Hello File";
21     DWORD nWritten = 0;
22     WriteFile(hFile,szBuff,strlen(szBuff),&nWritten,NULL);
23     //关闭文件
24     CloseHandle(hFile);
25 }
26 void Read()
27 {
28     //打开文件
29     HANDLE hFile = CreateFile("C:\\file.txt",GENERIC_READ,0,NULL,
30         OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
31 
32     //获取文件长度
33     DWORD nHigh    = 0;
34     DWORD nLow    = GetFileSize(hFile,&nHigh);
35     //分配空间
36     LPSTR pszBuf = (LPSTR) malloc(nLow + 1);
37     memset(pszBuf,0,nLow + 1);
38     //设置当前读取位置
39     SetFilePointer(hFile,1,NULL,FILE_BEGIN);
40     //读取数据
41     DWORD nRead = 0;
42     ReadFile(hFile,pszBuf,nLow + 1,&nRead,NULL);
43     
44     printf("%s\n",pszBuf);
45     free(pszBuf);
46     //关闭文件
47     CloseHandle(hFile);
48 }
49 
50 void Operate()
51 {
52     // 拷贝文件
53     CopyFile("C:\\file.txt","C:\\file1.txt",FALSE);
54     //删除文件
55     DeleteFile("C:\\file.txt");
56 }
57 
58 /*********************************************
59 * 函  数:PrintFileTime()
60 * 功  能:把文件时间转换为系统时间
61 **********************************************/
62 
63 void PrintFileTime(LPSTR pszName,LPFILETIME pFileItem)
64 {
65     //将文件时间转换为本时区的时间
66     FileTimeToLocalFileTime(pFileItem,pFileItem);
67     //将文件时间转换为系统时间
68     SYSTEMTIME systime = {0};
69     FileTimeToSystemTime(pFileItem,&systime);
70     printf("%s:%d-%d-%d %d:%d:%d\n",pszName,systime.wYear,
71         systime.wMonth,systime.wDay,systime.wHour,
72         systime.wMinute,systime.wSecond);
73 }
74 
75 void Attri()
76 {
77     //获取文件属性
78     DWORD nAttri = GetFileAttributes("C:\\file1.txt");
79     printf("nAttri = %08X\n",nAttri);
80     //获取文件的属性和信息
81     WIN32_FILE_ATTRIBUTE_DATA data = {0};
82     GetFileAttributesEx("C:\\file1.txt",GetFileExInfoStandard,&data);
83     printf("Attri = %d\n",data.dwFileAttributes);
84     printf("SizeHigh = %d\n",data.nFileSizeHigh);
85     printf("SizeLow  = %d\n",data.nFileSizeLow);
86 
87     PrintFileTime("CreationTime",&data.ftCreationTime);
88     PrintFileTime("LastAccessTime",&data.ftCreationTime);
89     PrintFileTime("LastWriteTime",&data.ftLastWriteTime);
90 }
91 int main(int argc, char* argv[])
92 {
93     Create();
94     Write();
95     Read();
96     Operate();
97     Attri();
98     return 0;
99 }

 四 文件的查找

  1 查找文件

BOOL FindFirstFile(
  LPCTSTR lpFileName,//查找的路径
  LPWIN32_FIND_DATA lpFindFileData)//返回查找信息

    返回值 - 查找句柄
  2 获取查找到的结果

BOOL FindNextFile(
  HANDLE hFindFile,//查找句柄
  LPWIN32_FIND_DATA lpFindFileData);//返回查找信息

    返回值 - 成功:TRUE
  3 关闭查找

BOOL FindClose(HANDLE hFindFile);//查找句柄

  4 关于查找结果排序,需要自己增加排序功能

View Code
 1 #include "stdafx.h"
 2 #include "windows.h"
 3 
 4 void Find( LPSTR pszPath, LPSTR pszType )
 5 {    
 6     CHAR szFind[MAX_PATH] = { 0 };
 7     sprintf( szFind, "%s%s", pszPath, pszType );
 8     //开始查找
 9     WIN32_FIND_DATA find = { 0 };
10     HANDLE hFind = FindFirstFile( 
11         szFind, &find );
12     //显示查找结果
13     BOOL bRet = TRUE;
14     while( TRUE == bRet )
15     {
16         if( find.dwFileAttributes &
17             FILE_ATTRIBUTE_DIRECTORY )
18         {
19             printf( "+[%s]\n", find.cFileName );
20             if( find.cFileName[0] != '.' )
21             {   //构造下一层目录的路径
22                 CHAR szNextPath[MAX_PATH] = { 0 };
23                 sprintf( szNextPath, 
24                     "%s%s\\", pszPath, find.cFileName );
25                 //搜索下一层目录
26                 Find( szNextPath, pszType );
27             }
28         }
29         else
30         {
31             //printf( "-%s\n", find.cFileName );
32         }
33 
34         bRet = FindNextFile( hFind, &find );
35     }
36     //关闭
37     FindClose( hFind );
38 }
39 
40 int main(int argc, char* argv[])
41 {
42     Find( "C:\\windows\\", "*.*" );
43     return 0;
44 }

 

posted @ 2012-10-17 11:20  吟唱黑暗  阅读(264)  评论(0编辑  收藏  举报