Project2: 文件同步工具 (2)

24
Project2: 文文文文文文 (2)

description

Project2: 文件同步工具 (2). 其他问题. 移植到 windows 平台 linux 下的 API 换成 windows 平台的相应 API. 提高要求:移植到 windows 平台. 基本思路 Linux 下的函数换 成 windows 平台的相应函数 方法 1 : DOS 命令 方法 2 : API 调用. 方法 1 :. int system(char *command); c 的标准库中, #include < stdio.h > #include < stdlib.h > 发出一个 DOS 命令 - PowerPoint PPT Presentation

Transcript of Project2: 文件同步工具 (2)

Page 1: Project2:  文件同步工具 (2)

Project2: 文件同步工具 (2)

Page 2: Project2:  文件同步工具 (2)

其他问题• 移植到 windows 平台

• linux 下的 API 换成 windows 平台的相应API

Page 3: Project2:  文件同步工具 (2)

提高要求:移植到 windows 平台

• 基本思路

• Linux 下的函数换成 windows 平台的相应函数

• 方法 1 : DOS 命令

• 方法 2 : API 调用

Page 4: Project2:  文件同步工具 (2)

方法 1 :• int system(char *command);

• c 的标准库中, #include <stdio.h> #include <stdlib.h>

• 发出一个 DOS 命令

• int stat(const char * file_name, struct stat *buf);• 与 linux 下 lstat 函数使用类似

Page 5: Project2:  文件同步工具 (2)

使用举例#include <stdlib.h> #include <stdio.h>#include <sys/stat.h> int main( ) {

struct stat status;printf("About to spawn command.com and

run a DOS command\n"); system("dir");

printf("About to get file size\n");stat(”.\\test.cpp”, &status);printf("%d\n”, status.st_size);return 0;

}

Page 6: Project2:  文件同步工具 (2)

方法 2 :• Windows API 函数

• FindFirstFile

• FindNextFile

• FindClose

• GetFileTime

Page 7: Project2:  文件同步工具 (2)

Findfirstfile• 查找指定目录的第一个文件或目录并返回它的句柄• 函数原型 :

HANDLE FindFirstFile(LPCTSTR lpFileName, // 目录名LPWIN32_FIND_DATA lpFindFileData // 数据缓冲区

);• 参数 :

lpFileName:指向字符串的指针用于指定一个有效的目录。lpFindFileData:指向一个WIN32_FIND_DATA的指针,用于存放找到文件或目录的信息。

• 返回值如果成功,则返回找到文件或目录的句柄。在 FindNextFile和

FindClose函数中会用到此句柄。如果失败,返回 INVALID_HANDLE_VALUE。要获得更多的信息调

用 GetLastError函数。• 注:指定目录的形式应该为 "..\\abc\\*.*" 就是在 abc目录中找第一个文件或目录。

Page 8: Project2:  文件同步工具 (2)

WIN32_FIND_DATA 的结构中包含很多文件或目录的有用信息,后面的程序或许会用到。该结构如下:

typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; TCHAR cFileName[ MAX_PATH ]; TCHAR cAlternateFileName[ 14 ];

} WIN32_FIND_DATA, *PWIN32_FIND_DATA;

Page 9: Project2:  文件同步工具 (2)

FindNextFile

• 参数说明• HANDLE hFindFile

• 搜索的文件句柄 函数执行的时候搜索的是此句柄的下一文件• LPWIN32_FIND_DATA lpFindFileData

• 指向一个用于保存文件信息的结构体

• 返回值• 非零表示成功,零表示失败。

BOOL FindNextFile(HANDLE hFindFile, //searchhandleLPWIN32_FIND_DATA lpFindFileData //databuffer

);

Page 10: Project2:  文件同步工具 (2)

FindClose

• 功能:关闭 FindFirstFile创建的搜索句柄

• 参数:• HANDLE hFindFile FindFirstFile 创建的句柄

BOOL FindClose(HANDLE hFindFile // file search handle

);

Page 11: Project2:  文件同步工具 (2)

程序举例#include <stdio.h>#include <windows.h>int main( ){ WIN32_FIND_DATA FileData; HANDLE hSearch = NULL; BOOL unfinished= TURE;

hSearch = FindFirstFile("*.*", &FileData); // find for all files if(hSearch == INVALID_HANDLE_VALUE) return; // No file found while(unfinished) { puts(FileData.cFileName); // print file name unfinished = FindNextFile(hSearch, &FileData); // find next file } FindClose(hSearch); // finish searching return 0;}

Page 12: Project2:  文件同步工具 (2)

GetFileTime

• 返回的文件时间采用 UTC 格式

• 可以使用 FileTimeToSystemTime 方法,将文件时间转换为系统时间格式。

BOOL GetFileTime(HANDLE hFile, // identifies the

file LPFILETIME lpCreationTime, // address of creation timeLPFILETIME lpLastAccessTime, // address of last access

time LPFILETIME lpLastWriteTime // address of last write

time );

Page 13: Project2:  文件同步工具 (2)

编程实践:图书管理程序• 最简单的图书管理系统

• 提供图书查询、插入、编辑、删除的功能

• 要求:• 分为 3 个模块 ( 每个模块一个单独的 c/cpp 文件)

• 界面显示• 数据的加载和存储模块• 查询

• 目的• 练习 linux 下编写 C/C++ 普通程序• 练习编写多文件的程序• 能够简单的使用 makefile

Page 14: Project2:  文件同步工具 (2)

示例

Page 15: Project2:  文件同步工具 (2)

多文件 C 程序• 模块化设计

• 大程序自上向下进行功能分解,分成若干个子模块,模块有自己的界面,有相关的操作,完成独立的功能。各模块可以分别由不同的人员编写,最后,将不同的模块组装成一个完整的程序。在 C 语言中,用函数实现功能模块的定义,一个完整的 C 程序可以由多个源程序文件组成,一个文件中可以包含多个函数

• 节约编译时间• 修改了个别源代码文件后,只需重新编译修改过的文件及受它影响的文件,

并再次连接即可,而不需要重新编译不受影响的文件。这样就可以节约不少编译时间。

Page 16: Project2:  文件同步工具 (2)

一个最简单的多文件程序示例

Page 17: Project2:  文件同步工具 (2)
Page 18: Project2:  文件同步工具 (2)

例程说明• 程序包含三个文件

• main.c• add.h• add.c

• 头文件 – add.h• 头文件中一般定义了函数的声明、结构体的定义、宏

定义。 ( 常量和全局变量最好放到源文件中 )• 头文件中放函数的声明,函数由源文件实现:接口和

实现分开• 头文件可通过宏定义来保证类定义、结构体定义、宏

定义的唯一性。确实很方便,不容易出错。

Page 19: Project2:  文件同步工具 (2)

add.h

• #ifndef … #define … #endif• 条件编译指令• 防止重复包含相同的内容

Page 20: Project2:  文件同步工具 (2)

课后作业• 编写图书管理程序

• 多文件• 要有头文件• 写 makefile

Page 21: Project2:  文件同步工具 (2)

期末安排• 6月 5日:

• 上课时间, HTML5 大作业答辩• 地点:机房

• 6月 12日:• 上机时间,随堂测验

• 上机编程• 1 ~ 2 题• Project2 或者图书管理系统的子任务, YOJ 上提交

• 占总评的 30%

Page 22: Project2:  文件同步工具 (2)

简易 Makefile

• 示例• 3 个头文件• 8 个 c 文件

Page 23: Project2:  文件同步工具 (2)

简易 Makefile (2)

Page 24: Project2:  文件同步工具 (2)

简易 Makefile( 3 )