实验名称 文件管理 日期 2020年 05 月27 日
一、实验目的:
了解文件系统的内部结构,掌握文件的基本操作方法。
基本掌握编程对文件进行处理的方法。
二、实验环境:
Windows10+VisualC++6.0
三、实验内容:
PART 1 验证部分
(1)在教育在线平台下载文件file_ex1,运行程序,读懂核心的程序语句。
(2)在教育在线平台下载文件file_ex2,运行程序,读懂核心的程序语句。
(3)查阅资料,了解以下函数的使用方法。
FindFirstFile()、FindClose()、SetFileAttributes()、FindNextFile()
FindFirstFile():根据文件名查找文件。该函数到一个文件夹(包括子文件夹)去搜索指定文件 如果要使用附加属性去搜索文件的话 可以使用FindFirstFileEx函数。返回值:Long,如执行成功,返回一个搜索句柄。如果出错,返回一个INVALID_HANDLE_VALUE常数,一旦不再需要,应该用FindClose函数关闭这个句柄。
FindClose():用于释放由FindFirst分配的内存,可以停止一个FindFirst/FindNext序列。返回值:Long,非零表示成功,零表示失败。可利用GetLastError来得到错误信息
SetFileAttributes():设置文件属性,返回值:Long,非零表示成功,零表示失败。
FindNextFile():可以用来遍历目录或文件时,判断当前目录下是否有下一个目录或文件。返回值:Long,如执行成功,返回TRUE。否则为FALSE。
(4)在file_ex2程序中,增加功能,输出目录、文件的创建时间。
代码:
#include <iostream>
#include <string>
#include <windows.h>
#include<time.h>
#define _SECOND ((int64) 10000000)
#define _MINUTE (60 * _SECOND)
#define _HOUR (60 * _MINUTE)
#define _DAY (24 * _HOUR)
SYSTEMTIME a;
using namespace std;
void Move(char *);
int main(void)
{
char sPath[100] = "D:\\Desktop\\高级英语";
Move(sPath);
getchar();
return 0;
}
void Move( char *sPath)
{
HANDLE hFind;
WIN32_FIND_DATA findData; ;
char sPathLast[100];
strcpy(sPathLast,sPath);
if (!SetCurrentDirectory(sPathLast))
{
cout << " 不存在该文件夹!" << endl;
return ;
}
hFind = FindFirstFile("*",&findData); //参数1:char *类型,"*"表示通配符,可以查找文件、文件夹
if(hFind == INVALID_HANDLE_VALUE)
{
cout << " 遍历失败!" << endl;
return ;
}
do
{
if(strcmp(findData.cFileName, ".") == 0 || strcmp(findData.cFileName, "..") == 0) //过滤本级目录和父目录
continue;
if(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //子文件夹
{
char sAddPath[100];
strcpy(sAddPath,sPath);
strcat(sAddPath, "\\");
strcat(sAddPath, findData.cFileName);
cout << "目录:" <<sPath<< endl;
Move(sAddPath); //递归遍历
}
else
{
char sAddPath[100];
strcpy(sAddPath,sPath);
strcat(sAddPath, "\\");
strcat(sAddPath, findData.cFileName);
cout << "文件:" << sAddPath << endl;
}
}while(FindNextFile(hFind, &findData)); //没有找到文件或文件夹
FileTimeToSystemTime(&findData.ftCreationTime, &a);
cout << a.wYear << "."<<a.wMonth << "."<<a.wDay <<"."<< a.wHour+8 << "."<< a.wMinute << endl;
}
程序运行截图:
(5) 编写程序,将指定文件的某个属性进行修改,属性可以是创建时间、最近一次访问时间以及最近一次修改的时间等基本属性中任意一个。
#include <iostream>
#include <string>
#include <windows.h>
#include<time.h>
SYSTEMTIME createTime;
FILETIME ftCreationTime; // 文件创建时间
using namespace std;
void Move(char *);
int main(void)
{
char sPath[100] = "D:\\Desktop\\高级英语";
Move(sPath);
getchar();
return 0;
}
void Move( char *sPath)
{
HANDLE hFind;
WIN32_FIND_DATA findData;
HANDLE filename = FindFirstFile("D:\\Desktop\\高级英语",&findData);
filename = CreateFile("D:\\Desktop\\高级英语\\test.txt", FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
GetSystemTime(&createTime);
createTime.wDay = 7; //changes the day
createTime.wMonth = 5; //changes the month
createTime.wYear = 2020; //changes the year
createTime.wHour = 18; //changes the hour
createTime.wMinute = 1; //changes the minute
createTime.wSecond = 6; //changes the second
SystemTimeToFileTime(&createTime, &ftCreationTime);
SetFileTime(filename, &ftCreationTime, NULL, NULL);
CloseHandle(filename);
}
截图:
相关知识:
typedef struct _WIN32_FIND_DATA
{
DWORD dwFileAttributes; //文件属性
FILETIME ftCreationTime; // 文件创建时间
FILETIME ftLastAccessTime; // 文件最后一次访问时间
FILETIME ftLastWriteTime; // 文件最后一次修改时间
DWORD nFileSizeHigh; // 文件长度高32位
DWORD nFileSizeLow; // 文件长度低32位
DWORD dwReserved0; // 系统保留
DWORD dwReserved1; // 系统保留
TCHAR cFileName[ MAX_PATH ];
// 长文件名(最多可达 255 个字符的长文件名),带句点和扩展名
TCHAR cAlternateFileName[ 14 ];
//8.3格式文件名(句点前最多有8个字符,而扩展名最多可以有3个字符)
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;
PART 2 设计部分
编写程序,实现指定文件的复制功能。输入一个文件名,若文件存在,则实现复制,否则给出相应的提示。
代码:
#include<iostream>
#include<windows.h>
#include<string>
using namespace std;
int main(void){
DWORD c;
string a;
string b;
cout<<"输入要复制的文件,用C:\\这样的形式输入"<<endl;
cin>>a;// D:\\文件名.文件格式
cin>>b;// 复制到C:\\文件名,格式
bool i;
i=CopyFile(a.c_str(),b.c_str(),false);
if(i==true){
cout<<"文件复制成功!"<<endl;
}else{
c = GetLastError();
switch(c) {
case ERROR_FILE_NOT_FOUND:
printf("源文件不存在 \n");
printf("Error: %ld \n", c);
break;
default:
printf("目标文件已经存在 \n");
printf("Error: %ld \n", c);
break;
}
}
}
截图:
四、心得体会:
1、了解了文件系统的内部结构,掌握了文件的基本操作方法。
2、基本掌握编程对文件进行处理的方法。