- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
文件系统基本概念
文件操作(基本)
文件操作(属性)
文件系统基本概念
-
文件(File):计算机中存储数据的基本单位。文件可以是文本文件、图像文件、音频文件、视频文件等,每个文件都有一个唯一的文件名。
-
目录(Directory):也称为文件夹,用于组织和存储文件。目录可以包含文件和其他目录,形成文件系统的层次结构。
-
文件系统的层次结构
-
层次结构(Hierarchy):文件系统中文件和目录之间的组织关系形成了层次结构,通常是树状结构,其中根目录是顶层目录,包含其他目录和文件,而子目录可以包含更多的子目录和文件。
-
文件操作(基本)
- 创建文件
- 在Windows系统中,可以使用 C++ 的标准库函数来创建文件,也可以使用 Windows API 如 CreateFile()。
- 打开和关闭文件
- 文件在使用前必须打开,并在使用完后关闭以释放系统资源。Windows API 提供了CreateFile()函数来打开或创建文件,并使用CloseHandle()来关闭文件。
- 读取和写入文件内容
-
文件内容的读取和写入可以通过标准C++库中的fstream类或Windows API的
ReadFile()
和WriteFile()
函数实现。 -
在一个文件中设置当前的读写位置
SetFilePointer
。 -
针对一个打开的文件,将当前文件位置设为文件末尾
SetEndOfFile
。
-
- 复制文件 - CopyFile 函数用于复制文件。
- 移动文件 - MoveFile 或 MoveFileEx 函数用于移动文件。
- 删除文件 - DeleteFile 函数用于删除文件。
- 示例代码
-
#include <iostream> #include <Windows.h> int main() { const char* FileName = "D:\\Test.txt"; const char* outPutData = "Hello 0xCC"; char szBuffer[0xFF] = { 0 }; DWORD dwWriteBytes = 0; DWORD dwReadBytes = 0; HANDLE hFile = NULL; // 创建或者打开文件 hFile = CreateFileA( FileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { if (GetLastError() == ERROR_FILE_EXISTS) std::cout << "ERROR_FILE_EXISTS" << std::endl; return 1; } // 写入文件数据内容 if (!WriteFile(hFile, outPutData, strlen(outPutData), &dwWriteBytes, NULL)) { std::cout << "WriteFile -> " << GetLastError() << std::endl; CloseHandle(hFile); return 2; } // 读取文件数据内存 SetFilePointer(hFile, 0, NULL, FILE_BEGIN); if (!ReadFile(hFile, szBuffer, 0xFF, &dwReadBytes, NULL)) { std::cout << "ReadFile -> " << GetLastError() << std::endl; CloseHandle(hFile); return 3; } CloseHandle(hFile); return 0; }
文件操作(属性)
- 文件属性和元数据是文件系统提供的数据,用于描述文件的特性和状态。属性可以包括文件的只读状态、隐藏状态、系统状态等,而元数据可以包括文件的创建、修改和访问时间。
-
在Windows中,可以使用
GetFileAttributes
和SetFileAttributes
函数获取和设置文件的属性。 -
只读(Read-only):该文件不可被修改。
-
隐藏(Hidden):该文件在默认情况下不显示。
-
系统(System):表示文件是系统文件,这通常表示操作系统用于内部用途的文件。
-
存档(Archive):用于备份和恢复操作,表明文件自上次备份后已被修改。
-
- 文件时间戳
-
可以通过
GetFileTime
和SetFileTime
函数来获取和设置这些时间戳。 -
可以通过
CompareFileTime
来判断文件时间是否相同。 -
创建时间:文件被创建的时间。
-
修改时间:文件最后被修改的时间。
-
访问时间:文件最后被访问的时间。
-
- 文件大小
- 可以通过GetFileSize/GetFileSizeEx来获取指定文件的大小。
-
#include <iostream> #include <Windows.h> int main() { HANDLE hFile = CreateFile( L"D:\\Debug\\WinHex_v20.3_SR-5_x86_x64.exe", GENERIC_ALL, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); LARGE_INTEGER li = { 0 }; GetFileSizeEx(hFile, &li); return 0; }
- 对象类型
- 可以使用GetFileType确定打开的文件(设备)的类型。
-
#include <iostream> #include <Windows.h> int main() { HANDLE hFile = CreateFile( L"D:\\Debug\\WinHex_v20.3_SR-5_x86_x64.exe", GENERIC_ALL, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); DWORD dwType = GetFileType(hFile); return 0; }
- 文件路径
- 可以使用GetFullPathName指定文件的完整路径
-
TCHAR szBuffer[MAX_PATH] = { 0 }; GetFullPathName(L"0xCC.exe", MAX_PATH, szBuffer, NULL);
- 示例代码
-
#include <iostream> #include <Windows.h> int main() { const char* FilePath = "D:\\Test.txt"; // 获取文件属性 DWORD dwAttribute = GetFileAttributesA(FilePath); std::cout << std::hex << dwAttribute << std::endl; // 获取文件时间 HANDLE hFile = CreateFileA( FilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (hFile == INVALID_HANDLE_VALUE) return 1; FILETIME CreateTime, AccessTime, WriteTime; GetFileTime(hFile, &CreateTime, &AccessTime, &WriteTime); SYSTEMTIME sysTime = { 0 }; FileTimeToSystemTime(&CreateTime, &sysTime); FileTimeToSystemTime(&AccessTime, &sysTime); FileTimeToSystemTime(&WriteTime, &sysTime); return 0; }