WIN32核心编程 - 文件系统 - 文件操作 - 目录操作

目录

文件系统基本概念

文件操作(基本)

文件操作(属性)


文件系统基本概念

  • 文件(File):计算机中存储数据的基本单位。文件可以是文本文件、图像文件、音频文件、视频文件等,每个文件都有一个唯一的文件名。

  • 目录(Directory):也称为文件夹,用于组织和存储文件。目录可以包含文件和其他目录,形成文件系统的层次结构。

  • 文件系统的层次结构

    • 层次结构(Hierarchy):文件系统中文件和目录之间的组织关系形成了层次结构,通常是树状结构,其中根目录是顶层目录,包含其他目录和文件,而子目录可以包含更多的子目录和文件。

文件操作(基本)

  • 创建文件
    • 在Windows系统中,可以使用 C++ 的标准库函数来创建文件,也可以使用 Windows API 如 CreateFile()。
  • 打开和关闭文件
    • 文件在使用前必须打开,并在使用完后关闭以释放系统资源。Windows API 提供了CreateFile()函数来打开或创建文件,并使用CloseHandle()来关闭文件。
  • 读取和写入文件内容
    • 文件内容的读取和写入可以通过标准C++库中的fstream类或Windows API的ReadFile()WriteFile()函数实现。

    • 在一个文件中设置当前的读写位置SetFilePointer

    • 针对一个打开的文件,将当前文件位置设为文件末尾SetEndOfFile

  • 复制文件 - CopyFile 函数用于复制文件。
    • #include <windows.h>
      #include <iostream>
      
      void CopyFileExample() {
          const char* sourceFile = "source.txt";
          const char* destinationFile = "destination.txt";
          if (CopyFileA(sourceFile, destinationFile, FALSE)) {
              std::cout << "File copied successfully." << std::endl;
          } else {
              std::cerr << "Failed to copy file. Error code: " << GetLastError() << std::endl;
          }
      }
      
  • 移动文件 - MoveFile 或 MoveFileEx 函数用于移动文件。
    • #include <windows.h>
      #include <iostream>
      
      void MoveFileExample() {
          const char* sourceFile = "source.txt";
          const char* destinationFile = "destination.txt";
          if (MoveFileA(sourceFile, destinationFile)) {
              std::cout << "File moved successfully." << std::endl;
          } else {
              std::cerr << "Failed to move file. Error code: " << GetLastError() << std::endl;
          }
      }
      
  • 删除文件 - DeleteFile 函数用于删除文件。
    • #include <windows.h>
      #include <iostream>
      
      void DeleteFileExample() {
          const char* fileToDelete = "source.txt";
          if (DeleteFileA(fileToDelete)) {
              std::cout << "File deleted successfully." << std::endl;
          } else {
              std::cerr << "Failed to delete file. Error code: " << GetLastError() << std::endl;
          }
      }
      
  • 示例代码
  • #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中,可以使用GetFileAttributesSetFileAttributes函数获取和设置文件的属性。

    • 只读(Read-only):该文件不可被修改。

    • 隐藏(Hidden):该文件在默认情况下不显示。

    • 系统(System):表示文件是系统文件,这通常表示操作系统用于内部用途的文件。

    • 存档(Archive):用于备份和恢复操作,表明文件自上次备份后已被修改。

  • 文件时间戳
    • 可以通过GetFileTimeSetFileTime函数来获取和设置这些时间戳。

    • 可以通过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;
    }

  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值