Windows提高_1.3文件操作

文件操作

  • 不带句柄的文件操作

    // 1. 拷贝文件,第三个参数为 FALSE 表示会覆盖
    // CopyFile(L"D:\1.txt", L"E:\2.txt", FALSE);
    // 2. 移动文件,相当于改名
    // MoveFile(L"D:\1.txt", L"D:\2.txt");
    // 3. 获取文件属性
    WIN32_FILE_ATTRIBUTE_DATA FileInfo = { 0 };
    GetFileAttributesEx(L"D:\2.txt", GetFileExInfoStandard, &FileInfo);
    ​
    // 3.1 判断文件的属性是否是只读
    if (FileInfo.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
        printf("该文件只读");
    else
        printf("该文件可修改");
    ​
    // 4. 删除文件[不要随便用]
    DeleteFile(L"D:\2.txt");
    ​
    // 5. 删除一个目录使用下列函数 RemoveDirectory()
  • 带句柄的文件操作

    // 1. 创建打开文件,返回文件句柄,失败返回 -1
    HANDLE FileHandle = CreateFile(
        L"E:\2.txt",               // 文件的路径
        GENERIC_ALL,                // 表示可以对文件执行任何操作
        NULL,                       // 共享方式,我正在操作的时候,允许其他进程执行的操作
        NULL,                       // 安全属性
        OPEN_EXISTING,              // 始终创建这个文件
        FILE_ATTRIBUTE_NORMAL,      // 普通的文件
        NULL);
    ​
    // 2. 判断是否创建成功
    if (FileHandle == INVALID_HANDLE_VALUE)
    {
        MessageBox(NULL, L"文件创建失败", L"警告", MB_OK);
        ExitProcess(-1);
    }
    ​
    ​
    // 3. 通过句柄读取文件
    // 参数一: 文件的句柄
    // 参数二: 读取到的数据存放到哪里
    // 参数三: 需要读取多少数据(字节)
    // 参数四: 读取成功了多少数据
    // 参数五: 重叠 IO 结构,暂时用不到
    DWORD RealRead = 0;
    CHAR Buffer[0x100] = { 0 };
    BOOL ReadSucess =  ReadFile(FileHandle, 
                                Buffer, 100, &RealRead, NULL);
    if (ReadSucess == TRUE) printf("%s
    ", Buffer);
    ​
    // 4. 设置获取偏移
    SetFilePointer(FileHandle, 0, 0, FILE_BEGIN);
    ​
    // 4. 写入文件
    // 参数一: 文件的句柄
    // 参数二: 想要写入的数据
    // 参数三: 需要写入多少数据(字节)
    // 参数四: 写入成功了多少数据
    // 参数五: 重叠 IO 结构,暂时用不到
    DWORD RealWrite = 0;
    WriteFile(FileHandle, "abcdef", 6, &RealWrite, NULL);
    ​
    // 7. 设置文件的结束位置为当前文件指针的位置
    SetFilePointer(FileHandle, 2, 0, FILE_BEGIN);
    SetEndOfFile(FileHandle);
    ​
    // 5. 获取大小
    int LowSize = GetFileSize(FileHandle, NULL);
  • 文件的遍历

    // 递归遍历文件: 
    VOID File(LPCWSTR FilePath)
    {
        // 1. 拼接想要遍历的路径
        wstring FindPath = wstring(FilePath)+ L"\*";
    ​
        // 提供结构体用于保存遍历到的信息
        WIN32_FIND_DATA FileInfo = { 0 };
    ​
        // 尝试遍历第一个文件文件夹
        HANDLE FindHande = FindFirstFile(FindPath.c_str(), &FileInfo);
    ​
        // 如果遍历成功,则输出信息并继续遍历
        if (FindHande != INVALID_HANDLE_VALUE)
        {
            do {
                // 判断是否是一个目录
                if (FileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                {
                    // 判断文件夹是否是 . 和 ..,排除掉进行递归
                    if (wcscmp(L".", FileInfo.cFileName) &&
                        wcscmp(L"..", FileInfo.cFileName))
                    {
                        // 使用函数进行递归遍历
                        printf("[目录]: %ls
    ", FileInfo.cFileName);
    ​
                        // 拼接新的路径,下一层需要查找的路径
                        wstring newpath = wstring(FilePath) + L"\" + FileInfo.cFileName;
                    
                        // 递归调用函数
                        File(newpath.c_str());
                    }
                }
                else
                {
                    // 输出文件名
                    printf("[文件]: %ls ", FileInfo.cFileName);
    ​
                    // 输出文件的创建时间
                    FILETIME LocalFileTime = { 0 };
                    FileTimeToLocalFileTime(&FileInfo.ftCreationTime, &LocalFileTime);
    ​
                    // 转换时间戳为系统时间
                    SYSTEMTIME SystemTime = { 0 };
                    FileTimeToSystemTime(&LocalFileTime, &SystemTime);
    ​
                    // 输出时间日期
                    printf("%d 年 %d 月 %d 日 %d 时 %d 分 %d 秒
    ",
                        SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay,
                        SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond);
                }
    ​
            } while (FindNextFile(FindHande, &FileInfo));
        }
    }
    ​
  •  

原文地址:https://www.cnblogs.com/ltyandy/p/10932765.html