文件管理

实验介绍了如何在Windows环境下使用C++进行文件系统操作,包括文件和目录的遍历、文件属性的获取与修改。通过FindFirstFile、FindNextFile、SetFileAttributes等函数,实现了文件创建时间的显示及文件属性的变更。此外,还提供了文件复制功能的代码实现,能够根据用户输入复制文件并处理相应错误情况。
摘要由CSDN通过智能技术生成

实验名称        文件管理                          日期 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、基本掌握编程对文件进行处理的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值