Windows系统编程---第5章.ppt_第1页
Windows系统编程---第5章.ppt_第2页
Windows系统编程---第5章.ppt_第3页
Windows系统编程---第5章.ppt_第4页
Windows系统编程---第5章.ppt_第5页
已阅读5页,还剩108页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Windows系统编程实用教程 授课教师 职务 第5章文件系统编程 课程描述文件系统是操作系统的重要组成部分 它用于明确磁盘或分区上文件的组织形式和保存方法 在应用程序中 文件是保存数据的重要途径之一 经常需要创建文件保存数据 或从文件中读取数据 为了更方便地管理文件 有时还要创建目录 本章将介绍Windows文件系统编程的方法 本章知识点 5 1磁盘驱动器编程5 2目录编程5 3文件编程 5 1磁盘驱动器编程 5 1 1获取当前系统中的逻辑磁盘驱动器5 1 2获取磁盘驱动器的信息 5 1 1获取当前系统中的逻辑磁盘驱动器 GetLogicalDriveStrings 函数用于获取当前系统中的逻辑磁盘驱动器 函数原型如下 DWORDWINAPIGetLogicalDriveStrings inDWORDnBufferLength outLPTSTRlpBuffer 参数说明如下 nBufferLength 参数lpBuffer所指向的缓冲区的大小 lpBuffer 用于保存返回的逻辑磁盘驱动器列表 lpBuffer指向一系列以null结束的字符串 每个字符串表示一个磁盘驱动器对应的盘符根目录 格式如下 C nullD null X null 例5 1 设计一个选择逻辑磁盘驱动器的对话框 创建一个基于对话框的MFC项目SelectDiskDriver 默认创建的对话框的ID是IDD SELECTDISKDRIVER DIALOG 对应的类为CSelectDiskDriverDlg 对话框IDD SELECTDISKDRIVER DIALOG包含一个ComboBox控件IDC COMBO DRIVE 对话框的设计布局如图5 1所示 CSelectDiskDriverDlg OnInitDialog 函数 TODO 在此添加额外的初始化代码 第1次调用GetLogicalDriveStrings 获取返回缓冲区的大小size talldrive GetLogicalDriveStrings 0 NULL TCHAR driverstr driverstr new TCHAR alldrive sizeof T printf AllDrivesizeis d r n alldrive 第次调用GetLogicalDriveStrings 获取实际的逻辑磁盘驱动器字符串size ttwosize GetLogicalDriveStrings alldrive driverstr CStringDriveLetter 由于driverstr内保存的数据是A nullB nullC null 每4个字符截取一个逻辑磁盘驱动器字符串 for inti 0 i alldrive 4 i DriveLetter driverstr i 4 m drive InsertString i DriveLetter GetBuffer m drive SetCurSel 0 例5 1 的运行界面 单击 确定 按钮对应的代码 voidCSelectDiskDriverDlg OnBnClickedOk TODO 在此添加控件通知处理程序代码CStringstrDrive m drive GetWindowTextW strDrive this MessageBox strDrive GetBuffer OnOK 5 1 2获取磁盘驱动器的信息 1 获取磁盘驱动器的类型2 获取磁盘的空闲空间 1 获取磁盘驱动器的类型 GetDriveType 函数可以获取磁盘驱动器的类型 函数原型如下 UINTWINAPIGetDriveType inLPCTSTRlpRootPathName 磁盘驱动器的根路径 格式为 X GetDriveType 函数的返回值 例5 2 在例5 1的基础上增加功能 当用户选择磁盘驱动器时获取并显示其类型 首先在对话框IDD SELECTDISKDRIVER DIALOG中添加一个StaticText控件 用于先磁盘驱动器的类型 然后为其添加变量m DriveType 定义代码如下 CStringm DriveType OnCbnSelchangeComboDrive voidCSelectDiskDriverDlg OnCbnSelchangeComboDrive 获取选择的驱动器根路径CStringstrDrive m drive GetWindowTextW strDrive 获取磁盘的类型intretCode GetDriveType strDrive GetBuffer switch retCode caseDRIVE UNKNOWN m DriveType 驱动器类型 未知 break caseDRIVE NO ROOT DIR m DriveType 驱动器类型 驱动器根路径错误 break caseDRIVE REMOVABLE m DriveType 驱动器类型 可移动磁盘驱动器 break OnCbnSelchangeComboDrive caseDRIVE FIXED m DriveType 驱动器类型 固定磁盘驱动器 break caseDRIVE REMOTE m DriveType 驱动器类型 网络磁盘驱动器 break caseDRIVE CDROM m DriveType 驱动器类型 CD ROM break caseDRIVE RAMDISK m DriveType 驱动器类型 RAM break default m DriveType 驱动器类型 未知 break UpdateData FALSE 例5 2 的运行界面 2 获取磁盘的空间 调用GetDiskFreeSpaceEx 函数可以获取磁盘卷的空间信息 函数原型如下 BOOLWINAPIGetDiskFreeSpaceEx inLPCTSTRlpDirectoryName 磁盘卷的根目录字符串 outPULARGE INTEGERlpFreeBytesAvailable 返回对于函数调用者可用的空闲空间 outPULARGE INTEGERlpTotalNumberOfBytes 返回磁盘的总空间 outPULARGE INTEGERlpTotalNumberOfFreeBytes 返回磁盘的空闲空间 以上空间数据的单位均为字节 B 如果函数调用成功 则返回非0值 否则返回0 PULARGE INTEGER联合体 PULARGE INTEGER是用于存储64位整数的联合体 定义代码如下 typedefunion ULARGE INTEGER struct DWORDLowPart DWORDHighPart struct DWORDLowPart DWORDHighPart u ULONGLONGQuadPart ULARGE INTEGER ULONGLONG是无符号64位整数类型 定义代码如下 typedefunsigned int64ULONGLONG 例5 3 在例5 2的基础上增加功能 当用户选择磁盘驱动器时获取并显示其空间信息 首先在对话框IDD SELECTDISKDRIVER DIALOG中添加2个StaticText控件 用于显示磁盘驱动器的总空间 ID为IDC TOTALSPACE 对应的变量为m TotalSpace 和空闲空间 ID为IDC FREESPACE 对应的变量为m FreeSpace 变量的定义代码如下 CStringm TotalSpace CStringm FreeSpace OnCbnSelchangeComboDrive voidCSelectDiskDriverDlg OnCbnSelchangeComboDrive ULARGE INTEGERFreeAv TotalBytes FreeBytes if GetDiskFreeSpaceEx strDrive GetBuffer FormatSize 函数 返回有单位的空间大小字符串CStringCSelectDiskDriverDlg FormatSize ULONGLONGsize CStringstrSize if size 1024 if size 1024 1024 strSize Format dMB size 1024 1024 else strSize Format dKB size 1024 else strSize Format dB size returnstrSize 例5 3 的运行结果 5 2目录编程 5 2 1选择目录的对话框5 2 2创建目录5 2 2删除目录5 2 3判断目录是否存在 5 2 1选择目录的对话框 调用SHBrowseForFolder 函数可以显示一个选择目录的对话框 函数原型如下 PIDLIST ABSOLUTESHBrowseForFolder LPBROWSEINFOlpbi BROWSEINFO结构体 typedefstruct browseinfo HWNDhwndOwner PCIDLIST ABSOLUTEpidlRoot LPTSTRpszDisplayName LPCTSTRlpszTitle UINTulFlags BFFCALLBACKlpfn LPARAMlParam intiImage BROWSEINFO PBROWSEINFO LPBROWSEINFO 参数说明 hwndOwner 指定选择目录对话框的父窗口句柄 pidlRoot 用于指定浏览时对话框中显示的根目录 pszDisplayName 用户选择的目录 lpszTitle 指定选择目录对话框的标题 ulFlags 指定选择目录对话框的选项 其取值如表5 2所示 lpfn 指定一个用户定义的回调函数地址 当事件发生时 对话框会调用该函数 lParam 指定传递给回调函数的参数 iImage 用于接收选择目录的图像 指定系统图像列表的索引 参数ulFlags的取值 回调函数 intCALLBACKBrowseCallbackProc HWNDhwnd 选择目录对话框的窗口句柄UINTuMsg 指定当选择目录对话框发生次事件时 调用回调函数LPARAMlParam 参数值 根据uMsg的取值 拥有不同的含义LPARAMlpData BROWSEINFO结构体中指定的lParam参数 例5 4 演示使用SHBrowseForFolder 函数选择目录的方法 如图5 5所示 例5 4 创建一个基于对话框的MFC项目SelectFolder 主对话框对应的类是CSelectFolderDlg 在对话框中添加一个编辑框控件IDC EDIT1 用于保存和显示用户选择的目录 并为其添加变量m path 定义代码如下 CStringm path 单击 浏览 按钮对应的代码 voidCSelectFolderDlg OnBnClickedButtonBrowse UpdateData TRUE 获取当前目录 用作初始目录BROWSEINFObi ZeroMemory SHGetPathFromIDList 函数 BOOLSHGetPathFromIDList PCIDLIST ABSOLUTEpidl SHBrowseForFolder 函数的返回值LPTSTRpszPath 提取的目录字符串 如果函数执行成功 则返回TRUE 否则返回FALSE 回调函数BrowserCallbackProc 回调函数 用于指定初始目录intCALLBACKBrowserCallbackProc HWNDhWnd UINTuMsg LPARAMlParam LPARAMlpData CWndcw switch uMsg caseBFFM INITIALIZED 该消息表示对话框已经为调用作好准备 向hWnd窗口发送BFFM SETSELECTION消息 BFFM SETSELECTION消息要求对话框根据用户的指定显示选择的目录 lpData为初始目录 SendMessage hWnd BFFM SETSELECTION 1 lpData cw Attach hWnd cw CenterWindow 将窗口置中cw Detach break default break return0 5 2 2创建目录 调用CreateDirectory 函数可以创建目录 函数的原型如下 BOOLWINAPICreateDirectory inLPCTSTRlpPathName inLPSECURITY ATTRIBUTESlpSecurityAttributes 如果函数执行成功 则返回TRUE 否则返回FALSE SECURITY ATTRIBUTES结构体 typedefstruct SECURITY ATTRIBUTES DWORDnLength 结构体的大小 单位为字节LPVOIDlpSecurityDescriptor 指向用于个管理共享的安全描述符BOOLbInheritHandle 指返回的句柄是否可以被继承 SECURITY ATTRIBUTES PSECURITY ATTRIBUTES LPSECURITY ATTRIBUTES 例5 5 编写程序 在C 目录下创建MyApp目录 代码如下 include stdafx h include includeint tmain intargc TCHAR argv charszDirPath c MyApp if CreateDirectory szDirPath NULL printf Couldnotcreatenewdirectory n elseprintf createnewdirectorysuccess n system pause return0 5 2 2删除目录 调用RemoveDirectory 函数可以删除一个空目录 函数的原型如下 BOOLWINAPIRemoveDirectory inLPCTSTRlpPathName 要删除的空目录 调用进程必须对此目录有删除权限 如果函数执行成功 则返回TRUE 否则返回FALSE 例5 6 编写程序 删除目录C MyApp 代码如下 include stdafx h include includeint tmain intargc TCHAR argv charszDirPath c MyApp if RemoveDirectory szDirPath NULL printf Couldnotdeletethedirectory n elseprintf deletethedirectorysuccess n system pause return0 5 2 3判断目录是否存在 Windows并没有提供一个判断目录是否存在的API 可以使用FindFirstFile 函数来实现此功能 FindFirstFile 函数的原型如下 HANDLEWINAPIFindFirstFile inLPCTSTRlpFileName 要查找的目录或文件名 可以包含通配符 和 outLPWIN32 FIND DATAlpFindFileData 用于接收找到的目录或文件的信息的结构体 如果函数执行成功 则返回一个搜索句柄 可以在接下来的FindNextFile 函数或FindClose 函数中使用该句柄 若果执行失败 则执行INVALID HANDLE VALUE WIN32 FIND DATA结构体 typedefstruct WIN32 FIND DATA DWORDdwFileAttributes 文件的属性FILETIMEftCreationTime 文件或目录的创建时间FILETIMEftLastAccessTime 对于文件表示最近的读取 写入或执行的时间 对于目录表示创建时间FILETIMEftLastWriteTime 对于文件表示最近的写入时间 对于目录表示创建时间DWORDnFileSizeHigh 用高位DWORD数值表示的文件大小 单位为字节DWORDnFileSizeLow 用低位DWORD数值表示的文件大小 单位为字节DWORDdwReserved0 如果dwFileAttributes字段值包含FILE ATTRIBUTE REPARSE POINT属性 则此数值指定重解析标记DWORDdwReserved1 保留TCHARcFileName MAX PATH 文件名TCHARcAlternateFileName 14 文件的替代名字 通常是短文件名 即8 3格式的文件名 WIN32 FIND DATA PWIN32 FIND DATA LPWIN32 FIND DATA FindNextFile 函数 BOOLWINAPIFindNextFile inHANDLEhFindFile 之前调用FindFirstFile 或FindFirstFileEx 函数返回的搜索句柄 outLPWIN32 FIND DATAlpFindFileData 用于接收找到的目录或文件的信息的结构体 如果函数执行成功 则返回TRUE 否则返回FALSE FindClose 函数 搜索完成之后 应该调用FindClose 函数关闭搜索句柄 以释放资源 函数原型如下 BOOLWINAPIFindClose in outHANDLEhFindFile 要关闭的搜索句柄 如果函数执行成功 则返回TRUE 否则返回FALSE 例5 7 编写程序 判断目录C MyApp是否存在 代码如下 include stdafx h include includeBOOLFolderExist LPCSTRstrPath WIN32 FIND DATAwfd BOOLrValue FALSE HANDLEhFind FindFirstFile strPath 例5 7 int tmain intargc TCHAR argv if FolderExist C myApp printf C myAppisexisted n elseprintf C myAppisnotexisted n system pause return0 例5 5 SOCKETsockAccept 执行accept 函数后新建的用于实际通信的套接字structsockaddr infrom 用于接收接入地址intlen sizeof from 接入地址的长度 等待接受接入请求sockAccept accept s structsockaddr 打印接入地址 最后应该做一些清除工作 5 3文件编程 5 3 1选择文件的对话框5 3 2使用标准输入输出库读写文件5 3 3使用WindowsAPI操作文件5 3 4类CFile5 3 5类CFileFind 5 3 1选择文件的对话框 CFileDialog类定义了一个选择选择文件的对话框 打开该对话框 可以由用户选择需要的文件 调用CFileDialog DoModal 函数可以打开如图5 6所示的选择文件的对话框 CFileDialog类的构造函数 explicitCFileDialog BOOLbOpenFileDialog LPCTSTRlpszDefExt NULL LPCTSTRlpszFileName NULL DWORDdwFlags OFN HIDEREADONLY OFN OVERWRITEPROMPT LPCTSTRlpszFilter NULL CWnd pParentWnd NULL DWORDdwSize 0 BOOLbVistaStyle TRUE lpszFilter参数 pszFilter 指定用于过滤文件的文件类型字符串 lpszFilter参数的格式如下 ext ext 可以是任何字符串 用于描述文件类型 ext代表真正的文件扩展名 例如txt exe和doc等 使用 表示任意扩展名 最后的 字符表示文件类型过滤字符串的结束 例如 如果使用下面的字符串作为lpszFilter参数 则选择文件对话框中的 文件类型 下拉框中的内容如图5 7所示 文本文件 txt txt Word文件 doc doc Excel文件 xls 所有文件 CFileDialog的常用成员函数 例5 8 演示使用CFileDialog类选择文件的方法 如图5 8所示 单击 选择 按钮 voidCSelectFileDlg OnBnClickedButtonSelectfile UpdateData TRUE CFileDialogfileDlg TRUE txt m file GetBuffer OFN HIDEREADONLY 文本文件 txt txt 所有文件 if fileDlg DoModal IDOK m file fileDlg GetPathName UpdateData FALSE 5 3 2使用标准输入输出库读写文件 1 创建和打开文件2 读取文件内容3 向文件中写入数据 1 创建和打开文件 FILE fopen constchar filename 要打开的文件名constchar mode 访问文家你的模式 参数mode的取值 关闭文件 调用fclose 函数关闭文件 函数原型如下 intfclose FILE stream 要关闭的文件指针 如果函数调用成功则返回0 否则返回EOF 也可以调用 fcloseall 函数关闭所有打开的文件 函数原型如下 int fcloseall void 如果函数调用成功则返回0 否则返回EOF 2 读取文件内容 在标准输入输出库中 可以使用fread 函数读取文件的内容 函数原型如下 size tfread void buffer 用于接受文件数据的缓冲区地址size tsize 一个读取元素的大小 单位是字节size tcount 读取元素的数量FILE stream 已经打开的用于读取数据的文件句柄 函数返回实际读取元素的数量 如果小于count 则可能已到达文件尾或发生错误 1 fgetpos 函数 fgetpos 函数用于获取文件指针的位置 函数原型如下 intfgetpos FILE stream 已经打开的用于读取数据的文件句柄fpos t pos 用于获取文件指针的位置 如果函数执行成功 则返回0 否则返回一个非0值 2 fsetpos 函数 fsetpos 函数用于设置文件指针的位置 函数原型如下 intfsetpos FILE stream 已经打开的文件句柄constfpos t pos 文件指针的我位置 如果函数执行成功 则返回0 否则返回一个非0值 3 fseek 函数 fseek 函数用于移动文件指针的位置 函数原型如下 intfseek FILE stream 已经打开的文件句柄longoffset 从origin开始移动的字节数intorigin 初始位置 在参数origin中可以使用如下常量表示文件指针的初始位置 SEEK CUR 文件指针的当前位置 SEEK END 文件的结尾 SEEK SET 文件的开头 2 声明变量 rewind 函数用于将文件指针移动至开始位置 函数原型如下 voidrewind FILE stream 5 ftell 函数 ftell 函数用于设置文件指针的位置 函数原型如下 longftell FILE stream 已经打开的文件句柄 函数返回文件指针的当前位置 例5 9 在 例5 8 基础上增加读取选择文件内容的功能 并弹出消息框显示文件内容 如图5 9所示 单击 选择 按钮对应的代码 voidCfreadDlg OnBnClickedButtonSelect UpdateData TRUE CFileDialogfileDlg TRUE txt m file GetBuffer OFN HIDEREADONLY 文本文件 txt txt 所有文件 if fileDlg DoModal IDOK m file fileDlg GetPathName 读取文件内容FILE stream 文件指针char pBuf 读取数据的缓冲区 接上 if stream fopen m file r t NULL fseek stream 0 SEEK END 移动文件指针到文件尾intlength ftell stream 获取文件指针在文件中的偏移量pBuf newchar length 为缓冲区分配空间rewind stream 移动文件指针到文件头fread pBuf sizeof char length stream pBuf length 0 fclose stream MessageBox pBuf elseMessageBox 无法打开文件 UpdateData FALSE 3 向文件中写入数据 在标准输入输出库中 可以使用fwrite 函数向文件中写入数据 函数原型如下 size tfwrite constvoid buffer 勇于向文件中写入数据的缓冲区地址size tsize 一个写入元素的大小 单位是字节size tcount 写入元素的数量FILE stream 已经打开的用于读取数据的文件句柄 函数返回实际写入元素的数量 如果小于count 则可能发生错误 例5 10 向C test txt中写入 HelloWorld 代码如下 include stdafx h includeint tmain intargc TCHAR argv FILE stream charlist 30 inti numread numwritten 以些文本的方式打开文件 if stream fopen C test txt w t NULL Write25characterstostream numwritten fwrite HelloWorld sizeof char sizeof HelloWorld sizeof char stream printf 写入数据量 d n numwritten fclose stream system pause return0 5 3 3使用WindowsAPI操作文件 1 创建和打开文件2 获取文件的大小3 获取文件时间4 获取文件属性5 获取文件的详细信息6 设置文件时间7 设置文件属性8 读取文件的内容9 向文件中写入数据10 删除 复制 移动和重命名文件 1 创建和打开文件 调用CreateFile 函数可以创建和打开文件 函数原型如下 HANDLEWINAPICreateFile inLPCTSTRlpFileName 要创建或打开的对象 文件 名 inDWORDdwDesiredAccess 访问权限 只读 只写或可读写 inDWORDdwShareMode 共享模式 只读 只写 可读写或不共享 inLPSECURITY ATTRIBUTESlpSecurityAttributes 指向一个SECURITY ATTRIBUTES结构体 约定函数返回的句柄是否可以被子进程继承 如果为NULL 则不能被继承 inDWORDdwCreationDisposition 指定文件存在或不存在是采取的动作 inDWORDdwFlagsAndAttributes 指定文件的属性或标记 inHANDLEhTemplateFile 一个拥有GENERIC READ访问权限的临时文件的句柄 dwCreationDisposition字段的取值 例5 11 编写程序 在目录C 下创建myfile txt文件 代码如下 include stdafx h include includeint tmain intargc TCHAR argv HANDLEhFile hFile CreateFile C myfile txt 文件名GENERIC WRITE 以可写权限打开文件0 不共享NULL 接上 使用默认的安全属性CREATE ALWAYS 如果文件存在则覆盖FILE ATTRIBUTE NORMAL 普通文件NULL 没有临时文件属性if hFile INVALID HANDLE VALUE printf Couldnotcreatefile error d n GetLastError return 1 printf Createfilesuccessfully n system pause return0 2 获取文件的大小 调用GetFileSize 函数可以获取文件的大小 函数原型如下 DWORDGetFileSize HANDLEhFile 打开的文件句柄LPDWORDlpFileSizeHigh 获取的文件大小的高32位 函数返回指定文件的大小的低32位 如果返回0 xFFFFFFFF 则表示出现错误 可以调用GetLastError 函数获取错误信息 例5 12 编写程序 获取并输出C myfile txt文件的大小 代码如下 include stdafx h includeint tmain intargc TCHAR argv HANDLEhFile INVALID HANDLE VALUE 文件句柄 打开文件hFile CreateFile C myfile txt GENERIC READ GENERIC WRITE FILE SHARE READ FILE SHARE WRITE NULL OPEN EXISTING FILE FLAG RANDOM ACCESS NULL if hFile INVALID HANDLE VALUE printf Openfileerror n returnfalse 接上 获取文件的大小 LARGE INTEGERliFileLen 文件长度liFileLen LowPart GetFileSize hFile DWORD 3 获取文件时间 调用GetFileTime 函数可以获取文件的创建时间 最后访问时间和最后写时间 函数原型如下 BOOLGetFileTime HANDLEhFile 打开的文件句柄LPFILETIMElpCreationTime 用于接收文件的创建时间LPFILETIMElpLastAccessTime 用于接收文件的最后访问时间LPFILETIMElpLastWriteTime 用于接收文件的最后写时间 如果函数执行成功 则返回一个非0值 否则返回0 可以调用GetLastError 函数获取错误信息 例5 13 编写程序 获取并输出C myfile txt文件的创建时间 最后访问时间和最后写时间 FileTimeToSystemTime 函数 调用FileTimeToSystemTime 函数将FILETIME结构体转换为系统时间 函数原型如下 BOOLFileTimeToSystemTime constFILETIME lpFileTime 待转换的FILETIME结构体对象LPSYSTEMTIMElpSystemTime 转换后的系统时间结构体 SystemTimeToTzSpecificLocalTime 函数 SystemTimeToTzSpecificLocalTime 函数用于将林威治标准时间装换为指定时区的本地时间 函数原型如下 BOOLWINAPISystemTimeToTzSpecificLocalTime inLPTIME ZONE INFORMATIONlpTimeZone 指定时区信息 inLPSYSTEMTIMElpUniversalTime 转换前的系统 林威治标准 时间结构体 outLPSYSTEMTIMElpLocalTime 转换后的系统 本地 时间结构体 GetTimeZoneInformation 函数 调用GetTimeZoneInformation 函数可以获取当前的时区信息 函数原型如下 DWORDGetTimeZoneInformation LPTIME ZONE INFORMATIONlpTimeZoneInformation 用于接收获取的时区信息 SYSTEMTIME结构体 SYSTEMTIME结构体用于保存系统时间 其定义代码如下 typedefstruct SYSTEMTIME WORDwYear 年WORDwMonth 月WORDwDayOfWeek 星期WORDwDay 日WORDwHour 小时WORDwMinute 分WORDwSecond 秒WORDwMilliseconds 微秒 SYSTEMTIME 4 获取文件属性 调用GetFileAttributes 函数可以获取文件的存档 只读 系统 隐藏等属性 函数原型如下 DWORDGetFileAttributes LPCTSTRlpFileName 要获取属性的文件名 如果函数执行成功 则返回一个代表文件属性的DWORD值 否则返回0 xFFFFFFFF 可以调用GetLastError 函数获取错误信息 GetFileAttributes 函数的返回值 例5 14 编写程序 获取并输出C Windows bootstat dat文件的属性 代码如下 include stdafx h includeint tmain intargc TCHAR argv DWORDdwAttr GetFileAttributes C Windows bootstat dat if dwAttr 接上 if dwAttr 5 获取文件的详细信息 调用GetFileInformationByHandle 函数可以获取文件的详细属性 函数原型如下 BOOLGetFileInformationByHandle HANDLEhFile 文件句柄LPBY HANDLE FILE INFORMATIONlpFileInformation 用于接收文件信息 如果函数执行成功 则返回一TRUE 否则返回FALSE LPBY HANDLE FILE INFORMATION结构体 typedefstruct BY HANDLE FILE INFORMATION DWORDdwFileAttributes 文件属性FILETIMEftCreationTime 文件的创建时间FILETIMEftLastAccessTime 文件的最后访问时间FILETIMEftLastWriteTime 文件的最后写入时间DWORDdwVolumeSerialNumber 文件所在卷的序列号DWORDnFileSizeHigh 文件大小的高32位DWORDnFileSizeLow 文件大小的低32位DWORDnNumberOfLinks 文件的链接数 对于FAT文件系统而言 此值一直为1 DWORDnFileIndexHigh 与文件相关的唯一标识符的高32位DWORDnFileIndexLow 与文件相关的唯一标识符的低32位DWORDdwOID 文件的对象标识符 BY HANDLE FILE INFORMATION 例5 15 编写程序 调用GetFileInformationByHandle 函数获取并输出C Windows bootstat dat文件的创建时间 最后访问时间最后写入时间和文件大小 6 设置文件时间 调用SetFileTime 函数可以设置文件的创建时间 最后访问时间和最后写时间 函数原型如下 BOOLSetFileTime HANDLEhFile 打开的文件句柄constFILETIME lpCreationTime 用于接收文件的创建时间constFILETIME lpLastAccessTime 用于接收文件的最后访问时间constFILETIME lpLastWriteTime 用于接收文件的最后写时间 如果函数执行成功 则返回一个非0值 否则返回0 可以调用GetLastError 函数获取错误信息 例5 16 编写程序 设置C myfile txt文件的最后写时间为当前系统时间 代码如下 include stdafx h includeint tmain intargc TCHAR argv SYSTEMTIMEst FILETIMEft GetSystemTime GetSystemTime 函数 调用GetSystemTime 函数获取当前的系统时间 函数原型如下 voidGetSystemTime LPSYSTEMTIMElpSystemTime 勇于接受当前的系统时间 7 设置文件属性 调用SetFileAttributes 函数可以设置文件的存档 只读 系统 隐藏等属性 函数原型如下 BOOLSetFileAttributes LPCTSTRlpFileName 要设置属性的文件名DWORDdwFileAttributes 设置文件的属性 如果函数执行成功 则返回TRUE 否则返回FALSE 可以调用GetLastError 函数获取错误信息 例5 17 编写程序 设置C myile txt文件的属性为只读和隐藏 代码如下 include stdafx h includeint tmain intargc TCHAR argv if SetFileAttributes C myfile txt FILE ATTRIBUTE READONLY FILE ATTRIBUTE HIDDEN DWORDdwerror GetLastError printf ErrorCode d n dwerror else printf SetFileAttributesSuccessfully n system pause return0 8 读取文件的内容 调用ReadFile 函数可以读取文件的内容 函数原型如下 BOOLReadFile HANDLEhFile 要打开的文件句柄LPVOIDlpBuffer 用于接收从文件中读取的数据的缓冲区DWORDnNumberOfBytesToRead 指定要从文件中读取的字节数LPDWORDlpNumberOfBytesRead 实际读取的字节数LPOVERLAPPEDlpOverlapped 目前不支持 设置为NULL 如果函数成功从文件读取数据 则返回TRUE 否则返回FALSE 例5 18 编写程序 读取C myfile txt文件的内容 代码如下 include stdafx h includeint tmain intargc TCHAR argv HANDLEhFile 打开文件hFile CreateFile C myfile txt 文件名GENERIC READ 以可读权限打开文件0 不共享NULL 使用默认的安全属性OPEN EXISTING 如果文件存在则打开FILE ATTRIBUTE NORMAL 普通文件NULL 没有临时文件属性 接上 if hFile INVALID HANDLE VALUE printf Couldnotcreatefile error d n GetLastError return 1 charbuffer 1024 DWORDnBytesRead while true ZeroMemory buffer 1024 清理缓冲区 从文件中读取1024个字符BOOLbResult ReadFile hFile buffer 1024 9 向文件中写入数据 调用WriteFile 函数可以向文件中写入数据 函数原型如下 BOOLWriteFile HANDLEhFile 文件句柄LPCVOIDlpBuffer 用于向文件中写入的数据的缓冲区DWORDnNumberOfBytesToWrite 要向文件中写入的数据大小LPDWORDlpNumberOfBytesWritten 实际写入的字节数LPOVERLAPPEDlpOverlapped 不支持 使用NULL 如果函数成功向文件中写入数据 则返回TRUE 否则返回FALSE 例5 19 编写程序 向C test txt中写入 HelloWorld 代码如下 include stdafx h includeint tmain intargc TCHAR argv HANDLEhFile CreateFile C test txt 文件名GENERIC WRITE 可写权限FILE SHARE WRITE 可写共享模式NULL CREATE ALWAYS 如果文件不存在 则创建FILE ATTRIBUTE NORMAL 设置文件的normal属性NULL 接上 TCHAR pBuffer if INVALID HANDLE VALUE hFile DWORDdwLen sizeof HelloWorld char pBuffer newchar dwLen 1 strcpy pBuffer HelloWorld DWORDdwSize 0 WriteFile hFile pBuffer dwLen 1 10 删除 复制 移动和重命名文件 调用SHFileOperation 函数就可以完成所有这些操作 函数原型如下 intSHFileOperation LPSHFILEOPSTRUCTlpFileOp 结构体SHFILEOPSTRUCT typedefstruct SHFILEOPSTRUCT HWNDhwnd 显示操作状态信息的对话框窗口句柄UINTwFunc 指定要执行的操作LPCWSTRpFrom 指定一个或多个源文件LPCWSTRpTo 指定复制 移动和重命名等操作中的目标文件FILEOP FLAGSfFlags 控制文件操作的标记BOOLfAnyOperationsAborted 不支持LPVOIDhNameMappings 不支持LPCWSTRlpszProgressTitle 指定进度对话框的标题 SHFILEOPSTRUCT LPSHFILEOPSTRUCT wFunc字段的取值 例5 20 编写程序 将C myfile txt复制到D 代码如下 include stdafx h includeboolmyCopyFile char pTo char pFrom SHFILEOPSTRUCTFileOp 0 FileOp fFlags FOF NOCONFIRMATION 不出现确认对话框FOF NOCONFIRMMKDIR 需要时直接创建一个文件夹 不需用户确定FileOp pFrom pFrom FileOp pTo pTo FileOp wFunc FO COPY returnSHFileOperation CopyFile 函数 也可以调用Cop

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论