Project2: 文件同步工具 (2)
-
Upload
hope-shelton -
Category
Documents
-
view
46 -
download
7
description
Transcript of Project2: 文件同步工具 (2)
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 命令
• int stat(const char * file_name, struct stat *buf);• 与 linux 下 lstat 函数使用类似
使用举例#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;
}
方法 2 :• Windows API 函数
• FindFirstFile
• FindNextFile
• FindClose
• GetFileTime
Findfirstfile• 查找指定目录的第一个文件或目录并返回它的句柄• 函数原型 :
HANDLE FindFirstFile(LPCTSTR lpFileName, // 目录名LPWIN32_FIND_DATA lpFindFileData // 数据缓冲区
);• 参数 :
lpFileName:指向字符串的指针用于指定一个有效的目录。lpFindFileData:指向一个WIN32_FIND_DATA的指针,用于存放找到文件或目录的信息。
• 返回值如果成功,则返回找到文件或目录的句柄。在 FindNextFile和
FindClose函数中会用到此句柄。如果失败,返回 INVALID_HANDLE_VALUE。要获得更多的信息调
用 GetLastError函数。• 注:指定目录的形式应该为 "..\\abc\\*.*" 就是在 abc目录中找第一个文件或目录。
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;
FindNextFile
• 参数说明• HANDLE hFindFile
• 搜索的文件句柄 函数执行的时候搜索的是此句柄的下一文件• LPWIN32_FIND_DATA lpFindFileData
• 指向一个用于保存文件信息的结构体
• 返回值• 非零表示成功,零表示失败。
BOOL FindNextFile(HANDLE hFindFile, //searchhandleLPWIN32_FIND_DATA lpFindFileData //databuffer
);
FindClose
• 功能:关闭 FindFirstFile创建的搜索句柄
• 参数:• HANDLE hFindFile FindFirstFile 创建的句柄
BOOL FindClose(HANDLE hFindFile // file search handle
);
程序举例#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;}
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 );
编程实践:图书管理程序• 最简单的图书管理系统
• 提供图书查询、插入、编辑、删除的功能
• 要求:• 分为 3 个模块 ( 每个模块一个单独的 c/cpp 文件)
• 界面显示• 数据的加载和存储模块• 查询
• 目的• 练习 linux 下编写 C/C++ 普通程序• 练习编写多文件的程序• 能够简单的使用 makefile
示例
多文件 C 程序• 模块化设计
• 大程序自上向下进行功能分解,分成若干个子模块,模块有自己的界面,有相关的操作,完成独立的功能。各模块可以分别由不同的人员编写,最后,将不同的模块组装成一个完整的程序。在 C 语言中,用函数实现功能模块的定义,一个完整的 C 程序可以由多个源程序文件组成,一个文件中可以包含多个函数
• 节约编译时间• 修改了个别源代码文件后,只需重新编译修改过的文件及受它影响的文件,
并再次连接即可,而不需要重新编译不受影响的文件。这样就可以节约不少编译时间。
一个最简单的多文件程序示例
例程说明• 程序包含三个文件
• main.c• add.h• add.c
• 头文件 – add.h• 头文件中一般定义了函数的声明、结构体的定义、宏
定义。 ( 常量和全局变量最好放到源文件中 )• 头文件中放函数的声明,函数由源文件实现:接口和
实现分开• 头文件可通过宏定义来保证类定义、结构体定义、宏
定义的唯一性。确实很方便,不容易出错。
add.h
• #ifndef … #define … #endif• 条件编译指令• 防止重复包含相同的内容
课后作业• 编写图书管理程序
• 多文件• 要有头文件• 写 makefile
期末安排• 6月 5日:
• 上课时间, HTML5 大作业答辩• 地点:机房
• 6月 12日:• 上机时间,随堂测验
• 上机编程• 1 ~ 2 题• Project2 或者图书管理系统的子任务, YOJ 上提交
• 占总评的 30%
简易 Makefile
• 示例• 3 个头文件• 8 个 c 文件
简易 Makefile (2)
简易 Makefile( 3 )