C++ 文件大小、读写、追加 基础封装代码

头文件

ubase-fs.h:

#pragma once
//Windows Api
#include <windows.h>
//C++ Standard Library
#include <string>

typedef std::basic_string<TCHAR> tstring;

namespace UBASE
{
    DWORD            FsGetFileSize(const tstring& FilePath);
    DWORD64            FsGetFileSize64(const tstring& FilePath);
    bool            FsReadFileData(const tstring& FilePath, std::string& Data);
    bool            FsReadFileData(const tstring& FilePath, std::string& Data, DWORD ReadSize, DWORD64 FileOffset = 0);
    bool            FsWriteFileData(const tstring& FilePath, std::string Data, DWORD64 FileOffset = 0);
    bool            FsAppendFileData(const tstring& FilePath, const std::string& Data);
}

源文件

ubase-fs.cpp:

#include "ubase-fs.h"

namespace UBASE
{
#ifndef MAKELONGLONG
#define MAKELONGLONG(a, b) ((LONGLONG(DWORD(a) & 0xFFFFFFFF) << 32 ) | LONGLONG(DWORD(b) & 0xFFFFFFFF))
#endif

#ifndef LONGLONGHIGH
#define LONGLONGHIGH(a) DWORD((LONGLONG(a) & 0xFFFFFFFF00000000UI64) >> 32)
#endif

#ifndef LONGLONGLOW
#define LONGLONGLOW(a) DWORD(LONGLONG(a) & 0xFFFFFFFFUI64)
#endif

    DWORD FsGetFileSize(const tstring& FilePath)
    {
        HANDLE fd = CreateFile(FilePath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (fd == INVALID_HANDLE_VALUE) {
            return 0;
        }

        DWORD lo_size = GetFileSize(fd, NULL);
        if (lo_size == INVALID_FILE_SIZE) {
            CloseHandle(fd);
            return 0;
        }
        CloseHandle(fd);
        return lo_size;
    }

    DWORD64 FsGetFileSize64(const tstring& FilePath)
    {
        HANDLE fd = CreateFile(FilePath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (fd == INVALID_HANDLE_VALUE) {
            return 0;
        }
        DWORD hi_size = 0;
        DWORD lo_size = GetFileSize(fd, &hi_size);
        if (lo_size == INVALID_FILE_SIZE) {
            CloseHandle(fd);
            return 0;
        }
        CloseHandle(fd);
        return MAKELONGLONG(hi_size, lo_size);
    }

    bool FsReadFileData(const tstring& FilePath, std::string& Data)
    {
        bool Result = false;
        DWORD FileSize = 0;
        HANDLE File = CreateFile(FilePath.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
        if (File == INVALID_HANDLE_VALUE)
        {
            return false;
        }
        FileSize = GetFileSize(File, NULL);
        if (FileSize != INVALID_FILE_SIZE)
        {
            if (FileSize == 0) {
                Result = true;
            }
            else {
                char* Buffer = new(std::nothrow) char[FileSize];
                if (Buffer != NULL)
                {
                    DWORD ReadLen;
                    if (ReadFile(File, Buffer, FileSize, &ReadLen, NULL))
                    {
                        if (ReadLen == FileSize) {
                            try {
                                Data.assign(Buffer, FileSize);
                                Result = true;
                            }
                            catch (...) {
                                Data.clear();
                            }
                        }
                    }
                    delete[] Buffer;
                }
            }
        }
        CloseHandle(File);
        return Result;
    }

    bool FsReadFileData(const tstring& FilePath, std::string& Data, DWORD ReadSize, DWORD64 FileOffset)
    {
        bool Result = false;
        HANDLE File = CreateFile(FilePath.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
        if (File == INVALID_HANDLE_VALUE)
        {
            return false;
        }

        LONG low = LONGLONGHIGH(FileOffset);
        SetFilePointer(File, LONGLONGLOW(FileOffset), &low, FILE_BEGIN);
        char* Buffer = new(std::nothrow) char[ReadSize];
        if (Buffer != NULL)
        {
            DWORD ReadLen;
            if (ReadFile(File, Buffer, ReadSize, &ReadLen, NULL))
            {
                if (ReadLen == ReadSize) {
                    try {
                        Data.assign(Buffer, ReadSize);
                        Result = true;
                    }
                    catch (...) {
                        Data.clear();
                    }
                }
            }
            delete[] Buffer;
        }
        CloseHandle(File);
        return Result;
    }


    bool FsWriteFileData(const tstring& FilePath, std::string Data, DWORD64 FileOffset)
    {
        bool Result = false;
        HANDLE File = CreateFile(FilePath.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        if (File != INVALID_HANDLE_VALUE)
        {
            DWORD WriteLen = 0;
            LONG low = LONGLONGHIGH(FileOffset);
            SetFilePointer(File, LONGLONGLOW(FileOffset), &low, FILE_BEGIN);
            if (WriteFile(File, Data.data(), (DWORD)Data.size(), &WriteLen, NULL)) {
                if (Data.size() == WriteLen) {
                    Result = true;
                }
            }
            CloseHandle(File);
        }
        return Result;
    }

    bool FsAppendFileData(const tstring& FilePath, const std::string& Data)
    {
        bool Result = false;
        HANDLE File = CreateFile(FilePath.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        if (File != INVALID_HANDLE_VALUE)
        {
            DWORD WriteLen;
            SetFilePointer(File, 0, NULL, FILE_END);
            if (WriteFile(File, Data.c_str(), (DWORD)Data.size(), &WriteLen, NULL)) {
                if (Data.size() == WriteLen) {
                    Result = true;
                }
            }
            CloseHandle(File);
        }
        return Result;
    }
}

测试代码:

#include "ubase-fs.h"

int main()
{
    tstring FilePath = _T("test.txt");

    //写文件
    UBASE::FsWriteFileData(FilePath, "123");

    //文件大小
    DWORD Size = UBASE::FsGetFileSize(FilePath);
    printf("%d\n", Size);

    //读文件    
    std::string FileData;
    UBASE::FsReadFileData(FilePath, FileData);
    printf("FileData:%s\n", FileData.c_str());

    //追加文件
    UBASE::FsAppendFileData(FilePath, "456");

    //写文件 二进制
    std::string Data;
    Data.append(10, 0x1);
    UBASE::FsWriteFileData(FilePath, Data);

    system("pause");
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值